Linux: Permissões de Arquivo
O Linux é um sistema operacional multiusuário. Permissões de arquivo são a base do seu modelo de segurança — controlam quem pode ler, escrever e executar cada arquivo e diretório.
📋 Pré-requisitos: Você deve primeiro concluir
- Aula 4: Navegação no Sistema de Arquivos
- Aula 5: Operações com Arquivos e Diretórios
1. O Que Você Vai Aprender
- Modelo de permissões rwx explicado
- Notação numérica do chmod (755/644/700)
- Notação simbólica do chmod (u/g/o/a +-=)
- chown para mudar dono e grupo
- Permissões padrão do umask
- Permissões especiais: SUID / SGID / Sticky Bit
2. A História do "Permission denied"
(1) O Problema: Um Script Que Não Roda
Alex escreveu um script deploy.sh, mas ao tentar executá-lo:
./deploy.sh
# bash: ./deploy.sh: Permission denied
Ele verificou as permissões do arquivo:
ls -l deploy.sh
# -rw-r--r-- 1 charlie charlie 50 Jul 7 10:23 deploy.sh
(2) Adicionando Permissão de Execução
Bob disse: "Seu script tem permissão de leitura e escrita, mas não tem permissão de execução. Basta adicionar +x."
chmod +x deploy.sh
ls -l deploy.sh
# -rwxr-xr-x 1 charlie charlie 50 Jul 7 10:23 deploy.sh
./deploy.sh # Agora funciona!
(3) O Benefício: Compreender o Sistema de Permissões do Linux
Alex agora entendia o que chmod +x significa. Mais importante, ele começou a entender por que o Linux é seguro — cada arquivo e cada usuário tem fronteiras claras de permissão.
3. Pontos-Chave
(1) O Modelo de Permissões rwx
A primeira coluna da saída de ls -l traz as informações de permissão. Por exemplo, -rwxr-xr-x:
- rwx r-x r-x
│ └┬─┘ └┬─┘ └┬─┘
│ │ │ └─── Permissões dos outros (other)
│ │ └─────── Permissões do grupo (group)
│ └──────────── Permissões do dono (user)
└──────────────── Tipo de arquivo (- arquivo comum / d diretório / l link)
Significado dos três bits de permissão:
| Permissão | Caractere | Numérico | Para arquivos | Para diretórios |
|---|---|---|---|---|
| Leitura | r | 4 | Ver o conteúdo do arquivo | Listar o conteúdo do diretório (ls) |
| Escrita | w | 2 | Modificar o conteúdo do arquivo | Criar/excluir arquivos dentro do diretório |
| Execução | x | 1 | Executar o arquivo (script/programa) | Entrar no diretório (cd nele) |
(2) Notação Numérica do chmod
Três dígitos correspondem às permissões de Usuário / Grupo / Outros:
| Número | Binário | Permissões |
|---|---|---|
| 7 | 111 | rwx (leitura+escrita+execução) |
| 6 | 110 | rw- (leitura+escrita) |
| 5 | 101 | r-x (leitura+execução) |
| 4 | 100 | r-- (somente leitura) |
| 3 | 011 | -wx (escrita+execução) |
| 2 | 010 | -w- (somente escrita) |
| 1 | 001 | --x (somente execução) |
| 0 | 000 | --- (sem permissões) |
Combinações comuns de permissão:
chmod 755 script.sh # rwxr-xr-x O dono pode ler/escrever/executar, outros podem ler/executar
chmod 644 arquivo.txt # rw-r--r-- O dono pode ler/escrever, outros somente leem
chmod 700 privado.sh # rwx------ Apenas o dono pode operar
chmod 600 segredo.txt # rw------- Apenas o dono pode ler/escrever
chmod 777 publico/ # rwxrwxrwx Qualquer pessoa pode operar (⚠️ inseguro)
chmod 777 permite que todos os usuários leiam, escrevam e executem o arquivo, o que é extremamente perigoso em um servidor — se qualquer conta for comprometida, o invasor pode modificar esse arquivo. Nunca use 777 em produção; use permissões de grupo (por exemplo, 775) ou ACLs para acesso compartilhado.
(3) Notação Simbólica do chmod
# Sintaxe: chmod [quem][operação][permissão] arquivo
# Quem: u (dono) / g (grupo) / o (outros) / a (todos)
# Operação: + (adicionar) / - (remover) / = (definir exatamente)
chmod u+x script.sh # Adiciona permissão de execução para o dono
chmod g-w arquivo.txt # Remove permissão de escrita do grupo
chmod o-r privado.txt # Remove permissão de leitura dos outros
chmod a+x script.sh # Adiciona permissão de execução para todos
chmod u=rwx,g=rx,o=r # Equivalente a 754
(4) chown — Mudar Dono e Grupo
# Mudar o dono do arquivo
sudo chown alice arquivo.txt
# Mudar o grupo do arquivo
sudo chown :desenvolvedores arquivo.txt
# Mudar dono e grupo
sudo chown alice:desenvolvedores arquivo.txt
# Mudar recursivamente um diretório e seu conteúdo
sudo chown -R alice:desenvolvedores /srv/projeto/
(5) umask — Máscara de Permissão Padrão
Ao criar um novo arquivo ou diretório, o Linux subtrai o valor de umask para determinar as permissões padrão.
# Ver o umask atual
umask
# Saída: 0022
# Cálculo de permissões padrão:
# Máximo para arquivo: 666 (rw-rw-rw-)
# Máximo para diretório: 777 (rwxrwxrwx)
# Subtrair umask 022:
# Padrão para arquivo: 666 - 022 = 644 (rw-r--r--)
# Padrão para diretório: 777 - 022 = 755 (rwxr-xr-x)
# Alterar umask
umask 007 # Permissões padrão mais restritas
umask 000 # Todos os usuários podem escrever (inseguro)
(6) Permissões Especiais
| Permissão especial | Numérico | Efeito em arquivos | Efeito em diretórios |
|---|---|---|---|
| SUID | 4xxx | Executa como o dono do arquivo | (nenhum) |
| SGID | 2xxx | Executa como o grupo do arquivo | Novos arquivos herdam o grupo do diretório |
| Sticky Bit | 1xxx | (nenhum) | Apenas o dono do arquivo pode excluí-lo |
/usr/bin/passwd) e faça auditoria regular dos arquivos SUID no sistema: find / -perm -4000 -type f 2>/dev/null
# Definir SUID (4)
chmod u+s /usr/bin/passwd # passwd roda como root
chmod 4755 /usr/bin/programa # Notação numérica para SUID
# Definir SGID (2)
chmod g+s /srv/compartilhado # Arquivos criados nesse diretório herdam o grupo
chmod 2775 /srv/compartilhado # Notação numérica para SGID
# Definir Sticky Bit (1)
chmod +t /tmp # Apenas o dono do arquivo pode excluir
chmod 1777 /tmp # Permissão padrão para /tmp
(7) ▶ Exemplo: Ver Permissões de Arquivos
# Ver permissões em formato longo
ls -l /etc/passwd
# -rw-r--r-- 1 root root 2845 Jul 7 10:23 /etc/passwd
# Ver permissões de diretório
ls -ld /tmp
# drwxrwxrwt 1 root root 4096 Jul 7 10:23 /tmp
# O t no final indica o Sticky Bit
# Ver permissões recursivamente em diretório
ls -laR /srv/projeto | head -20
Saída:
TEXT/srv/projeto: total 16 drwxr-xr-x 3 alice desenvolvedores 4096 Jul 7 10:23 . drwxr-xr-x 4 root root 4096 Jul 7 09:00 .. -rw-r--r-- 1 alice desenvolvedores 256 Jul 7 10:23 config.yaml -rwxr-xr-x 1 alice desenvolvedores 512 Jul 7 10:23 deploy.sh drwxr-xr-x 2 alice desenvolvedores 4096 Jul 7 10:23 src
(8) ▶ Exemplo: Notação Numérica do chmod
# 755 — permissão padrão para scripts
chmod 755 deploy.sh
ls -l deploy.sh
# -rwxr-xr-x
# 644 — permissão padrão para arquivos
chmod 644 index.html
ls -l index.html
# -rw-r--r--
# 600 — arquivo privado
chmod 600 privado.key
ls -l privado.key
# -rw-------
Saída:
TEXT-rwxr-xr-x 1 alice desenvolvedores 512 Jul 7 10:23 deploy.sh -rw-r--r-- 1 alice desenvolvedores 256 Jul 7 10:23 index.html -rw------- 1 alice desenvolvedores 128 Jul 7 10:23 privado.key
(9) ▶ Exemplo: Notação Simbólica do chmod
# Adicionar permissão de execução
chmod +x script.sh # Adiciona +x para todos (equivalente a a+x)
# Adicionar permissão de execução apenas para o dono
chmod u+x script.sh
# Remover permissão de escrita do grupo e outros
chmod go-w config.txt
# Definir permissões padrão para um script Shell
chmod u=rwx,g=rx,o=r script.sh
# Equivalente a chmod 755 script.sh
Saída:
TEXT-rwxr-xr-- 1 alice desenvolvedores 512 Jul 7 10:23 script.sh
(10) ▶ Exemplo: chown para Mudar o Dono
# Mudar o dono do arquivo
sudo chown www-data index.html
# Mudar o grupo
sudo chown :www-data /srv/www/
# Mudar dono e grupo
sudo chown alice:desenvolvedores projeto/
# Mudar recursivamente toda a árvore de diretórios
sudo chown -R alice:alice ~alice/
Saída:
TEXT-rw-r--r-- 1 www-data www-data 256 Jul 7 10:23 index.html drwxr-xr-x 2 www-data www-data 4096 Jul 7 10:23 /srv/www/ drwxr-xr-x 3 alice desenvolvedores 4096 Jul 7 10:23 projeto/
(11) ▶ Exemplo: umask na Prática
# Ver o umask atual
umask
# Saída: 0022
# Criar um novo arquivo para testar
touch teste.txt
ls -l teste.txt
# -rw-r--r-- ← 644 (666 - 022)
mkdir testdir
ls -ld testdir
# drwxr-xr-x ← 755 (777 - 022)
# Criar após mudar o umask
umask 0077
touch segredo.txt
ls -l segredo.txt
# -rw------- ← 600 (666 - 077)
Saída:
TEXT0022 -rw-r--r-- 1 alice alice 0 Jul 7 10:23 teste.txt drwxr-xr-x 2 alice alice 4096 Jul 7 10:23 testdir -rw------- 1 alice alice 0 Jul 7 10:23 segredo.txt
(12) ▶ Exemplo Abrangente: Configurações Corretas de Permissão para uma Aplicação Web
# Suponha que /var/www/myapp seja o diretório da aplicação web
# 1. Definir dono e grupo
sudo chown -R www-data:www-data /var/www/myapp
# 2. Permissões de diretório: 755 (dono lê/escreve/executa, outros leem/executam)
find /var/www/myapp -type d -exec chmod 755 {} \;
# 3. Permissões de arquivo: 644 (dono lê/escreve, outros somente leem)
find /var/www/myapp -type f -exec chmod 644 {} \;
# 4. Scripts executáveis: 755
chmod 755 /var/www/myapp/deploy.sh
# 5. Arquivos sensíveis: 600
chmod 600 /var/www/myapp/.env
# 6. Diretório de upload: diretório gravável
chmod 775 /var/www/myapp/uploads
❓ Perguntas Frequentes
P: Por que
chmod 777é inseguro? R:chmod 777permite que todos os usuários leiam, escrevam e executem o arquivo. Se qualquer conta for comprometida, o invasor pode modificar ou excluir o arquivo, criando risco de escalonamento de privilégios. Em produção, use permissões de grupo (por exemplo, 775) ou ACLs para acesso compartilhado em vez de 777.
P: Por que arquivos recém-criados são 644 por padrão, e não 755? R: Por causa do princípio de segurança — arquivos novos não recebem permissão de execução por padrão. O Linux presume que a maioria dos arquivos não precisa de permissão de execução; se você precisar, adicione explicitamente com
chmod +x.
P: Por que não consigo escrever em
/etcapós login SSH? R:/etcpertence ao root, e usuários comuns só têm permissão de leitura (r-x). Para modificar arquivos sob/etc, é preciso usarsudopara obter privilégios elevados. É um design de segurança que protege o sistema.
P: Quais são os riscos de programas com SUID? R: Programas com SUID rodam com as permissões do dono (geralmente root). Se um programa com SUID tiver uma vulnerabilidade, um usuário comum pode escalar privilégios até root. Portanto, defina SUID apenas em programas necessários (como
passwd,ping) e faça auditoria regular.
P:
chmod -R 755é seguro para mudanças recursivas de diretório? R: Depende. Se o diretório contém scripts, 755 é razoável. Mas usarfindpara definir permissões diferentes para arquivos (644) e diretórios (755) é mais seguro e preciso.
📖 Resumo
- Primeira coluna de
ls -l:-rwxr-xr-x= tipo de arquivo + dono/grupo/outros × rwx - chmod numérico:
755para scripts,644para arquivos,600para arquivos privados - chmod simbólico:
u+xadiciona execução para o dono,go-wremove escrita do grupo e outros - chown muda o dono (
alice:desenvolvedores), use-Rpara recursivo - umask controla permissões padrão; valores comuns: 022 (644/755), 077 (600/700)
- Permissões especiais: SUID (4) herda o dono, SGID (2) herda o grupo, Sticky Bit (1) impede exclusão
📝 Exercícios
- Básico (Dificuldade ⭐): Crie um script, adicione permissão de execução com
chmod +xe execute-o; depois use notação numérica para definir um arquivo como 644 e um diretório como 755 - Intermediário (Dificuldade ⭐⭐): Use notação simbólica para remover todas as permissões de grupo e outros de um arquivo, depois crie um usuário de teste (
sudo useradd testuser) e usechownpara transferir a posse do arquivo para esse usuário - Avançado (Dificuldade ⭐⭐⭐): Crie um diretório compartilhado, defina SGID (
chmod g+s) para que novos arquivos herdem o grupo, e usefind+chmodpara definir em lote os arquivos de um projeto web como 644 e os diretórios como 755