Gerenciando permissões de arquivos no Linux sem dor de cabeça

Gerenciar permissões de arquivos no Linux é uma habilidade essencial para qualquer administrador de sistemas ou desenvolvedor que trabalhe com ambientes Unix-like. Quando bem compreendido, esse processo se torna intuitivo e livre de dores de cabeça. Neste artigo, exploraremos desde os fundamentos até técnicas avançadas, com exemplos práticos que você pode aplicar imediatamente.

1. Fundamentos das permissões Linux

O modelo de permissões do Linux é baseado em três categorias: usuário (u), grupo (g) e outros (o). Cada arquivo ou diretório possui um proprietário e um grupo associado, e as permissões definem o que cada categoria pode fazer.

Os três bits fundamentais são:
- r (leitura) — permissão para ler o conteúdo do arquivo
- w (escrita) — permissão para modificar o arquivo
- x (execução) — permissão para executar o arquivo como um programa

Para visualizar as permissões, use o comando ls -l:

$ ls -l script.sh
-rwxr-xr-- 1 joao desenvolvedores 2048 mar 15 10:30 script.sh

Interpretando a saída:
- Primeiro caractere: tipo (- para arquivo, d para diretório)
- Próximos 9 caracteres: permissões (3 para usuário, 3 para grupo, 3 para outros)
- rwx (usuário): leitura, escrita e execução
- r-x (grupo): leitura e execução
- r-- (outros): apenas leitura

2. Modificando permissões com chmod

O comando chmod é a ferramenta principal para alterar permissões. Você pode usar notação simbólica ou notação octal.

Notação simbólica

$ chmod u+x script.sh        # Adiciona execução para o usuário
$ chmod g-w script.sh        # Remove escrita do grupo
$ chmod o=r script.sh        # Define apenas leitura para outros
$ chmod u+rwx,g+rx,o+r script.sh  # Combina várias permissões

Notação octal

A notação octal usa números de 0 a 7 para representar combinações de permissões:

  • r=4, w=2, x=1
  • Exemplo: rwx = 4+2+1 = 7; r-x = 4+0+1 = 5; r-- = 4+0+0 = 4
$ chmod 755 script.sh        # rwxr-xr-x (usuário: tudo, grupo/outros: leitura e execução)
$ chmod 644 config.txt       # rw-r--r-- (usuário: leitura/escrita, grupo/outros: leitura)
$ chmod 700 pasta_secreta    # rwx------ (apenas o proprietário tem acesso)

Para diretórios, a permissão de execução (x) é necessária para acessar o conteúdo:

$ chmod 755 /home/joao/projeto   # Permite que outros acessem o diretório
$ chmod 750 /home/joao/privado   # Restringe acesso apenas ao grupo

3. Gerenciando proprietários com chown e chgrp

Alterando proprietário e grupo

$ chown maria:administradores relatorio.pdf   # Altera proprietário e grupo
$ chown maria: relatorio.pdf                  # Altera apenas o proprietário
$ chown :administradores relatorio.pdf        # Altera apenas o grupo

Usando chgrp para alterar apenas o grupo

$ chgrp desenvolvedores projeto/              # Altera grupo do diretório
$ chgrp -R desenvolvedores projeto/           # Recursivo (cuidado!)

Cuidado com recursividade: Use -R apenas quando tiver certeza do que está fazendo. Uma alteração incorreta pode quebrar permissões em todo um diretório.

$ chown -R maria:maria /home/maria/backup     # Seguro: apenas dentro do home
$ chown -R root:root /etc/nginx               # Perigoso: pode afetar serviços

4. Permissões especiais: SUID, SGID e sticky bit

SUID (setuid) — 4000

Permite que um arquivo seja executado com os privilégios do proprietário:

$ chmod u+s /usr/bin/programa
$ chmod 4755 /usr/bin/programa   # rwsr-xr-x

Exemplo real: o comando passwd possui SUID para permitir que usuários alterem suas próprias senhas.

SGID (setgid) — 2000

Em diretórios, faz com que novos arquivos herdem o grupo do diretório:

$ chmod g+s /projetos/compartilhado
$ chmod 2755 /projetos/compartilhado   # rwxr-sr-x

Sticky bit — 1000

Protege arquivos em diretórios compartilhados: apenas o proprietário pode deletar seus próprios arquivos:

$ chmod +t /tmp
$ chmod 1777 /tmp   # rwxrwxrwt

5. Umask: definindo permissões padrão para novos arquivos

O umask define quais permissões serão removidas automaticamente ao criar novos arquivos. O valor padrão é 022, que resulta em:

  • Arquivos: 666 - 022 = 644 (rw-r--r--)
  • Diretórios: 777 - 022 = 755 (rwxr-xr-x)
$ umask 022    # Permissões padrão seguras
$ umask 077    # Restritivo: apenas o proprietário tem acesso
$ umask 002    # Permissivo: grupo pode escrever (útil para times)

Para configurar globalmente, edite /etc/profile ou ~/.bashrc:

# Adicione ao ~/.bashrc
umask 027

6. ACLs: permissões avançadas sem complexidade

As ACLs (Access Control Lists) permitem definir permissões específicas para múltiplos usuários e grupos além do modelo tradicional.

Visualizando ACLs

$ getfacl relatorio.txt
# file: relatorio.txt
# owner: joao
# group: desenvolvedores
user::rw-
user:maria:rw-
group::r--
mask::rw-
other::r--

Configurando ACLs

$ setfacl -m u:maria:rw relatorio.txt        # Maria tem leitura/escrita
$ setfacl -m g:estagiarios:rx projeto/       # Grupo estagiarios tem leitura/execução
$ setfacl -x u:maria relatorio.txt           # Remove ACL de Maria

Herança com ACLs padrão

Para que novos arquivos herdem permissões:

$ setfacl -d -m u:maria:rw pasta_compartilhada/
$ setfacl -d -m g:equipe:rx pasta_compartilhada/

7. Troubleshooting comum e boas práticas

Depurando permissões

$ namei -l /var/www/html/index.html   # Mostra permissões de toda a hierarquia
$ stat index.html                     # Informações detalhadas do arquivo
$ find /home -perm 777 -type f        # Encontra arquivos com permissões abertas

Erros frequentes

"Permission denied" em scripts: Verifique se o script tem permissão de execução (chmod +x script.sh). Para diretórios, certifique-se de que o caminho completo é acessível.

Problemas com diretórios web: Arquivos em /var/www/html geralmente precisam de permissão 644 e diretórios 755, com proprietário www-data ou similar.

Checklist de segurança

  1. Princípio do menor privilégio: Conceda apenas as permissões necessárias
  2. Auditoria regular: Use find / -perm -o+w -type f 2>/dev/null para encontrar arquivos com escrita global
  3. Evite 777: Raramente é necessário; prefira ACLs ou grupos
  4. Proteja arquivos sensíveis: chmod 600 para chaves SSH, chmod 700 para diretórios de configuração
  5. Documente permissões especiais: SUID/SGID podem ser riscos de segurança
# Exemplo de auditoria
$ find /usr -perm -4000 -type f 2>/dev/null   # Lista todos os SUID
$ find /etc -type f -exec ls -la {} \;        # Verifica permissões de config

Dominar permissões no Linux é um processo contínuo, mas com esses conceitos e exemplos práticos, você estará preparado para gerenciar qualquer cenário sem dor de cabeça. Lembre-se: permissões bem configuradas são a base de um sistema seguro e funcional.

Referências