Permissões de Arquivo no Linux, Sem Mágica
Um passeio fundamentado por rwx, notação octal, chmod, chown, umask e os bits especiais — explicado como eu gostaria que tivessem me explicado.
Nota: Este é um conteúdo de exemplo criado para demonstrar o blog. Substitua pelo seu próprio texto.
Permissões de arquivo é um daqueles tópicos de Linux que é apresentado uma vez, mal, e nunca mais revisado. Você aprende chmod 755, copia e cola isso para sempre e, em algum momento, percebe que não faz ideia do que o 4 em chmod 4755 faz. Este post é a explicação que eu gostaria de ter tido no meu primeiro ano.
A Saída do ls -l, Decodificada
Comece pela fonte da verdade. ls -l imprime os metadados que o sistema de arquivos guarda para cada entrada:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59944 Feb 7 2025 /usr/bin/passwd
Lendo da esquerda para a direita:
-— tipo do arquivo (-arquivo comum,ddiretório,llink simbólico,c/bdispositivo de caractere/bloco,ppipe,ssocket).rws— permissões do dono (osaqui é um bit especial, voltamos a ele adiante).r-x— permissões do grupo.r-x— permissões dos outros (todo o restante).1— contador de hard links.root root— dono e grupo.59944— tamanho em bytes.- Data e nome.
Os nove caracteres de permissão se dividem em três tripletos: dono / grupo / outros. Dentro de cada tripleto, as posições são fixas: r (leitura), w (escrita), x (execução). Um traço significa "não definido".
Simbólico vs. Octal
Há duas formas de falar sobre permissões: simbólica (rwxr-xr-x) e octal (755). Elas descrevem a mesma coisa; octal é só mais compacta.
Cada tripleto mapeia de forma limpa para três bits:
| Simbólico | Binário | Octal | Significado |
|---|---|---|---|
--- |
000 |
0 |
sem acesso |
--x |
001 |
1 |
só execução |
-w- |
010 |
2 |
só escrita |
-wx |
011 |
3 |
escrita + execução |
r-- |
100 |
4 |
só leitura |
r-x |
101 |
5 |
leitura + execução |
rw- |
110 |
6 |
leitura + escrita |
rwx |
111 |
7 |
leitura + escrita + execução |
Assim, 755 é rwxr-xr-x: o dono pode tudo, grupo e outros podem ler e executar, mas não escrever. 644 é rw-r--r--, o padrão para a maioria dos arquivos comuns. 600 é rw-------, comum para chaves privadas.
chmod: Modo Simbólico e Absoluto
chmod aceita qualquer uma das formas. O modo simbólico é mais amigável quando você quer mudar só um bit:
# Adiciona permissão de execução para o dono.
chmod u+x script.sh
# Remove escrita para "outros".
chmod o-w notas.txt
# Define leitura e escrita para dono e grupo, nada para outros.
chmod ug=rw,o= compartilhado.log
O modo octal define os três tripletos de uma vez — o que você não mencionar é limpo:
# Restringe uma chave privada.
chmod 600 ~/.ssh/id_ed25519
# Um diretório que o time pode ler e percorrer, mas não escrever.
chmod 755 /srv/public
Um erro comum: em um diretório, r permite listar as entradas; x permite percorrer o diretório e acessar uma entrada nomeada. Remover x de um diretório costuma quebrar mais coisas do que se espera.
chown e chgrp
chown muda o dono (e, opcionalmente, o grupo). chgrp muda só o grupo; na prática usa-se chown para os dois porque ele aceita a forma dono:grupo.
# Muda só o dono.
sudo chown ryan app.log
# Muda dono e grupo.
sudo chown ryan:devs app.log
# Recursivo, com mudança explícita de grupo.
sudo chown -R ryan:devs /srv/app
Use -R com cuidado. chown recursivo numa árvore que contém links simbólicos pode produzir resultados surpreendentes; adicione -h para atuar sobre os próprios links em vez de seus destinos.
umask e as Permissões Padrão
Quando um arquivo novo é criado, o kernel aplica um modo padrão e, em seguida, o umask do shell remove bits dele. O modo padrão de criação costuma ser 0666 para arquivos e 0777 para diretórios.
$ umask
022
Um umask 022 significa: não remover nada do dono; remover escrita do grupo; remover escrita dos outros. Então:
- Arquivo novo:
0666 & ~022 = 0644→rw-r--r-- - Diretório novo:
0777 & ~022 = 0755→rwxr-xr-x
Para tornar novos arquivos graváveis pelo grupo por padrão, defina umask 002 (comum em servidores compartilhados, onde várias pessoas escrevem na mesma árvore).
Os Bits Especiais: setuid, setgid e Sticky
Três bits adicionais ficam à frente dos nove que você já conhece. São fáceis de perder porque aparecem nas posições de execução do dono, do grupo e dos outros, substituindo o x por s ou t.
setuid (4xxx)
Quando definido em um executável, o processo roda com o UID efetivo do dono do arquivo, em vez do usuário que o invocou. O exemplo canônico é o passwd:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59944 Feb 7 2025 /usr/bin/passwd
Aquele s no tripleto do dono é o setuid. É como um usuário comum consegue editar o /etc/shadow (que só o root pode ler) sem ser root. setuid é poderoso e perigoso — todo binário setuid-root privilegiado é uma escalação de privilégio esperando para acontecer se tiver um bug. Audite-os:
$ find /usr -perm -4000 -type f -exec ls -l {} \;
setgid (2xxx)
Em um executável, setgid faz o mesmo, mas para o grupo. Em um diretório, setgid tem um significado diferente e muito útil: qualquer arquivo criado dentro daquele diretório herda o grupo do diretório, em vez do grupo do usuário criador. É o mecanismo padrão para diretórios de projeto compartilhados.
sudo mkdir /srv/team
sudo chgrp devs /srv/team
sudo chmod 2775 /srv/team # setgid em um diretório
Bit Sticky (1xxx)
O bit sticky em um diretório diz que só o dono de um arquivo (ou o dono do diretório, ou o root) pode renomear ou apagar aquele arquivo. /tmp é o exemplo clássico:
$ ls -ld /tmp
drwxrwxrwt 25 root root 4096 Mar 22 09:12 /tmp
Aquele t ao final é o bit sticky. Sem ele, qualquer usuário poderia apagar arquivos de qualquer outro em /tmp — o que seria uma bagunça.
Definindo os Bits Especiais
Combine-os com o restante do modo octal. O primeiro dígito é o byte dos bits especiais:
# setuid + rwxr-xr-x → 4755
sudo chmod 4755 /opt/app/bin/privileged-helper
# setgid em um diretório, com rwxrwsr-x → 2775
sudo chmod 2775 /srv/team
# Bit sticky em /tmp (já definido por padrão) → 1777
sudo chmod 1777 /tmp
O modo simbólico é discutivelmente mais claro:
chmod u+s helper # setuid
chmod g+s /srv/team # setgid
chmod +t /tmp # sticky
Um Modelo Mental Rápido
rwxsão três bits por tripleto, três tripletos por arquivo.- Octal empacota cada tripleto em um dígito; o quarto dígito à esquerda (se presente) carrega os bits especiais.
- Em diretórios,
rpermite listar,xpermite percorrer,wpermite criar/apagar/renomear. - Os bits especiais (
setuid,setgid, sticky) modificam como o arquivo é executado ou como arquivos são criados dentro de um diretório.
Onde Ler Mais
A referência canônica é man 2 chmod e man 1 chmod. A página de manual do chmod no Linux é incomumente completa, e a seção File permissions da documentação do kernel explica os casos de borda (capacidades, ACLs, o que acontece em cadeias de symlinks) que este post deliberadamente omite. Se você trabalha com ACLs (getfacl / setfacl), o modelo se estende de forma limpa — mas isso é assunto para outro post.