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 comandosetfaclopera apenas em arquivos existentes. Para garantir que todos os novos arquivos recebam as configurações desejadas de ACL, é necessário usar o comandosetfaclduas vezes: primeiro com a opção-dpara definir a ACL padrão, e depois com a opção-Re sem a opção-dpara 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:
upara usuário egpara 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