Permissões de arquivo: chmod, chown e como funcionam
1. Fundamentos das Permissões no Linux
O Linux implementa um modelo de segurança baseado em três categorias de acesso: usuário (user), grupo (group) e outros (others). Cada arquivo ou diretório possui um proprietário (owner), um grupo associado e permissões específicas para cada uma dessas categorias.
Os três tipos básicos de permissão são:
- Leitura (r - read): Permite visualizar o conteúdo do arquivo ou listar o diretório
- Escrita (w - write): Permite modificar o arquivo ou criar/remover arquivos no diretório
- Execução (x - execute): Permite executar o arquivo como programa ou acessar o diretório
Para visualizar as permissões, use o comando ls -l:
$ ls -l
-rwxr-xr-- 1 joao desenvolvedores 1024 Mar 15 10:30 script.sh
Interpretando a saída:
- - indica que é um arquivo regular (d para diretório)
- rwx permissões do dono (joão): leitura, escrita e execução
- r-x permissões do grupo (desenvolvedores): leitura e execução
- r-- permissões de outros: apenas leitura
2. Entendendo os Níveis de Acesso
Dono do arquivo (user): É o proprietário, geralmente quem criou o arquivo. Possui controle total sobre as permissões.
Grupo (group): Permite que múltiplos usuários compartilhem permissões sem expor o arquivo a todos. Por exemplo, uma equipe de desenvolvimento pode ter acesso de escrita a um diretório compartilhado.
Outros (others): Todos os usuários que não são o dono nem pertencem ao grupo. Idealmente, deve ter permissões mínimas por segurança.
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2545 Mar 15 10:30 /etc/passwd
Aqui, root é dono e grupo, com permissão de leitura/escrita para root e apenas leitura para outros.
3. Modificando Permissões com chmod
Notação Simbólica
Permite adicionar ou remover permissões de forma intuitiva:
# Adiciona execução para o dono
$ chmod u+x script.sh
# Remove escrita do grupo
$ chmod g-w relatorio.txt
# Define permissão exata para outros como apenas leitura
$ chmod o=r dados.csv
# Adiciona todas as permissões para todos
$ chmod a+rwx publico.sh
# Verificando o resultado
$ ls -l script.sh
-rwxr-xr-x 1 joao joao 0 Mar 15 10:30 script.sh
Notação Octal (Numérica)
Cada permissão tem um valor numérico:
- r = 4
- w = 2
- x = 1
As combinações mais comuns:
# 755: dono tem tudo, grupo e outros leitura e execução
$ chmod 755 script.sh
$ ls -l script.sh
-rwxr-xr-x 1 joao joao 0 Mar 15 10:30 script.sh
# 644: dono leitura/escrita, demais apenas leitura
$ chmod 644 index.html
$ ls -l index.html
-rw-r--r-- 1 joao joao 0 Mar 15 10:30 index.html
# 600: apenas dono tem acesso (arquivos sensíveis)
$ chmod 600 senha.txt
$ ls -l senha.txt
-rw------- 1 joao joao 0 Mar 15 10:30 senha.txt
# 700: apenas dono tem acesso total (scripts pessoais)
$ chmod 700 privado.sh
4. Alterando Proprietário e Grupo com chown
O comando chown (change owner) permite modificar o proprietário e grupo de arquivos:
# Mudando apenas o dono
$ sudo chown maria relatorio.txt
$ ls -l relatorio.txt
-rw-r--r-- 1 maria joao 0 Mar 15 10:30 relatorio.txt
# Mudando apenas o grupo (usando :grupo)
$ sudo chown :admin relatorio.txt
$ ls -l relatorio.txt
-rw-r--r-- 1 maria admin 0 Mar 15 10:30 relatorio.txt
# Mudando dono e grupo simultaneamente
$ sudo chown maria:admin relatorio.txt
$ ls -l relatorio.txt
-rw-r--r-- 1 maria admin 0 Mar 15 10:30 relatorio.txt
# Alterando recursivamente em diretórios
$ sudo chown -R maria:admin /home/projeto/
5. Permissões Especiais: SetUID, SetGID e Sticky Bit
SetUID (4000)
Permite executar um arquivo com os privilégios do proprietário:
# Exemplo: /usr/bin/passwd precisa de acesso root para alterar senhas
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Mar 15 10:30 /usr/bin/passwd
# Ativando SetUID em um script
$ chmod u+s script_especial.sh
$ ls -l script_especial.sh
-rwsr-xr-x 1 root root 0 Mar 15 10:30 script_especial.sh
SetGID (2000)
Em arquivos: executa com privilégios do grupo. Em diretórios: novos arquivos herdam o grupo do diretório:
# Ativando SetGID em diretório compartilhado
$ chmod g+s /compartilhado
$ ls -ld /compartilhado
drwxrwsr-x 2 root equipe 4096 Mar 15 10:30 /compartilhado
Sticky Bit (1000)
Protege arquivos em diretórios compartilhados: apenas o dono pode deletar seus arquivos:
# /tmp já possui sticky bit ativo
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Mar 15 10:30 /tmp
# Ativando sticky bit manualmente
$ chmod +t /diretorio_compartilhado
6. Permissões em Diretórios vs. Arquivos
As permissões funcionam de forma diferente em diretórios:
# Permissão de leitura em diretório: permite listar conteúdo
$ chmod 444 documentos/
$ ls documentos/
ls: cannot open directory 'documentos/': Permission denied
# Permissão de execução em diretório: permite acessar arquivos
$ chmod 100 documentos/
$ ls documentos/
ls: cannot open directory 'documentos/': Permission denied
$ cat documentos/arquivo.txt
cat: documentos/arquivo.txt: Permission denied
# Combinação correta: leitura + execução (500)
$ chmod 500 documentos/
$ ls documentos/
arquivo.txt
$ cat documentos/arquivo.txt
Conteúdo do arquivo
# Para criar/remover arquivos: leitura + execução + escrita (700)
$ chmod 700 documentos/
$ touch documentos/novo.txt
Boas práticas para diretórios:
# Diretório público: 755 (drwxr-xr-x)
chmod 755 /publico/
# Diretório privado: 700 (drwx------)
chmod 700 /privado/
# Diretório compartilhado com grupo: 750 (drwxr-x---)
chmod 750 /compartilhado/
7. Boas Práticas e Segurança
Princípio do Menor Privilégio
Evite chmod 777 a todo custo. Ele dá acesso total a qualquer usuário do sistema:
# NUNCA faça isso
$ chmod 777 script.sh
# Prefira permissões específicas
$ chmod 750 script.sh # dono total, grupo leitura/execução, outros sem acesso
Usando umask para Definir Permissões Padrão
O umask define quais permissões serão removidas automaticamente:
# Verificando umask atual
$ umask
0022
# Calculando permissões: 666 - 022 = 644 (arquivos) e 777 - 022 = 755 (diretórios)
$ touch novo_arquivo.txt
$ ls -l novo_arquivo.txt
-rw-r--r-- 1 joao joao 0 Mar 15 10:30 novo_arquivo.txt
# Definindo umask mais restritivo
$ umask 0077
$ touch arquivo_seguro.txt
$ ls -l arquivo_seguro.txt
-rw------- 1 joao joao 0 Mar 15 10:30 arquivo_seguro.txt
Verificando Permissões com stat e find
# Usando stat para detalhes completos
$ stat script.sh
File: script.sh
Size: 0 Blocks: 0 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1234567 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 1000/ joao) Gid: ( 1000/ joao)
# Encontrando arquivos com permissões perigosas
$ find /home -perm 777 -type f
/home/usuario/arquivo_inseguro.txt
# Encontrando arquivos sem permissão para outros
$ find /home -perm /o=w -type f
/home/usuario/script_executavel.sh
Lembre-se: permissões corretas são fundamentais para a segurança do sistema. Sempre aplique o menor privilégio necessário para cada usuário ou grupo.
Referências
- Linux man page: chmod — Documentação oficial completa do comando chmod com todas as opções e exemplos
- Linux man page: chown — Documentação oficial do comando chown para alteração de proprietário e grupo
- Linux man page: umask — Documentação detalhada sobre a máscara de permissões e seu funcionamento
- Linux Filesystem Hierarchy Standard — Padrão de hierarquia do sistema de arquivos Linux, incluindo permissões padrão para diretórios do sistema
- Ubuntu Security - File Permissions — Guia oficial da Canonical sobre permissões de arquivos e práticas recomendadas de segurança
- Red Hat - Managing File Permissions — Documentação da Red Hat Enterprise Linux sobre gerenciamento de permissões com exemplos práticos
- Linux Journey - Permissions — Tutorial interativo e didático sobre permissões de arquivos no Linux, ideal para iniciantes