Você tem uma pasta compartilhada por um serviço, aplicação ou vários usuários e precisa que tudo o que for criado dentro dela já nasça com as permissões certas?
Rodar chmod ou chown toda vez até resolve momentaneamente, mas não é uma boa solução. Uma hora alguém esquece, e o acesso quebra.
Uma forma adequada de resolver isso no Linux é utilizando ACL padrão.
O que é ACL?
As permissões tradicionais do Linux trabalham basicamente com três níveis: dono, grupo e outros.
A ACL (Access Control List, ou lista de controle de acesso) permite conceder permissões adicionais a usuários ou grupos específicos sem mudar o dono ou o grupo principal do arquivo.
Assim, por exemplo, você pode dar acesso ao usuário pedro sem alterar o proprietário da pasta e sem liberar o acesso para todos os usuários do sistema.
O que é ACL padrão?
Podemos trabalhar com dois tipos de ACL:
- ACL de acesso: define permissões para o arquivo ou diretório onde foi aplicada.
- ACL padrão (default): é definida em um diretório e serve como base para as permissões ACL dos novos arquivos e subdiretórios criados dentro dele.
É a ACL padrão que permite automatizar as permissões.
Instalando o suporte a ACL
Na maioria das distribuições Linux atuais, o suporte já está disponível.
Se os comandos setfacl e getfacl não existirem no seu sistema, no Debian, Ubuntu, Linux Mint e derivados você pode instalar o pacote:
sudo apt install acl Como configurar
Vamos utilizar como exemplo a pasta:
/srv/compartilhado Queremos garantir que o usuário pedro tenha acesso de leitura e escrita ao conteúdo.
Primeiro, aplicamos a ACL ao que já existe:
sudo setfacl -R -m u:pedro:rwX /srv/compartilhado Depois, configuramos a ACL padrão para o que for criado daqui para frente:
sudo setfacl -R -d -m u:pedro:rwX /srv/compartilhado Entendendo os parâmetros
-R: aplica a alteração recursivamente em arquivos e subdiretórios.-m: modifica ou adiciona uma entrada na ACL.-d: modifica a ACL padrão (default) do diretório.u:pedro:rwX: concede as permissões indicadas ao usuáriopedro.
O X maiúsculo é proposital.
Diferentemente de x, ele não sai marcando todos os arquivos comuns como executáveis durante uma aplicação recursiva. Diretórios recebem a permissão necessária para serem acessados, enquanto arquivos comuns continuam sem execução, salvo quando ela já era aplicável.
Fazer tudo em um único comando
Também é possível configurar a ACL atual e a ACL padrão de uma só vez:
sudo setfacl -R -m u:pedro:rwX,d:u:pedro:rwX /srv/compartilhado Para facilitar o entendimento, porém, usar os dois comandos separadamente deixa mais clara a diferença entre a ACL aplicada ao conteúdo existente e a ACL padrão utilizada nos novos itens.
Liberando acesso para um grupo
A lógica é praticamente a mesma.
Em vez de u: (user), utilizamos g: (group).
Por exemplo, para conceder acesso ao grupo equipe:
sudo setfacl -R -m g:equipe:rwX /srv/compartilhado
sudo setfacl -R -d -m g:equipe:rwX /srv/compartilhado Como conferir
Utilize o getfacl:
getfacl /srv/compartilhado Você deverá encontrar linhas semelhantes a:
user:pedro:rwx
default:user:pedro:rwx A linha sem default representa a ACL aplicada ao próprio diretório.
A linha iniciada por default faz parte da ACL padrão e será utilizada na criação de novos itens.
Outra maneira rápida de identificar a existência de uma ACL é usando:
ls -ld /srv/compartilhado Se aparecer um + depois das permissões, existem informações adicionais de ACL:
drwxrwx---+ Testando se a herança está funcionando
Depois de configurar a ACL, podemos criar um arquivo e um diretório de teste:
touch /srv/compartilhado/teste.txt
mkdir /srv/compartilhado/teste Agora consulte as permissões:
getfacl /srv/compartilhado/teste.txt
getfacl /srv/compartilhado/teste O usuário pedro deverá aparecer nas ACLs dos novos itens.
Por exemplo, no arquivo:
user:pedro:rw- E no diretório:
user:pedro:rwx Isso confirma que a ACL padrão está sendo herdada corretamente.
Atenção à máscara
A ACL possui um item chamado máscara (mask).
Ela funciona como um limite para as permissões efetivas concedidas às entradas de usuários adicionais, grupos e grupo proprietário.
O setfacl normalmente calcula a máscara automaticamente, mas ela pode ser alterada posteriormente, inclusive por determinadas alterações feitas com chmod.
Por isso, às vezes a ACL parece estar correta, mas o usuário não possui todas as permissões esperadas.
O getfacl deixa isso evidente:
user:pedro:rwx #effective:r-- Nesse exemplo, a ACL solicita rwx, mas a máscara está limitando a permissão efetiva.
Consulte a ACL completa:
getfacl /srv/compartilhado Se realmente for necessário permitir rwx, a máscara pode ser ajustada com:
sudo setfacl -m m::rwx /srv/compartilhado A máscara não deve ser alterada automaticamente sem verificar as demais entradas da ACL, pois ela também pode afetar as permissões efetivas de outros usuários e grupos.
Arquivos novos não ficam executáveis. É normal?
Sim.
Normalmente, programas criam arquivos comuns sem solicitar permissão de execução. A ACL padrão não deve transformar automaticamente esses arquivos em executáveis.
Por isso, é normal encontrar:
user:pedro:rw- em um arquivo novo e:
user:pedro:rwx em um novo diretório.
Se você criar um script que realmente precise ser executável, pode habilitar essa permissão explicitamente:
chmod +x script.sh Como remover uma ACL
Para remover a ACL específica do usuário pedro:
sudo setfacl -R -x u:pedro /srv/compartilhado Para remover a entrada correspondente da ACL padrão:
sudo setfacl -R -x d:u:pedro /srv/compartilhado Se a intenção for remover todas as entradas ACL estendidas:
sudo setfacl -R -b /srv/compartilhado E para remover as ACLs padrão (default) dos diretórios:
sudo setfacl -R -k /srv/compartilhado Em resumo:
-b: remove as entradas estendidas da ACL de acesso.-k: remove a ACL padrão (default).
Resumindo
Aplicar a permissão ao conteúdo que já existe:
sudo setfacl -R -m u:pedro:rwX /srv/compartilhado Fazer novos arquivos e diretórios herdarem a ACL:
sudo setfacl -R -d -m u:pedro:rwX /srv/compartilhado Conferir:
getfacl /srv/compartilhado Testar:
touch /srv/compartilhado/teste.txt
mkdir /srv/compartilhado/teste
getfacl /srv/compartilhado/teste.txt
getfacl /srv/compartilhado/teste Pronto. A partir daí, os novos arquivos e diretórios criados dentro da pasta passam a herdar a ACL configurada, evitando a necessidade de corrigir manualmente as permissões a cada novo item.