Permissões e propriedade de arquivos: chmod, chown e ACLs
1. Fundamentos das Permissões no Linux
1.1. Modelo de permissões Unix: proprietário, grupo e outros
O modelo de permissões Unix é baseado em três entidades distintas: o proprietário (owner), o grupo (group) e outros (others). Cada arquivo ou diretório possui um proprietário (geralmente quem o criou) e um grupo associado. As permissões definem o que cada uma dessas entidades pode fazer com o recurso.
1.2. Representação simbólica (rwx) vs. octal (755, 644)
As permissões podem ser expressas de duas formas:
Representação simbólica:
- r (read) = permissão de leitura
- w (write) = permissão de escrita
- x (execute) = permissão de execução
Exemplo: rwxr-xr-- significa:
- Proprietário: leitura, escrita e execução (rwx)
- Grupo: leitura e execução (r-x)
- Outros: apenas leitura (r--)
Representação octal:
Cada permissão tem um valor numérico:
- r = 4
- w = 2
- x = 1
Exemplo: 755 = proprietário (7 = rwx), grupo (5 = r-x), outros (5 = r-x)
1.3. Tipos de arquivos e permissões especiais
Em diretórios, a permissão de execução (x) significa permissão de acesso (entrar no diretório). Para links simbólicos, as permissões são herdadas do arquivo alvo. Dispositivos seguem o mesmo modelo, mas com significados específicos para operações de I/O.
2. Comando chmod: Alterando Permissões
2.1. Sintaxe básica e modos
Modo simbólico:
chmod u+x arquivo.sh # Adiciona execução para o proprietário
chmod g-w arquivo.txt # Remove escrita do grupo
chmod o+r arquivo.txt # Adiciona leitura para outros
chmod u=rwx,g=rx,o=r arquivo # Define permissões específicas
Modo absoluto (octal):
chmod 755 script.sh # rwxr-xr-x
chmod 644 documento.txt # rw-r--r--
chmod 700 pasta_secreta # rwx------
2.2. Permissões especiais
As permissões especiais utilizam um quarto dígito octal:
- setuid (4): Executa com privilégios do proprietário
- setgid (2): Executa com privilégios do grupo
- sticky bit (1): Apenas proprietário pode deletar/renomear
chmod 4755 programa # setuid + rwxr-xr-x
chmod 2755 diretorio # setgid + rwxr-xr-x
chmod 1777 /tmp # sticky bit + rwxrwxrwx
2.3. Uso recursivo e boas práticas
chmod -R 755 /var/www/html # Aplica permissões recursivamente
chmod -R u+rwX,go+rX pasta # X = execução apenas para diretórios
3. Comando chown: Alterando Propriedade
3.1. Alterando proprietário e grupo
chown joao documento.txt # Altera apenas proprietário
chown :developers arquivo.c # Altera apenas grupo
chown joao:developers arquivo.c # Altera proprietário e grupo
3.2. Mudanças recursivas e preservação de links
chown -R joao:users /home/joao # Recursivo
chown -h joao link_simbolico # Altera o link, não o alvo
3.3. Permissões de superusuário
sudo chown root:root /etc/config.conf
sudo chgrp developers /projeto/compartilhado
4. Umask e Permissões Padrão
4.1. O que é umask e como calcular permissões resultantes
O umask define quais permissões serão removidas por padrão. A fórmula é:
Permissão final = Permissão base - umask
Para arquivos: permissão base = 666
Para diretórios: permissão base = 777
umask 022 # Resultado: arquivo 644, diretório 755
umask 077 # Resultado: arquivo 600, diretório 700
4.2. Configuração de umask no shell
# No bash
umask 027
echo "umask 027" >> ~/.bashrc
# No zsh
echo "umask 027" >> ~/.zshrc
4.3. Impacto em diretórios compartilhados
# Configuração segura para diretório compartilhado
umask 002 # Grupo pode escrever
chmod g+s /projeto/compartilhado # Mantém grupo nos novos arquivos
5. Listas de Controle de Acesso (ACLs)
5.1. Conceito de ACLs
ACLs permitem definir permissões para usuários e grupos específicos além do modelo tradicional de três entidades.
5.2. Comandos getfacl e setfacl
# Verificar ACLs
getfacl documento.txt
# Adicionar permissão para usuário específico
setfacl -m u:maria:rwx documento.txt
# Adicionar permissão para grupo específico
setfacl -m g:developers:rx documento.txt
# Remover ACL específica
setfacl -x u:joao documento.txt
# Remover todas as ACLs
setfacl -b documento.txt
5.3. Máscara de ACL e herança
# Definir máscara (limita permissões de usuários/grupos nomeados)
setfacl -m m::rx documento.txt
# Herança em diretórios (novos arquivos herdam ACLs)
setfacl -d -m u:maria:rwx /projeto
setfacl -R -m u:maria:rwx /projeto # Aplica a existentes
6. Casos Práticos e Troubleshooting
6.1. Cenários comuns
Servidor web (Apache/Nginx):
# Permissões seguras para /var/www/html
chown -R www-data:www-data /var/www/html
find /var/www/html -type f -exec chmod 644 {} \;
find /var/www/html -type d -exec chmod 755 {} \;
Chave SSH:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
6.2. Verificando permissões efetivas
ls -la arquivo.txt # Permissões básicas
stat arquivo.txt # Informações detalhadas
namei -l /caminho/completo # Permissões de todo o caminho
getfacl arquivo.txt # ACLs completas
6.3. Debugging de ACLs
# Verificar se ACL está ativa no sistema de arquivos
mount | grep acl
# Testar permissões efetivas
sudo -u usuario test -r arquivo.txt && echo "Pode ler" || echo "Não pode ler"
7. Segurança e Boas Práticas
7.1. Princípio do menor privilégio
# Script de verificação de permissões
find / -perm -4000 -type f 2>/dev/null # Encontra setuid
find / -perm -2000 -type f 2>/dev/null # Encontra setgid
find / -perm -0002 -type f 2>/dev/null # Encontra world-writable
7.2. Cuidados com permissões especiais
# Remover setuid/setgid de binários inseguros
chmod u-s /usr/bin/programa_inseguro
chmod g-s /usr/bin/programa_inseguro
# Verificar sticky bit em diretórios temporários
ls -ld /tmp
7.3. Auditoria de permissões
# Script básico de auditoria
#!/bin/bash
echo "Arquivos com permissão 777:"
find /home -perm 777 -type f 2>/dev/null
echo "Diretórios com permissão 777:"
find /home -perm 777 -type d 2>/dev/null
echo "Arquivos sem proprietário:"
find /home -nouser -o -nogroup 2>/dev/null
Referências
- Linux man page: chmod — Documentação oficial do comando chmod com todos os modos e opções
- Linux man page: chown — Referência completa para alteração de proprietário e grupo
- Linux man page: acl — Documentação detalhada sobre Listas de Controle de Acesso no Linux
- Red Hat: Managing ACLs — Guia prático da Red Hat sobre configuração e gerenciamento de ACLs
- Ubuntu: File Permissions — Tutorial completo da comunidade Ubuntu sobre permissões de arquivos
- Linux Foundation: Understanding Linux File Permissions — Artigo técnico explicando o modelo de permissões Unix em profundidade
- IBM: ACLs in Linux — Documentação da IBM sobre implementação de ACLs em sistemas Linux