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
Dica: O 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:

Dica: O sistema de arquivos deve ter suporte a ACLs. Os sistemas ext4, XFS e Btrfs suportam por padrão. Verifique com mount | grep acl ou tune2fs -l /dev/sda1 | grep "Default mount".