Tópicos
Preâmbulo
Linux é um sistema operativo gratuito e open-source, possível de ser executado em diferentes arquiteturas com diferentes distribuições. O mesmo segue um modelo, na sua maioria, DAC.
Controlo de Acesso ao FS
Subject
- Um humano real ou um utilizador virtual
- Um processo executa sempre como um subject
Object
- Um ficheiro ou diretoria
- Pertence a um utilizador ou grupo
- Ownership só pode ser alterada pelo root user
Action
- Ler (r), escrever (w) e executar (x)
- Diferentes semânticas para ficheiros e diretorias
Access Control Metadata
- Cada ficheiro possui uma ACL, gerida pelo correspondente owner
- Possibilidade de definir cada ação (r, w, x) para cada um dos seguintes:
- Owner do objeto (u)
- Um utilizador pertencente ao grupo que manda no objeto (g)
- Qualquer outro utilizador (o)
Utilizadores, Grupos e Passwords
Um utilizador é identificado pelo seu id (uid) e um grupo também (gid). Existem grupos primários e grupos secundários.
$ id
uid=1000(rui) gid=1000(rui) groups=1000(rui),90(network),108(vboxusers),...
Neste caso, o grupo primário é rui
e os restantes são secundários.
É possível visualizar todos os utilizadores do SO através do comando cat /etc/passwd
e os grupos através do comando cat /etc/group
.
Nota sobre alteração de ownership e permissões
Apenas o utilizador root pode criar grupos e adicionar/remover utilizadores dos mesmos. Apenas o utilizador root pode alterar a ownership de um dado objeto. Apenas o owner do objeto (ou o root, obviamente) pode alterar as permissões para esse objeto.
Permissões
Diretorias
Mapeiam nomes para i-nodes. Acesso aos nomes (objetos) protegido pela permissão de leitura (r). Acesso aos i-nodes (informação de um objeto) protegido pela permissão de execução (x).
Em suma
- Read - ver/listar objetos
- Write - adicionar/remover/renomear1 objetos
- Execute -
cd
,chdir
, acessar i-nodes (stat)
Ficheiros
- Read - acessar conteúdo
- Write - modificar conteúdo
- Execute - executar ficheiro (se for passível de execução)
Real vs Effective (u|g)id
Por omissão, (euid, egid) = (ruid, rgid).
Se o bit suid ou sgid forem acionados no objeto em questão
- euid = id do owner do objeto
- egid = id do grupo owner do objeto
No entanto, esta abordagem de acionar estes bits pode ser perigosa e, também, poder violar o princípio dos privilégios mínimos. Especial atenção a programas que executem com suid para root.
Uma vez que este bit ocupa a posição da permissão de execução no owner, caso a permissão de execução esteja ligada aparecerá S
(maiúsculo), caso contrário aparecerá s
(minúsculo).
Sticky bit (= t)
Ficheiros
Em ficheiros, este bit é chamado tanto de sticky como de text. Se acionado, o código permanece ou em swap ou na memória. No entanto, este comportamento foi descontinuado devido ao aparecimento de memória virtual.
Diretorias
Se acionado em diretorias, este bit indica que apenas o owner do objeto (ou o root, obviamente) podem renomear ou apagar a diretoria em questão.
ACLs estendidas
Vêm complementar o mecanismo de permissões dado pelo ugo/rwx. É possível definir permissões para certos utilizadores ou grupos.
Em POSIX, a API é constituída pelos seguintes comandos: setfacl
e getfacl
, que colocam o símbolo +
depois das permissões habituais, denotando que o objeto está sob o efeito de uma ACL estendida.
Exemplo de utilização
$ setfacl -m u:rui:r file
$ getfacl file
...
$ setfacl -m u:rui:rw-,g:void:--x file
...
Footnotes
-
Na realidade, o conceito de renomear não existe em Linux. O comando
mv
cria um novo ficheiro no sistema de ficheiros e coloca o objeto antigo a apontar para esse i-node novo. Se os ficheiros estiverem em partições físicas distintas, a história é outra. ↩