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

1. O Que Você Vai Aprender


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:

BASH
./deploy.sh
# bash: ./deploy.sh: Permission denied

Ele verificou as permissões do arquivo:

TEXT
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."

BASH
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:

TEXT

-  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:

BASH
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)
💡 Dica: Lembre das duas combinações mais comuns — 755 é a permissão padrão para scripts (o dono pode executar, outros podem ler/executar) e 644 é a padrão para arquivos comuns (o dono pode ler/escrever, outros somente leem). A única diferença entre 755 e 644 é o bit de "execução".

⚠️ Nota: 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

BASH
# 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

BASH
# 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.

TEXT
# 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)
💡 Dica: O cálculo do umask não é uma simples subtração — é uma "máscara" de permissões. As permissões máximas para arquivos são 666 (sem permissão de execução por padrão) e para diretórios são 777. Um umask de 022 remove a permissão de escrita do "grupo" e dos "outros", resultando em 644 para arquivos e 755 para diretórios — o padrão mais seguro.

(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
⚠️ Nota: Programas com SUID/SGID rodam com as permissões do dono ou grupo do arquivo. Se esse programa tiver uma vulnerabilidade, um invasor pode escalar privilégios até root. Só defina SUID em programas necessários (como /usr/bin/passwd) e faça auditoria regular dos arquivos SUID no sistema: find / -perm -4000 -type f 2>/dev/null

BASH
# 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

BASH
# 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

BASH
# 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

BASH
# 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

BASH
# 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

BASH
# 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:

TEXT
0022
-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

BASH
# 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 777 permite 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 /etc após login SSH? R: /etc pertence ao root, e usuários comuns só têm permissão de leitura (r-x). Para modificar arquivos sob /etc, é preciso usar sudo para 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 usar find para definir permissões diferentes para arquivos (644) e diretórios (755) é mais seguro e preciso.


📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Crie um script, adicione permissão de execução com chmod +x e execute-o; depois use notação numérica para definir um arquivo como 644 e um diretório como 755
  2. 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 use chown para transferir a posse do arquivo para esse usuário
  3. Avançado (Dificuldade ⭐⭐⭐): Crie um diretório compartilhado, defina SGID (chmod g+s) para que novos arquivos herdem o grupo, e use find + chmod para definir em lote os arquivos de um projeto web como 644 e os diretórios como 755
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%