Skip to content

Permissões no Linux

O sistema de permissões do Linux é um dos pilares da segurança em sistemas Unix-like. Ele define quem pode ler, escrever ou executar arquivos e diretórios, garantindo isolamento e controle de acesso entre usuários e processos.

Todo arquivo e diretório no Linux possui três informações de propriedade:

  • Dono (owner): o usuário que criou ou é responsável pelo arquivo
  • Grupo (group): o grupo associado ao arquivo
  • Outros (others): todos os demais usuários do sistema

Essas três categorias recebem permissões independentes, formando a base do modelo de controle de acesso tradicional do Linux.

Use o comando ls -l para visualizar as permissões de arquivos e diretórios:

Terminal window
$ ls -l
-rwxr-xr-- 1 fernando devs 4096 fev 10 14:30 script.sh
drwxr-x--- 2 fernando devs 4096 fev 10 14:30 projetos/
lrwxrwxrwx 1 root root 11 fev 10 14:30 link -> /etc/hosts

A primeira coluna contém 10 caracteres:

PosiçãoSignificado
1Tipo do arquivo (- arquivo, d diretório, l link simbólico, c dispositivo de caractere, b dispositivo de bloco)
2–4Permissões do dono
5–7Permissões do grupo
8–10Permissões dos outros

Exemplo detalhado de -rwxr-xr--:

- rwx r-x r--
│ │││ │││ │││
│ │││ │││ └┴┴─ outros: leitura apenas
│ │││ └┴┴───── grupo: leitura e execução
│ └┴┴───────── dono: leitura, escrita e execução
└───────────── tipo: arquivo regular
SímboloOctalArquivoDiretório
r4Ler o conteúdoListar arquivos (ls)
w2Modificar o conteúdoCriar, renomear e remover arquivos
x1Executar como programaEntrar no diretório (cd)
-0Sem permissãoSem permissão

As permissões podem ser representadas em notação octal, somando os valores de cada permissão para cada categoria:

rwx = 4+2+1 = 7
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4
--- = 0+0+0 = 0

Exemplos comuns:

OctalSimbólicoUso típico
777rwxrwxrwxAcesso total (evite!)
755rwxr-xr-xBinários e diretórios públicos
750rwxr-x---Scripts de grupo
644rw-r--r--Arquivos de configuração e documentos
640rw-r-----Arquivos sensíveis de grupo
600rw-------Chaves privadas, arquivos pessoais
400r--------Arquivos somente leitura (ex: chaves SSH)

O comando chmod (change mode) altera as permissões de arquivos e diretórios.

Terminal window
chmod [opções] modo arquivo
Terminal window
# Permissão completa para dono, leitura/execução para grupo e outros
chmod 755 script.sh
# Leitura/escrita para dono, somente leitura para demais
chmod 644 documento.txt
# Aplicar recursivamente em diretório
chmod -R 750 /var/www/meusite/

O modo simbólico usa letras para referenciar categorias e permissões:

CategoriaOperadorPermissão
u – dono+ adicionarr leitura
g – grupo- removerw escrita
o – outros= definir exatox execução
a – todos
Terminal window
# Adicionar execução para o dono
chmod u+x script.sh
# Remover escrita de grupo e outros
chmod go-w arquivo.txt
# Definir exatamente leitura e escrita para todos
chmod a=rw arquivo.txt
# Múltiplas alterações simultâneas
chmod u+x,g-w,o-r arquivo.sh

chown – Alterar dono (e opcionalmente grupo)

Section titled “chown – Alterar dono (e opcionalmente grupo)”
Terminal window
# Sintaxe
chown [opções] usuário[:grupo] arquivo
# Exemplos
chown fernando arquivo.txt # Altera apenas o dono
chown fernando:devs projeto/ # Altera o dono e o grupo
chown :devs arquivo.txt # Muda apenas o grupo
chown -R www-data:www-data /var/www/html/ # Altera o dono e o grupo de forma recursiva
Terminal window
chgrp devs arquivo.txt
chgrp -R docker /opt/containers/

O umask define as permissões padrão subtraídas ao criar novos arquivos e diretórios.

Terminal window
# Visualizar umask atual
umask
# Saída: 0022
# Visualizar em modo simbólico
umask -S
# Saída: u=rwx,g=rx,o=rx
Arquivo máximoDiretório máximoumaskResultado arquivoResultado diretório
Padrão666777022644755
Restritivo666777027640750
Privado666777077600700
Terminal window
# Alterar umask temporariamente (válido na sessão atual)
umask 027
# Para tornar permanente, adicione ao ~/.bashrc ou /etc/profile
echo "umask 027" >> ~/.bashrc

Além das permissões básicas rwx, o Linux oferece três permissões especiais que adicionam comportamentos avançados.

Quando o bit SUID está ativo em um arquivo executável, ele é executado com os privilégios do dono do arquivo, e não do usuário que o executou.

Terminal window
# Visualizar: 's' no lugar do 'x' do dono
-rwsr-xr-x 1 root root 44664 fev 1 12:00 /usr/bin/passwd
# Definir SUID
chmod u+s arquivo
chmod 4755 arquivo
# Remover SUID
chmod u-s arquivo

Exemplo prático: O comando passwd precisa modificar /etc/shadow (que pertence ao root). Com SUID, qualquer usuário pode executá-lo e ele opera com privilégios de root temporariamente.

Terminal window
# Localizar arquivos com SUID no sistema
find / -perm -4000 -type f 2>/dev/null

O bit SGID tem dois comportamentos distintos dependendo do tipo:

Em arquivos executáveis: o programa é executado com o GID do grupo do arquivo.

Terminal window
-rwxr-sr-x 1 root tty 14328 fev 1 12:00 /usr/bin/wall

Em diretórios: novos arquivos e subdiretórios criados dentro herdam o grupo do diretório pai, em vez do grupo primário do criador.

Terminal window
# Visualizar: 's' no lugar do 'x' do grupo
drwxrwsr-x 2 root devs 4096 fev 10 14:30 /projetos/
# Definir SGID
chmod g+s diretorio/
chmod 2775 diretorio/
# Remover SGID
chmod g-s diretorio/

Caso de uso típico: Diretórios compartilhados por equipes, todos os arquivos criados no diretório pertencem automaticamente ao grupo da equipe, facilitando a colaboração.

Terminal window
# Criar diretório compartilhado para a equipe devs
mkdir /projetos/webapp
chown :devs /projetos/webapp
chmod 2775 /projetos/webapp
Terminal window
# Localizar diretórios com SGID
find / -perm -2000 -type d 2>/dev/null

Em diretórios, o Sticky Bit impede que usuários excluam ou renomeiem arquivos de outros usuários, mesmo que tenham permissão de escrita no diretório.

Terminal window
# Visualizar: 't' no lugar do 'x' dos outros
drwxrwxrwt 10 root root 4096 fev 10 15:00 /tmp/
# Definir Sticky Bit
chmod o+t diretorio/
chmod 1777 diretorio/
# Remover Sticky Bit
chmod o-t diretorio/

Exemplo clássico: O diretório /tmp permite que qualquer usuário crie arquivos, mas só o dono (ou root) pode excluir seus próprios arquivos.

Terminal window
# Testar comportamento
ls -ld /tmp
# drwxrwxrwt 10 root root 4096 fev 10 15:00 /tmp
BitOctalArquivoDiretórioSímbolo
SUID4000Executa como dono do arquivoSem efeito práticos na posição do x do dono
SGID2000Executa como grupo do arquivoNovos arquivos herdam o grupos na posição do x do grupo
Sticky1000Sem efeito práticoSó dono remove seus arquivost na posição do x dos outros

Combinando Permissões Especiais com Octal

Section titled “Combinando Permissões Especiais com Octal”

O dígito especial é colocado antes dos três dígitos normais:

Terminal window
chmod 4755 arquivo # SUID + rwxr-xr-x
chmod 2775 diretorio # SGID + rwxrwxr-x
chmod 1777 /tmp # Sticky + rwxrwxrwx
chmod 6755 arquivo # SUID + SGID + rwxr-xr-x

O modelo clássico de permissões do Linux (dono, grupo e outros) funciona bem na maioria dos casos, mas tem uma limitação importante: ele não permite definir permissões diferentes para dois usuários distintos no mesmo arquivo.

Imagine a situação: você tem um arquivo relatorio.pdf que pertence a você (fernando) e ao grupo devs. A ana, que é do time de marketing, precisa apenas ler o arquivo, mas ela não está no grupo devs e você não quer adicioná-la só por isso.

Com permissões tradicionais, a única opção seria abrir o acesso para “outros”, o que daria leitura para qualquer pessoa do sistema. Não é o ideal.

É exatamente para isso que existem as ACLs (Access Control Lists): elas permitem adicionar entradas de permissão individuais para usuários e grupos específicos, sem alterar o modelo principal.

Antes de usar ACLs, confirme que o sistema de arquivos foi montado com suporte a elas:

Terminal window
# Verificar opções de montagem
mount | grep acl
# Ou verificar as opções padrão da partição
tune2fs -l /dev/sda1 | grep "Default mount options"

O comando getfacl exibe todas as permissões de um arquivo, incluindo as entradas ACL:

Terminal window
getfacl relatorio.pdf

Saída antes de configurar qualquer ACL:

relatorio.pdf
# owner: fernando
# group: devs
user::rw- # permissões do dono (fernando)
group::r-- # permissões do grupo (devs)
other::--- # permissões dos outros

Cada linha user::, group:: e other:: representa as permissões clássicas. Quando adicionarmos entradas ACL, elas aparecerão como linhas extras com o nome do usuário ou grupo.

A sintaxe básica do setfacl para adicionar (-m de modify) uma entrada é:

Terminal window
setfacl -m u:usuário:permissões arquivo
setfacl -m g:grupo:permissões arquivo

Exemplo do cenário descrito acima:

Terminal window
# Dar leitura à ana, sem alterar mais nada
setfacl -m u:ana:r-- relatorio.pdf

Agora veja a saída do getfacl:

relatorio.pdf
# owner: fernando
# group: devs
user::rw-
user:ana:r-- # ← entrada ACL adicionada para ana
group::r--
mask::r--
other::---

A linha user:ana:r-- é a entrada ACL. Perceba também o surgimento da linha mask, ela define o limite máximo de permissões que qualquer entrada ACL pode ter. Falaremos sobre ela a seguir.

Após definir uma ACL, o ls -l passa a exibir um + ao final das permissões, indicando que existem entradas extras:

Terminal window
ls -l relatorio.pdf
-rw-r-----+ 1 fernando devs 0 fev 10 14:30 relatorio.pdf
# ↑ sinal de que há ACL configurada
Terminal window
# Dar leitura e escrita a um usuário específico
setfacl -m u:joao:rw arquivo.txt
# Dar leitura a um grupo inteiro (sem adicioná-lo como grupo do arquivo)
setfacl -m g:marketing:r-- relatorio.pdf
# Aplicar múltiplas entradas de uma vez
setfacl -m u:ana:r,g:auditoria:r arquivo.txt

A mask é criada automaticamente quando a primeira ACL é adicionada. Ela funciona como um teto de permissões, nenhuma entrada ACL de usuário ou grupo pode ter mais permissões do que a mask permite.

Terminal window
# Ver a mask atual
getfacl arquivo.txt | grep mask
# Redefinir a mask manualmente
setfacl -m mask::r-- arquivo.txt

Você pode definir uma ACL padrão em um diretório com -d. Isso faz com que todos os arquivos e subdiretórios criados dentro dele herdem automaticamente aquelas permissões:

Terminal window
# Todo arquivo criado em /projetos/webapp herdará leitura+escrita para joao
setfacl -d -m u:joao:rw /projetos/webapp/
# Verificar as ACLs padrão (aparecem com "default:" no prefixo)
getfacl /projetos/webapp/
# default:user:joao:rw-
Terminal window
# Remover a entrada ACL de um usuário específico
setfacl -x u:ana relatorio.pdf
# Remover a entrada ACL de um grupo específico
setfacl -x g:marketing relatorio.pdf
# Remover TODAS as ACLs do arquivo (volta ao modelo clássico)
setfacl -b arquivo.txt
# Aplicar remoção recursivamente em um diretório
setfacl -R -b /projetos/webapp/
OpçãoDescrição
-m u:user:rwxAdicionar/modificar permissão para usuário
-m g:grupo:rwxAdicionar/modificar permissão para grupo
-m mask::rwxDefinir a máscara de permissões
-x u:userRemover entrada ACL de um usuário
-x g:grupoRemover entrada ACL de um grupo
-bRemover todas as ACLs
-dAplicar como ACL padrão (em diretórios)
-RAplicar recursivamente

As permissões do Linux, mesmo as ACLs, ainda podem ser alteradas por um usuário root. O chattr vai um nível abaixo: ele define atributos no próprio sistema de arquivos que se aplicam a todos, inclusive ao root.

O caso de uso mais comum é tornar um arquivo imutável, protegendo arquivos críticos de sistema contra modificação acidental ou maliciosa.

Terminal window
# Tornar o arquivo imutável
# Mesmo o root não pode modificar, renomear ou excluir
chattr +i /etc/resolv.conf
# Tentar modificar resultará em erro:
# chattr: Operation not permitted while setting flags on /etc/resolv.conf
# Remover a imutabilidade
chattr -i /etc/resolv.conf
# Modo append-only: só permite adicionar conteúdo ao final
# Útil para arquivos de log que não devem ser truncados
chattr +a /var/log/meuapp.log
Terminal window
lsattr /etc/resolv.conf
# ----i--------e-- /etc/resolv.conf
# ↑ atributo 'i' (imutável) está ativo

Os atributos são exibidos em posições fixas. Um - indica que o atributo não está ativo; uma letra indica que está ativo (veja abaixo).

AtributoLetraDescrição
ImutáveliNenhuma operação é permitida: nem escrita, nem renomeação, nem exclusão, nem pelo root
Append onlyaSó permite adicionar conteúdo ao final do arquivo; não pode ser sobrescrito nem truncado
Extent formateIndica que o arquivo usa extents (padrão em ext4, não precisa ser gerenciado manualmente)
Secure deletesAo excluir, sobrescreve os blocos com zeros antes de liberar o espaço
Terminal window
# Proteger arquivos críticos de configuração de rede
chattr +i /etc/hosts
chattr +i /etc/resolv.conf
# Garantir integridade de logs (ninguém pode apagar, só adicionar)
chattr +a /var/log/auth.log
chattr +a /var/log/syslog

Princípio do menor privilégio: conceda apenas as permissões necessárias para cada função.

Terminal window
# Verificar arquivos com permissões excessivas no home
find /home -perm -o+w -type f
# Arquivos de configuração sensíveis devem ser 600 ou 640
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
# Diretório .ssh com permissão correta
chmod 700 ~/.ssh/

Auditoria de permissões especiais:

Terminal window
# Listar todos os arquivos SUID
find / -perm -4000 -type f -ls 2>/dev/null
# Listar todos os arquivos SGID
find / -perm -2000 -type f -ls 2>/dev/null
# Arquivos world-writable (escrita por todos)
find / -perm -o+w -not -type l -ls 2>/dev/null

Verificando dono e grupo corretos em serviços:

Terminal window
# Arquivos do Apache devem pertencer ao www-data
ls -la /var/www/html/
# Corrigir permissões de aplicação web
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/html/

ComandoDescrição
ls -lListar arquivos com permissões
chmod modo arquivoAlterar permissões
chown user:grupo arquivoAlterar dono e grupo
chgrp grupo arquivoAlterar apenas o grupo
umaskVer/definir permissão padrão
getfacl arquivoVer ACLs do arquivo
setfacl -m ... arquivoDefinir ACL
lsattr arquivoVer atributos especiais
chattr +i arquivoTornar arquivo imutável
find / -perm -4000Localizar arquivos com SUID