Linux - Listas de Controle de Acesso (ACL)
No Linux, as ACL, ou Listas de Controle de Acesso,fornecem uma maneira adicional de conceder permissões a vários usuários e grupos para um único arquivo ou diretório. As ACLs ajudam a superar algumas limitações de outras ferramentas comuns de gerenciamento de permissões, especificamente:
- Um arquivo ou diretório pode ter apenas um proprietário e um grupo proprietário.
- Não há herança de permissões para que as permissões de um diretório sejam transmitidas aos seus arquivos e subdiretórios.
As ACLs são frequentemente aplicadas a diretórios para garantir que novos arquivos criados dentro deles recebam automaticamente as permissões necessárias. Para configurar as ACLs, utiliza-se o comando setfacl
:
setfacl [options] operation entity:entityname:permissions file
O comando setfacl aceita os seguintes argumentos:
options: opções opcionais para gerenciar o funcionamento do comando
setfacl
. As opções mais comuns são:-d
: define a ACL padrão, que será herdada por subdiretórios e arquivos.-k
: remove a ACL padrão.-R
: aplica as configurações de ACL de forma recursiva.
A ACL padrão é destinada a novos arquivos e não afeta os arquivos existentes. Todos os novos arquivos receberão as permissões definidas na ACL padrão. Sem a opção
-d
, o comandosetfacl
opera apenas em arquivos existentes. Para garantir que todos os novos arquivos recebam as configurações desejadas de ACL, é necessário usar o comandosetfacl
duas vezes: primeiro com a opção-d
para definir a ACL padrão, e depois com a opção-R
e sem a opção-d
para lidar com os arquivos existentes.operation: define a ação a ser realizada, como adicionar ou remover uma configuração de ACL. As operações disponíveis são:
--set
: usada para definir uma ACL. Note que ela substituirá qualquer ACL existente.-m
: adiciona às configurações atuais de ACL sem substituí-las completamente.-x
: remove uma ACL existente.
- entity e entity name: tipo e nome do objeto para o qual a ACL será definida. Existem dois tipos de objetos:
u
para usuário eg
para grupo. Após especificar o tipo de objeto, deve-se indicar o nome do objeto. - permissions: as permissões a serem definidas usando as listas de controle de acesso.
- file: nome do arquivo ou diretório ao qual as ACLs devem ser aplicadas.
Exemplo:
setfacl -m g:users:rwx /somedir
Neste caso, para o diretório /somedir
, o grupo "users" (g:users
) recebe permissões "=rwx
"=, ou seja, permissões de leitura, escrita e execução. A operação -m indica que essa configuração deve ser adicionada às listas ACL existentes.
Também é possível definir ACLs para vários usuários ou grupos de uma vez:
setfacl -d -m g:users:rwx,g:developers:rx /somedir
Este comando define a ACL padrão para a pasta /somedir
, onde o grupo "users" recebe permissões rwx
e o grupo "developers" recebe permissões rx
.
Para obter informações sobre as listas ACL, usa-se o comando getfacl
, passando o nome do arquivo ou diretório:
getfacl file
Por exemplo, vamos criar um novo diretório chamado "test" na raiz do sistema de arquivos:
programicio@Programicio:~$ sudo mkdir /test
Vamos verificar as listas ACL para este diretório:
programicio@Programicio:~$ getfacl test # file: test # owner: root # group: root user::rwx group::r-x other::r-x
Aqui vemos que o proprietário do usuário tem permissões rwx
, enquanto o grupo proprietário e todos os outros têm permissões r-x
.
Vamos entrar neste diretório e tentar criar um novo arquivo chamado "hello.txt":
programicio@Programicio:~$ cd /test programicio@Programicio:/test$ touch hello.txt touch: cannot touch 'hello.txt': Permission denied
Como podemos ver, o comando touch
, que deveria criar o arquivo, não funciona sem o comando sudo
.
Agora, vamos definir as listas de controle de acesso para este diretório. Por exemplo, no meu caso, o usuário atual pertence ao grupo "users":
programicio@Programicio:/test$ groups programicio adm cdrom sudo dip plugdev users lpadmin
Vamos definir permissões rwx
para o grupo "users" no diretório /test
:
programicio@Programicio:/test$ sudo setfacl -m g:users:rwx /test [sudo] password for programicio:
Depois disso, vamos verificar novamente as listas de controle de acesso para o diretório usando o comando getfacl
:
programicio@Programicio:/test$ getfacl test # file: test # owner: root # group: root user::rwx group::r-x group:users:rwx mask::rwx other::r-x
Agora vemos que a saída do comando inclui um novo item, group:users:rwx
, indicando as permissões para o grupo "users".
Após isso, os usuários do grupo "users" poderão modificar o conteúdo do diretório, como criar um arquivo de texto, sem precisar do comando sudo
:
programicio@Programicio:/test$ touch hello1.txt
Vamos verificar as ACLs para o arquivo criado:
programicio@Programicio:/test$ getfacl hello1.txt # file: hello1.txt # owner: programicio # group: programicio user::rw- group::rw- other::r--
Podemos ver que o arquivo hello1.txt
segue as listas de acesso definidas para o diretório /test
. Agora vamos modificá-las:
programicio@Programicio:/test$ sudo setfacl -d -m g:users:rwx /test
A opção -d
define a lista de acesso ACL padrão para todos os novos arquivos e diretórios com base na ACL definida para o diretório /test
. Por exemplo, vamos criar um novo arquivo chamado hello2.txt
e verificar suas ACLs:
programicio@Programicio:/test$ touch hello2.txt programicio@Programicio:/test$ getfacl hello2.txt # file: hello2.txt # owner: programicio # group: programicio user::rw- group::r-x group:users:rwx mask::rw- other::r--
Podemos ver que o arquivo "hello2.txt
já aplica as ACLs definidas para o diretório. No entanto, o primeiro arquivo de texto - hello1.txt
- ainda não segue a ACL do diretório. Para resolver esse problema, precisamos aplicar as ACLs de forma recursiva:
sudo setfacl -R -m g:users:rwx /test