Por que ACLs?
O modelo tradicional rwx permite definir permissões apenas para três entidades: dono, grupo e outros. Quando você precisa dar acesso de leitura a um usuário específico sem alterar o grupo do arquivo, o chmod não resolve. É aí que entram as ACLs (Access Control Lists).
Exemplo prático: o arquivo relatorio.csv pertence ao usuário ana e ao grupo financeiro. Você precisa dar acesso de leitura ao usuário carlos (que não é do grupo financeiro) sem abrir para todos.
Verificando ACLs com getfacl
getfacl relatorio.csv
# file: relatorio.csv
# owner: ana
# group: financeiro
user::rw-
group::r--
other::---
Sem ACLs, a saída mostra apenas as permissões tradicionais. Note que other::--- bloqueia o acesso de carlos.
Adicionando ACLs com setfacl -m
O -m (modify) adiciona ou altera entradas na ACL:
# Dar leitura ao usuário carlos
setfacl -m u:carlos:r relatorio.csv
# Dar leitura e escrita ao grupo devops
setfacl -m g:devops:rw relatorio.csv
Verifique o resultado:
getfacl relatorio.csv
# file: relatorio.csv
# owner: ana
# group: financeiro
user::rw-
user:carlos:r--
group::r--
group:devops:rw-
mask::rw-
other::---
Observe que o ls -l agora mostra um + no final das permissões, indicando ACLs ativas:
ls -l relatorio.csv
-rw-rw----+ 1 ana financeiro 2048 mar 27 09:15 relatorio.csv
A máscara (mask)
A mask define a permissão máxima efetiva para todas as entradas de ACL (exceto o dono e other). Mesmo que você defina rw para carlos, se a mask for r, ele terá apenas leitura.
# Ajustar a mask manualmente
setfacl -m m::r relatorio.csv
chmod altera a mask quando aplicado a um arquivo com ACLs. Isso pode restringir permissões de ACL sem que você perceba. Sempre verifique com getfacl após usar chmod em arquivos com ACLs.Removendo ACLs com setfacl -x
# Remover ACL de um usuário específico
setfacl -x u:carlos relatorio.csv
# Remover ACL de um grupo
setfacl -x g:devops relatorio.csv
# Remover TODAS as ACLs (voltar ao rwx tradicional)
setfacl -b relatorio.csv
ACLs padrão (default) em diretórios
ACLs padrão são herdadas automaticamente por novos arquivos e subdiretórios criados dentro do diretório:
# Definir ACL padrão: novos arquivos darão leitura ao grupo devops
setfacl -d -m g:devops:rx /opt/projeto/
# Verificar as ACLs padrão
getfacl /opt/projeto/
# file: opt/projeto/
# owner: ana
# group: financeiro
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:group:devops:r-x
default:mask::r-x
default:other::---
Agora, qualquer arquivo criado em /opt/projeto/ terá automaticamente a ACL g:devops:r-x.
touch /opt/projeto/novo.txt
getfacl /opt/projeto/novo.txt
# file: opt/projeto/novo.txt
# owner: ana
# group: financeiro
user::rw-
group::r-x #effective:r--
group:devops:r-x #effective:r--
mask::r--
other::---
ACLs recursivas
# Aplicar ACL em todos os arquivos e diretórios existentes
setfacl -R -m g:devops:rx /opt/projeto/
Quando usar ACLs vs chmod?
Use chmod quando o modelo dono/grupo/outros for suficiente. Use ACLs quando:
- Vários usuários de grupos diferentes precisam de acesso ao mesmo recurso
- Você precisa de permissões granulares por usuário
- Novos arquivos em um diretório devem herdar permissões específicas
- A estrutura de grupos do sistema é complexa demais para resolver com chmod
mount | grep acl ou tune2fs -l /dev/sda1 | grep "Default mount".