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

  1. 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.