Administração de Sistemas

Permissões e propriedade de arquivos: chmod, chown e ACLs

• 5 min de leitura

Permissões e propriedade de arquivos: chmod, chown e ACLs
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.

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
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

💬 Comentários
Mais em Administração de Sistemas