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ção | Significado | |---------|-------------| | 1 | Tipo do arquivo (- arquivo, d diretório, l link simbólico, c dispositivo de caractere, b dispositivo de bloco) | | 2–4 | Permissões do dono | | 5–7 | Permissões do grupo | | 8–10 | Permissõ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ímbolo | Octal | Arquivo | Diretório | |---------|-------|---------|-----------| | r | 4 | Ler o conteúdo | Listar arquivos (ls) | | w | 2 | Modificar o conteúdo | Criar, renomear e remover arquivos | | x | 1 | Executar como programa | Entrar no diretório (cd) | | - | 0 | Sem permissão | Sem 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:

| Octal | Simbólico | Uso típico | |-------|-----------|------------| | 777 | rwxrwxrwx | Acesso total (evite!) | | 755 | rwxr-xr-x | Binários e diretórios públicos | | 750 | rwxr-x--- | Scripts de grupo | | 644 | rw-r--r-- | Arquivos de configuração e documentos | | 640 | rw-r----- | Arquivos sensíveis de grupo | | 600 | rw------- | Chaves privadas, arquivos pessoais | | 400 | r-------- | 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:

| Categoria | Operador | Permissão | |-----------|----------|-----------| | u – dono | + adicionar | r leitura | | g – grupo | - remover | w escrita | | o – outros | = definir exato | x 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áximo | Diretório máximo | umask | Resultado arquivo | Resultado diretório | |—|----------------|-----------------|-------|------------------|---------------------| | Padrão | 666 | 777 | 022 | 644 | 755 | | Restritivo | 666 | 777 | 027 | 640 | 750 | | Privado | 666 | 777 | 077 | 600 | 700 |

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

| Bit | Octal | Arquivo | Diretório | Símbolo | |-----|-------|---------|-----------|---------| | SUID | 4000 | Executa como dono do arquivo | Sem efeito prático | s na posição do x do dono | | SGID | 2000 | Executa como grupo do arquivo | Novos arquivos herdam o grupo | s na posição do x do grupo | | Sticky | 1000 | Sem efeito prático | Só dono remove seus arquivos | t 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ção | Descrição | |-------|-----------| | -m u:user:rwx | Adicionar/modificar permissão para usuário | | -m g:grupo:rwx | Adicionar/modificar permissão para grupo | | -m mask::rwx | Definir a máscara de permissões | | -x u:user | Remover entrada ACL de um usuário | | -x g:grupo | Remover entrada ACL de um grupo | | -b | Remover todas as ACLs | | -d | Aplicar como ACL padrão (em diretórios) | | -R | Aplicar 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).

| Atributo | Letra | Descrição | |----------|-------|-----------| | Imutável | i | Nenhuma operação é permitida: nem escrita, nem renomeação, nem exclusão, nem pelo root | | Append only | a | Só permite adicionar conteúdo ao final do arquivo; não pode ser sobrescrito nem truncado | | Extent format | e | Indica que o arquivo usa extents (padrão em ext4, não precisa ser gerenciado manualmente) | | Secure delete | s | Ao 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/

| Comando | Descrição | |---------|-----------| | ls -l | Listar arquivos com permissões | | chmod modo arquivo | Alterar permissões | | chown user:grupo arquivo | Alterar dono e grupo | | chgrp grupo arquivo | Alterar apenas o grupo | | umask | Ver/definir permissão padrão | | getfacl arquivo | Ver ACLs do arquivo | | setfacl -m ... arquivo | Definir ACL | | lsattr arquivo | Ver atributos especiais | | chattr +i arquivo | Tornar arquivo imutável | | find / -perm -4000 | Localizar arquivos com SUID |