Permissões no Linux
Sistema rwx, notação octal e bits especiais, controle de acesso que todo profissional precisa dominar.
O sistema rwx: leitura, escrita, execução
Cada arquivo e diretório no Linux tem três tipos de permissão:
- r (read = 4) — leitura
- w (write = 2) — escrita
- x (execute = 1) — execução
O comportamento muda dependendo se é um arquivo ou diretório:
Para arquivos: r = pode ler o
conteúdo; w = pode modificar ou truncar;
x = pode executar como programa.
Para diretórios: r = pode listar os
arquivos com ls; w = pode criar,
renomear e deletar arquivos dentro; x = pode entrar
com cd e acessar arquivos se souber o nome.
Atenção: sem x em um diretório, você não consegue
entrar nele mesmo tendo r. E com x mas
sem r, você pode entrar e acessar arquivos cujos
nomes já conhece, mas não pode listar.
# Lendo permissões com ls -la
ls -la /etc/passwd
-rw-r--r-- 1 root root 2847 Mai 20 10:00 /etc/passwd
# Decompondo a string de permissões:
# - rw- r-- r--
# ↑ ↑ ↑ ↑
# | | | └── others: r-- (só leitura)
# | | └─────── group: r-- (só leitura)
# | └─────────── user: rw- (leitura e escrita)
# └───────────── tipo: - (arquivo regular)
# d (diretório)
# l (symlink)
# c (char device)
# b (block device)
# O arquivo pertence ao usuário root, grupo root
# 1 = número de hard links
# 2847 = tamanho em bytes
Permissões são como chaves e crachás em um prédio corporativo. O dono do arquivo é o funcionário que tem a chave do escritório — acesso total ao próprio espaço. O grupo é o departamento — membros têm acesso ao espaço compartilhado da equipe. Outros são visitantes externos — permissões mínimas, controladas.
O root é o segurança-geral: entra em qualquer lugar independentemente das chaves.
Usuário, Grupo e Outros
Cada arquivo tem exatamente três classes de permissões, aplicadas em ordem:
- user (u) — o dono do arquivo (UID). Verificado primeiro.
- group (g) — o grupo dono (GID). Verificado se o usuário não for o dono.
- others (o) — todos os demais. Aplicado se não for dono nem membro do grupo.
O kernel verifica as classes em ordem e para na primeira que corresponder. Se você for o dono do arquivo, apenas as permissões de user se aplicam — mesmo que as permissões de grupo sejam mais permissivas.
O usuário root (UID=0) ignora quase todas as restrições de permissão — exceto o bit de execute em arquivos sem nenhum x.
# Ver dono e grupo de um arquivo
ls -la projeto/
# drwxrwxr-x 2 joao devs 4096 Mai 20 ... projeto/
# ↑ ↑
# | └── grupo: devs
# └──────── dono: joao
# Ver grupos do usuário atual
id
# uid=1000(joao) gid=1000(joao) groups=1000(joao),27(sudo),1001(devs)
# Ver grupos de outro usuário
groups maria
# Arquivos criados por joao com grupo devs
# Membros do grupo devs têm as permissões de "group"
# Usuários fora de devs e que não são joao têm "others"
"Se meu grupo tem mais acesso, o kernel usa o grupo"
— errado. Se você for o dono, o kernel aplica as permissões de
user e ignora as de group. Um arquivo
---rwx--- (dono sem acesso, grupo com tudo) significa
que o dono não consegue acessar seu próprio arquivo — o grupo
pode, mas não o dono.
"Root precisa de x para executar" — root ignora bits r e w, mas para executar um arquivo, ao menos uma das classes precisa ter x definido.
Representação Octal
As permissões rwx podem ser representadas como números octais, onde cada permissão tem um valor:
- r = 4
- w = 2
- x = 1
- nenhuma = 0
Você soma os valores para cada classe (user, group, others) e obtém três dígitos octais:
- 7 = rwx (4+2+1) — tudo
- 6 = rw- (4+2+0) — leitura e escrita
- 5 = r-x (4+0+1) — leitura e execução
- 4 = r-- (4+0+0) — só leitura
- 0 = --- (0+0+0) — nada
Combinações mais comuns: 755 (rwxr-xr-x) para executáveis e diretórios públicos, 644 (rw-r--r--) para arquivos de texto, 700 (rwx------) para diretórios privados, 600 (rw-------) para arquivos privados (chaves SSH).
# Decodificando permissões octais:
# chmod 755 → rwxr-xr-x
# user: 7 = rwx (4+2+1)
# group: 5 = r-x (4+0+1)
# other: 5 = r-x (4+0+1)
# chmod 644 → rw-r--r--
# user: 6 = rw- (4+2+0)
# group: 4 = r-- (4+0+0)
# other: 4 = r-- (4+0+0)
# chmod 700 → rwx------
# user: 7 = rwx (4+2+1)
# group: 0 = --- (0+0+0)
# other: 0 = --- (0+0+0)
# chmod 600 → rw------- ← chaves SSH privadas
# user: 6 = rw- (4+2+0)
# group: 0 = ---
# other: 0 = ---
# Verificar: stat mostra octal diretamente
stat -c "%a %n" arquivo.txt
# 644 arquivo.txt
chmod, chown e chgrp na prática
chmod — muda as permissões de um arquivo ou diretório. Aceita notação octal ou simbólica.
Notação simbólica usa: classe (u=user,
g=group, o=others, a=all),
operador (+=adicionar, -=remover,
==definir exatamente) e permissões (r,
w, x).
chown — muda o dono e/ou grupo de um arquivo.
Requer root ou ser o dono. Use
chown usuario:grupo arquivo ou apenas
chown usuario arquivo. A flag -R aplica
recursivamente.
chgrp — muda apenas o grupo. Equivalente a
chown :grupo arquivo.
# chmod — notação octal
chmod 755 script.sh # rwxr-xr-x
chmod 644 config.txt # rw-r--r--
chmod 700 ~/.ssh # rwx------
chmod 600 ~/.ssh/id_rsa # rw------- (chave privada SSH)
# chmod — notação simbólica (não afeta outras permissões)
chmod u+x script.sh # adiciona execute para o dono
chmod g-w arquivo.txt # remove write do grupo
chmod o= arquivo.txt # remove TODAS permissões de others
chmod a+r arquivo.txt # adiciona read para todos (all)
chmod u+x,g+x script.sh # múltiplas mudanças de uma vez
# chown — mudar dono
chown joao arquivo.txt # muda só o dono
chown joao:devs arquivo.txt # muda dono e grupo
chown :devs arquivo.txt # muda só o grupo
chown -R www-data:www-data /var/www/html # recursivo
# Ver permissões do /etc/passwd
ls -la /etc/passwd
-rw-r--r-- 1 root root 2847 Mai 20 10:00 /etc/passwd
# Ver permissões de um diretório web típico
ls -la /var/www/html/
# drwxr-xr-x 2 www-data www-data 4096 ... /var/www/html/
chmod -R 777 /var/www — o erro
clássico de iniciante. Dar 777 a tudo significa que qualquer
usuário do sistema pode modificar qualquer arquivo do seu site. Em
servidores compartilhados, isso é crítico. Use 755 para
diretórios, 644 para arquivos, e 750/640 para áreas restritas.
Usar octal quando quer mudança incremental — se
você quer apenas adicionar execute sem alterar r e w, use
chmod +x, não chmod 755 (que sobrescreve
tudo).
Bits especiais: SUID, SGID e Sticky Bit
Além dos 9 bits rwx, existem três bits especiais que modificam o comportamento de execução e acesso:
SUID (Set User ID) — bit 4000
Quando ativo em um executável, o programa roda com as permissões
do dono do arquivo, não de quem o executou. Aparece como
s no lugar do x do user:
-rwsr-xr-x.
Exemplo clássico: /usr/bin/passwd precisa escrever em
/etc/shadow (arquivo só de root). Com SUID de root,
qualquer usuário pode mudar sua própria senha sem ter acesso root
direto.
SGID (Set Group ID) — bit 2000
Em executável: roda com permissões do grupo dono. Aparece como
s no x do grupo: -rwxr-sr-x.
Em diretório: arquivos criados herdam o grupo do diretório, não o grupo primário de quem criou. Muito útil para colaboração em equipe.
Sticky Bit — bit 1000
Em diretórios: usuários só podem deletar arquivos que são seus
próprios, mesmo que tenham permissão w no diretório.
Aparece como t no x de others:
drwxrwxrwt.
O /tmp sempre tem sticky bit — qualquer um cria
arquivos lá, mas só o dono (ou root) pode deletar o seu.
# SUID no passwd — qualquer usuário pode mudar sua senha
ls -la /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 Jan 15 ... /usr/bin/passwd
# ↑ 's' no lugar de 'x' do user = SUID ativo
# Sticky bit no /tmp
ls -ld /tmp
drwxrwxrwt 14 root root 4096 Mai 20 11:20 /tmp
# ↑ 't' no lugar de 'x' de others = sticky bit
# Ativar SUID em um executável
chmod u+s meu_programa # notação simbólica
chmod 4755 meu_programa # notação octal (4xxx)
# Ativar SGID em um diretório compartilhado
chmod g+s /equipe/projetos
# Arquivos criados aqui herdam o grupo de /equipe/projetos
# Ativar sticky bit
chmod +t /diretorio/compartilhado
chmod 1777 /tmp # rwxrwxrwt em octal = 1777
# Ver SUID/SGID — s maiúsculo = bit especial sem x correspondente
# -rwSr-xr-x → SUID ativo mas sem execute (S maiúsculo = incomum)
# -rwsr-xr-x → SUID ativo com execute (s minúsculo = normal)
# Encontrar todos os arquivos SUID do sistema
find / -perm -4000 -type f 2>/dev/null
Criar executáveis SUID desnecessariamente — SUID é um vetor de escalada de privilégios. Um binário SUID de root com vulnerabilidade pode comprometer o sistema inteiro. Auditores de segurança verificam todos os binários SUID como parte da análise.
Confundir S maiúsculo com s minúsculo —
S (maiúsculo) significa que o bit especial está ativo
mas o bit x correspondente não está — o que
geralmente indica um erro de configuração.
s (minúsculo) significa que ambos estão ativos.
- SUID (4xxx): executável roda como o dono — cuidado, é privilegiado
- SGID em dir (2xxx): novos arquivos herdam o grupo do diretório
- Sticky (1xxx): só o dono pode deletar seu arquivo no diretório
-
sminúsculo = bit especial + execute.Smaiúsculo = bit especial sem execute -
tminúsculo = sticky + execute.Tmaiúsculo = sticky sem execute
umask: a máscara de permissões padrão
Quando você cria um arquivo ou diretório, o sistema precisa definir suas permissões iniciais. A umask (user file creation mask) define quais permissões serão retiradas das permissões máximas padrão.
Permissões máximas padrão: 666 para arquivos (rw-rw-rw-) e 777 para diretórios (rwxrwxrwx). O kernel não cria arquivos com execute por padrão — daí o 666 em vez de 777 para arquivos.
A umask é subtraída dessas permissões máximas:
- umask 022 (mais comum): arquivos = 666 - 022 = 644 (rw-r--r--), diretórios = 777 - 022 = 755 (rwxr-xr-x)
- umask 027: arquivos = 640 (rw-r-----), diretórios = 750 (rwxr-x---)
- umask 077: arquivos = 600 (rw-------), diretórios = 700 (rwx------) — tudo privado
Ver a umask atual: comando umask. Configurar
permanentemente em ~/.bashrc ou
/etc/profile.
# Ver a umask atual
umask
# 0022
# Ver em formato simbólico
umask -S
# u=rwx,g=rx,o=rx
# Como a umask age:
# Permissão máxima para arquivo: 666 (rw-rw-rw-)
# Umask 022: - 022 (----w--w-)
# Resultado: 644 (rw-r--r--)
# Permissão máxima para diretório: 777 (rwxrwxrwx)
# Umask 022: - 022 (----w--w-)
# Resultado: 755 (rwxr-xr-x)
# Testar: criar arquivo e diretório
touch teste.txt && ls -la teste.txt
# -rw-r--r-- 1 joao joao 0 Mai 20 11:30 teste.txt
mkdir testedir && ls -ld testedir
# drwxr-xr-x 2 joao joao 4096 Mai 20 11:30 testedir
# Mudar umask temporariamente na sessão atual
umask 027
touch privado.txt && ls -la privado.txt
# -rw-r----- 1 joao joao 0 Mai 20 11:31 privado.txt
# Configurar permanentemente no .bashrc
echo "umask 022" >> ~/.bashrc
"umask 022 remove permissão de execução" — a umask age sobre as permissões máximas padrão. Para arquivos, o máximo já é 666 (sem execute), então a umask não afeta execute em arquivos. Para diretórios (max 777), a umask 022 remove apenas w de grupo e outros.
Confundir umask com chmod — umask é uma máscara
que define o padrão para arquivos novos. Não altera
arquivos existentes. Para arquivos já criados, use
chmod.
- umask é subtraída das permissões máximas (666 arquivos, 777 dirs)
- umask 022 → arquivos 644, diretórios 755 (padrão na maioria das distros)
- umask 027 → arquivos 640, diretórios 750 (mais restritivo, comum em servidores)
-
Configure em
~/.bashrc(usuário) ou/etc/profile(todos os usuários) - umask não afeta arquivos já existentes — apenas os criados depois