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.
Conceitos Fundamentais
Section titled “Conceitos Fundamentais”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.
Visualizando Permissões
Section titled “Visualizando Permissões”Use o comando ls -l para visualizar as permissões de arquivos e diretórios:
$ ls -l-rwxr-xr-- 1 fernando devs 4096 fev 10 14:30 script.shdrwxr-x--- 2 fernando devs 4096 fev 10 14:30 projetos/lrwxrwxrwx 1 root root 11 fev 10 14:30 link -> /etc/hostsInterpretando a saída
Section titled “Interpretando a saída”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 regularOs Três Tipos de Permissão
Section titled “Os Três Tipos de Permissão”| 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 |
Representação Octal
Section titled “Representação Octal”As permissões podem ser representadas em notação octal, somando os valores de cada permissão para cada categoria:
rwx = 4+2+1 = 7r-x = 4+0+1 = 5r-- = 4+0+0 = 4--- = 0+0+0 = 0Exemplos 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) |
Alterando Permissões com chmod
Section titled “Alterando Permissões com chmod”O comando chmod (change mode) altera as permissões de arquivos e diretórios.
Sintaxe
Section titled “Sintaxe”chmod [opções] modo arquivoModo Octal
Section titled “Modo Octal”# Permissão completa para dono, leitura/execução para grupo e outroschmod 755 script.sh
# Leitura/escrita para dono, somente leitura para demaischmod 644 documento.txt
# Aplicar recursivamente em diretóriochmod -R 750 /var/www/meusite/Modo Simbólico
Section titled “Modo Simbólico”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 |
# Adicionar execução para o donochmod u+x script.sh
# Remover escrita de grupo e outroschmod go-w arquivo.txt
# Definir exatamente leitura e escrita para todoschmod a=rw arquivo.txt
# Múltiplas alterações simultâneaschmod u+x,g-w,o-r arquivo.shAlterando Dono e Grupo com chown e chgrp
Section titled “Alterando Dono e Grupo com chown e chgrp”chown – Alterar dono (e opcionalmente grupo)
Section titled “chown – Alterar dono (e opcionalmente grupo)”# Sintaxechown [opções] usuário[:grupo] arquivo
# Exemploschown fernando arquivo.txt # Altera apenas o donochown fernando:devs projeto/ # Altera o dono e o grupochown :devs arquivo.txt # Muda apenas o grupochown -R www-data:www-data /var/www/html/ # Altera o dono e o grupo de forma recursivachgrp – Alterar apenas o grupo
Section titled “chgrp – Alterar apenas o grupo”chgrp devs arquivo.txtchgrp -R docker /opt/containers/Permissão Padrão: umask
Section titled “Permissão Padrão: umask”O umask define as permissões padrão subtraídas ao criar novos arquivos e diretórios.
# Visualizar umask atualumask# Saída: 0022
# Visualizar em modo simbólicoumask -S# Saída: u=rwx,g=rx,o=rxComo o umask funciona
Section titled “Como o umask funciona”| 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 |
# Alterar umask temporariamente (válido na sessão atual)umask 027
# Para tornar permanente, adicione ao ~/.bashrc ou /etc/profileecho "umask 027" >> ~/.bashrcPermissões Especiais
Section titled “Permissões Especiais”Além das permissões básicas rwx, o Linux oferece três permissões especiais que adicionam comportamentos avançados.
SUID – Set User ID (4xxx)
Section titled “SUID – Set User ID (4xxx)”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.
# Visualizar: 's' no lugar do 'x' do dono-rwsr-xr-x 1 root root 44664 fev 1 12:00 /usr/bin/passwd
# Definir SUIDchmod u+s arquivochmod 4755 arquivo
# Remover SUIDchmod u-s arquivoExemplo 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.
# Localizar arquivos com SUID no sistemafind / -perm -4000 -type f 2>/dev/nullSGID – Set Group ID (2xxx)
Section titled “SGID – Set Group ID (2xxx)”O bit SGID tem dois comportamentos distintos dependendo do tipo:
Em arquivos executáveis: o programa é executado com o GID do grupo do arquivo.
-rwxr-sr-x 1 root tty 14328 fev 1 12:00 /usr/bin/wallEm diretórios: novos arquivos e subdiretórios criados dentro herdam o grupo do diretório pai, em vez do grupo primário do criador.
# Visualizar: 's' no lugar do 'x' do grupodrwxrwsr-x 2 root devs 4096 fev 10 14:30 /projetos/
# Definir SGIDchmod g+s diretorio/chmod 2775 diretorio/
# Remover SGIDchmod 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.
# Criar diretório compartilhado para a equipe devsmkdir /projetos/webappchown :devs /projetos/webappchmod 2775 /projetos/webapp# Localizar diretórios com SGIDfind / -perm -2000 -type d 2>/dev/nullSticky Bit (1xxx)
Section titled “Sticky Bit (1xxx)”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.
# Visualizar: 't' no lugar do 'x' dos outrosdrwxrwxrwt 10 root root 4096 fev 10 15:00 /tmp/
# Definir Sticky Bitchmod o+t diretorio/chmod 1777 diretorio/
# Remover Sticky Bitchmod 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.
# Testar comportamentols -ld /tmp# drwxrwxrwt 10 root root 4096 fev 10 15:00 /tmpTabela Resumo das Permissões Especiais
Section titled “Tabela Resumo das Permissões Especiais”| 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:
chmod 4755 arquivo # SUID + rwxr-xr-xchmod 2775 diretorio # SGID + rwxrwxr-xchmod 1777 /tmp # Sticky + rwxrwxrwxchmod 6755 arquivo # SUID + SGID + rwxr-xr-xListas de Controle de Acesso (ACL)
Section titled “Listas de Controle de Acesso (ACL)”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.
Verificando suporte a ACL
Section titled “Verificando suporte a ACL”Antes de usar ACLs, confirme que o sistema de arquivos foi montado com suporte a elas:
# Verificar opções de montagemmount | grep acl
# Ou verificar as opções padrão da partiçãotune2fs -l /dev/sda1 | grep "Default mount options"Visualizando ACLs com getfacl
Section titled “Visualizando ACLs com getfacl”O comando getfacl exibe todas as permissões de um arquivo, incluindo as entradas ACL:
getfacl relatorio.pdfSaída antes de configurar qualquer ACL:
# owner: fernando# group: devsuser::rw- # permissões do dono (fernando)group::r-- # permissões do grupo (devs)other::--- # permissões dos outrosCada 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.
Adicionando permissões com setfacl
Section titled “Adicionando permissões com setfacl”A sintaxe básica do setfacl para adicionar (-m de modify) uma entrada é:
setfacl -m u:usuário:permissões arquivosetfacl -m g:grupo:permissões arquivoExemplo do cenário descrito acima:
# Dar leitura à ana, sem alterar mais nadasetfacl -m u:ana:r-- relatorio.pdfAgora veja a saída do getfacl:
# owner: fernando# group: devsuser::rw-user:ana:r-- # ← entrada ACL adicionada para anagroup::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:
ls -l relatorio.pdf-rw-r-----+ 1 fernando devs 0 fev 10 14:30 relatorio.pdf# ↑ sinal de que há ACL configuradaMais exemplos práticos
Section titled “Mais exemplos práticos”# Dar leitura e escrita a um usuário específicosetfacl -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 vezsetfacl -m u:ana:r,g:auditoria:r arquivo.txtEntendendo a máscara (mask)
Section titled “Entendendo a máscara (mask)”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.
# Ver a mask atualgetfacl arquivo.txt | grep mask
# Redefinir a mask manualmentesetfacl -m mask::r-- arquivo.txtACLs padrão em diretórios
Section titled “ACLs padrão em diretórios”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:
# Todo arquivo criado em /projetos/webapp herdará leitura+escrita para joaosetfacl -d -m u:joao:rw /projetos/webapp/
# Verificar as ACLs padrão (aparecem com "default:" no prefixo)getfacl /projetos/webapp/# default:user:joao:rw-Removendo ACLs
Section titled “Removendo ACLs”# Remover a entrada ACL de um usuário específicosetfacl -x u:ana relatorio.pdf
# Remover a entrada ACL de um grupo específicosetfacl -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óriosetfacl -R -b /projetos/webapp/Referência rápida do setfacl
Section titled “Referência rápida do setfacl”| 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 |
Atributos Imutáveis com chattr
Section titled “Atributos Imutáveis com chattr”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.
Definindo e removendo atributos
Section titled “Definindo e removendo atributos”# Tornar o arquivo imutável# Mesmo o root não pode modificar, renomear ou excluirchattr +i /etc/resolv.conf
# Tentar modificar resultará em erro:# chattr: Operation not permitted while setting flags on /etc/resolv.conf
# Remover a imutabilidadechattr -i /etc/resolv.conf
# Modo append-only: só permite adicionar conteúdo ao final# Útil para arquivos de log que não devem ser truncadoschattr +a /var/log/meuapp.logVisualizando atributos com lsattr
Section titled “Visualizando atributos com lsattr”lsattr /etc/resolv.conf# ----i--------e-- /etc/resolv.conf# ↑ atributo 'i' (imutável) está ativoOs 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).
Atributos mais comuns
Section titled “Atributos mais comuns”| 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 |
Quando usar chattr
Section titled “Quando usar chattr”# Proteger arquivos críticos de configuração de redechattr +i /etc/hostschattr +i /etc/resolv.conf
# Garantir integridade de logs (ninguém pode apagar, só adicionar)chattr +a /var/log/auth.logchattr +a /var/log/syslogBoas Práticas de Segurança
Section titled “Boas Práticas de Segurança”Princípio do menor privilégio: conceda apenas as permissões necessárias para cada função.
# Verificar arquivos com permissões excessivas no homefind /home -perm -o+w -type f
# Arquivos de configuração sensíveis devem ser 600 ou 640chmod 600 ~/.ssh/id_rsachmod 644 ~/.ssh/id_rsa.pub
# Diretório .ssh com permissão corretachmod 700 ~/.ssh/Auditoria de permissões especiais:
# Listar todos os arquivos SUIDfind / -perm -4000 -type f -ls 2>/dev/null
# Listar todos os arquivos SGIDfind / -perm -2000 -type f -ls 2>/dev/null
# Arquivos world-writable (escrita por todos)find / -perm -o+w -not -type l -ls 2>/dev/nullVerificando dono e grupo corretos em serviços:
# Arquivos do Apache devem pertencer ao www-datals -la /var/www/html/
# Corrigir permissões de aplicação webfind /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/Resumo dos Comandos
Section titled “Resumo dos Comandos”| 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 |