ACL ou Listas de Controle de Acesso nos ajuda a obter um controle mais refinado na concessão de permissões do sistema de arquivos Linux para os usuários e assim podemos gerenciar quem tem acesso a quais informações.
As permissões ACL seguem um padrão em todos os Sistemas Operacionais derivados do UNIX. Esse padrão é chamado de POSIX. Então, muitos usuários chamam ACL também de ACL POSIX.
Veja: Como Saber se o Kernel Tem Suporte a ACL POSIX?
As ferramentas usadas para exibir e alterar permissões ACL são setfacl e getacl. No linux há o comando chmod
Entendendo sobre ACL
O sistema de arquivos Linux nos dá três tipos de permissões: Usuário, Grupo, Outros. Na verdade, podemos falar que
- usuário é o proprietário do arquivo, o dono do arquivo ou pasta;
- Grupo é o grupo proprietário
- Outros são todos os demais usuários não especificados como usuário proprietário ou fazendo parte do grupo.
Usuário, grupo e outros podem ter três(na verdade cinco, mas chegaremos a isso em um minuto) tipos de acesso:
- Read ou leitura
- Write ou escrita
- eXecute
Vamos supor que estamos vendo as permissões do arquivo teste.txt. Essas permissões ficam nesse estilo:
rwxrwxrwx
Dividir em 3 cores porque:
- rwx representa permissão de leitura(r), escrita(w) e execução(x) para o usuário
- rwx representa permissão de leitura(r), escrita(w) e execução(x) para o grupo
- rwx representa permissão de leitura(r), escrita(w) e execução(x) para outros
Um traço(–) significa a ausência da permissão, por exemplo:
rwxrwxr--
Quer dizer que usuário e grupo têm as três permissões para um arquivo, enquanto outros pessoas têm somente leitura(r).
Veja o exemplo abaixo que apenas o usuário(proprietário) tem acesso a tudo; grupo e outros ficam sem nenhuma permissão
rwx------
Esses níveis de acesso acima costumam ser adequados em muitos casos. Digamos que você tenha um diretório onde residem os arquivos do departamento financeiro da sua empresa. Você pode definir essas permissões para:
Usando e Entendendo ls -l
Para ver permissões em arquivos ou pastas usamos ls -l
maria@debian11VM:~$ ls -l total 4 -rw-r--r-- 1 maria maria 37 dez 21 09:48 arquivo01.txt -rw-r--r-- 1 maria maria 0 dez 21 10:10 arquivo02.txt
Acima temos maria duas vezes. O primeiro nome é a proprietária(usuário) do arquivo e o segundo o grupo. Maria é o usuário e grupo ao mesmo tempo. Isso acontece automaticamente no linux ao criarmos um arquivo ou pasta, o Linux coloca o nome da conta como sendo grupo e proprietário.
O PRIMEIRO CARACTERE EM: –rw-r–r– tem significado especial, veja:
- – o traço quer dizer que é um arquivo comun
- l um L minúsculo diz que esse arquivo é um link para outro arquivo ou pasta
- d uma letra D quer dizer que é uma pasta, um diretório
- b é de bloco
Há outros caracteres,mas não vem ao tema hoje.
A permissão -rw-r–r– quer dizer que é um arquivo, o proprietário tem acesso de leitura e escrita, grupo e outros têm apenas leitura.
Alterando Proprietário e Grupo com chown
Vamos mudar o grupo do arquivo01.txt para root usando chown
maria@debian11VM:~$ sudo chown mail:games arquivo01.txt
Veja o resultado
maria@debian11VM:~$ ls -l total 4 -rw-r--r-- 1 mail games 37 dez 21 09:48 arquivo01.txt -rw-r--r-- 1 maria maria 0 dez 21 10:10 arquivo02.txt
Usando getfacl e setfacl
O comando chmod serve para alterar permissões, mas como estamos lidando com ACLs iremos usar setfacl e getfacl.
Ao deixar de usar ACL e usarmos permissões regulares acabaremos limitados a diversas situações, pois com permissões regulares, cada arquivo e diretório pode ter apenas um usuário e grupo por vez. Esse tipo de situação é o que as listas de controle de acesso(ACLs) do Linux resolve. As ACLs nos permitem aplicar um conjunto mais específico de permissões a um arquivo ou diretório sem necessariamente alterar a propriedade e as permissões básicas. Eles nos permitem “adicionar” o acesso para outros usuários ou grupos.
Vendo ACLs com getfacl
Podemos visualizar a ACL atual usando o comando getfacl:
maria@debian11VM:~$ getfacl arquivo01.txt # file: arquivo01.txt # owner: mail # group: games user::rw- group::r-- other::r--
Eu acabei de criar esse arquivo e, por isso, não há ACLs para arquivo01.txt, porque as únicas permissões listadas são para o usuário, grupo e outros.
Adicionando ACL com setfacl
A sintaxe para definir uma ACL é semelhante a esta:
setfacl [opção] [ação/especificação] arquivo01.txt
a ação pode ser -m para modificar e -x para remover. A especificação seria o usuário ou grupo seguido pelas permissões que queremos definir.
Estamos trabalhando com um arqivo mas se fosse uma pasta poderíamos usar -d de default(padrão) para definir quais seriam as ACL padrões para os arquivos dentro da pasta.
Veja um exemplo,
maria@debian11VM:~$ sudo setfacl -m maria:rwx arquivo01.txt
Veja o resultado
maria@debian11VM:~$ getfacl arquivo01.txt # file: arquivo01.txt # owner: mail # group: games user::rw- user:maria:rwx group::r-- mask::rwx other::r--
Adicionando Permissões Usando setfacl
Vamos criar a pasta permissoes para servir de base nesse laboratório
maria@debian11VM:~$ mkdir permissoes
Criei um usuário chamado joao e paulo
maria@debian11VM:~$ sudo useradd joao
maria@debian11VM:~$ sudo useradd paulo
Vamos aos exemplos agora.
#1 Vamos criar permissões padrões(default) para pasta permissoes.
maria@debian11VM:~$ sudo setfacl -d -m maria:rwx permissoes
maria@debian11VM:~$ getfacl permissoes/ # file: permissoes/ # owner: maria # group: maria user::rwx group::r-x other::r-x default:user::rwx default:user:maria:rwx default:group::r-x default:mask::rwx default:other::r-x
#2 coloque permissão para o usuário joao
maria@debian11VM:~$ sudo setfacl -m joao:rwx permissoes
veja mais uma vez as entradas ACLs da pasta
maria@debian11VM:~$ getfacl permissoes # file: permissoes # owner: maria # group: maria user::rwx user:joao:rwx group::r-x mask::rwx other::r-x default:user::rwx default:user:maria:rwx default:group::r-x default:mask::rwx default:other::r-x
#3 logado no usuário joao, crie um arquivo chamado lista.txt dentro de permissoes
joao@debian11VM:~$ touch /home/maria/permissoes/lista.txt
#4 conceda a paulo somente a permissão de ver(ler) mas não criar conteúdo dentro da pasta.
maria@debian11VM:~$ setfacl -m paulo:rx permissoes
tente criar um arquivo com o usuário paulo e verá que ele não tem permissão.
paulo@debian11VM:~$ touch /home/maria/permissoes/docs.txt touch: não foi possível tocar '/home/maria/permissoes/docs.txt': Permissão negada
tente também editar, acrescentando texto dentro de arquivo01.txt e verá que ele também não tem permissão
paulo@debian11VM:~$ echo "texto de paulo" >> /home/maria/permissoes/arquivo01.txt -bash: /home/maria/permissoes/arquivo01.txt: Permissão negada
Tente excluir e verá que paulo não tem permissão
paulo@debian11VM:~$ rm -rf /home/maria/permissoes/arquivo01.txt rm: não foi possível remover '/home/maria/permissoes/arquivo01.txt': Permissão negada
Removendo Permissões Usando setfacl
#1 para remover todas as permissões de à pasta permissoes
maria@debian11VM:~$ setfacl -m paulo:- permissoes
maria@debian11VM:~$ getfacl permissoes/ # file: permissoes/ # owner: maria # group: maria user::rwx user:joao:rwx user:paulo:--- group::r-x mask::rwx other::r-x default:user::rwx default:user:maria:rwx default:group::r-x default:mask::rwx default:other::r-x
#2 remover todas as permissões de qualquer grupo da pasta permissoes.
Observação: Quando queremos definir uma ACL de grupo, precisamos especificar isso colocando g: antes do nome do grupo. Para os usuários, basta colocar u: no lugar do g, mas o setfacl assumirá que estamos falando de um usuário se você não colocar nada.
Observação: Se desejasse remover apenas permissões do grupo adm, poderia executar setfacl -m g:adm:- permissoes.
maria@debian11VM:~$ setfacl -m g::- permissoes maria@debian11VM:~$ getfacl permissoes/ # file: permissoes/ # owner: maria # group: maria user::rwx user:joao:rwx user:paulo:--- group::--- mask::rwx other::r-x default:user::rwx default:user:maria:rwx default:group::r-x default:mask::rwx default:other::r-x
#3 remover todas as permissões para outros da pasta permissoes
maria@debian11VM:~$ setfacl -m o:- permissoes maria@debian11VM:~$ getfacl permissoes/ # file: permissoes/ # owner: maria # group: maria user::rwx user:joao:rwx user:paulo:--- group::--- mask::rwx other::--- default:user::rwx default:user:maria:rwx default:group::r-x default:mask::rwx default:other::r-x