Sistema de Permissões do Linux# Linux é um sistema multiusuário. Cada arquivo e diretório tem permissões que controlam quem pode ler, escrever ou executar.
Estrutura de Permissões# 1
2
3
4
5
6
7
8
9
10
11
12
ls -l arquivo.txt
-rw-r--r-- 1 usuario grupo 1024 fev 2 10:30 arquivo.txt
│││││││││ │ │ │ │ │
│││││││││ │ │ │ │ └─ nome do arquivo
│││││││││ │ │ │ └────── data de modificação
│││││││││ │ │ └──────────── tamanho ( bytes)
│││││││││ │ └──────────────────── grupo
│││││││││ └────────────────────── dono
││││││││└─ outros ( r--)
│││││└──── grupo ( r--)
││└────── dono ( rw-)
│└─────── tipo ( - = arquivo, d = diretório, l = link)
Tipos de Permissões# Representação Numérica (Octal)# r w x r r r r w w - - = = = x - x - 4 2 1 = = = = 4 4 4 4 + + + + 2 2 0 0 + + + + 1 0 1 0 = = = = 7 6 5 4
chmod - Alterar Permissões# Modo Simbólico# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Adicionar permissão de execução para o dono
chmod u+x script.sh
# Remover permissão de escrita do grupo
chmod g-w arquivo.txt
# Adicionar leitura para outros
chmod o+r documento.txt
# Adicionar execução para todos
chmod a+x programa
# Múltiplas alterações
chmod u+x,g-w,o-r arquivo.txt
# Definir permissões exatas
chmod u = rwx,g= rx,o= r arquivo.txt
Símbolos:
u = user (dono)g = group (grupo)o = others (outros)a = all (todos)Modo Numérico (Octal)# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
# rwxr-xr-x (755)
chmod 755 script.sh
# rw-r--r-- (644)
chmod 644 arquivo.txt
# rwx------ (700)
chmod 700 privado.sh
# rw-rw-r-- (664)
chmod 664 compartilhado.txt
# Recursivo em diretório
chmod -R 755 /var/www/html
Permissões Comuns# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Arquivos de texto/documentos
chmod 644 documento.txt # rw-r--r--
# Scripts executáveis
chmod 755 script.sh # rwxr-xr-x
# Arquivos privados
chmod 600 senha.txt # rw-------
# Diretórios públicos
chmod 755 /var/www # rwxr-xr-x
# Diretórios privados
chmod 700 ~/.ssh # rwx------
chown - Alterar Proprietário# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Alterar dono
sudo chown usuario arquivo.txt
# Alterar dono e grupo
sudo chown usuario:grupo arquivo.txt
# Apenas grupo
sudo chown :grupo arquivo.txt
# Recursivo
sudo chown -R usuario:grupo /var/www
# Copiar permissões de outro arquivo
sudo chown --reference= arquivo1.txt arquivo2.txt
chgrp - Alterar Grupo# 1
2
3
4
5
# Alterar grupo
sudo chgrp grupo arquivo.txt
# Recursivo
sudo chgrp -R www-data /var/www
Permissões Especiais# SUID (Set User ID) - 4000# Executa com permissões do dono do arquivo:
1
2
3
4
5
6
7
# Adicionar SUID
chmod u+s programa
chmod 4755 programa
# Exemplo: passwd precisa de SUID para alterar /etc/shadow
ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68208 /usr/bin/passwd
SGID (Set Group ID) - 2000# Arquivos criados herdam o grupo do diretório:
1
2
3
4
5
6
7
8
# Adicionar SGID
chmod g+s diretorio/
chmod 2755 diretorio/
# Útil para diretórios compartilhados
sudo mkdir /compartilhado
sudo chgrp equipe /compartilhado
sudo chmod 2775 /compartilhado
Sticky Bit - 1000# Apenas o dono pode deletar seus arquivos:
1
2
3
4
5
6
7
# Adicionar Sticky Bit
chmod +t diretorio/
chmod 1777 diretorio/
# Exemplo: /tmp tem sticky bit
ls -ld /tmp
drwxrwxrwt 20 root root 4096 /tmp
umask - Permissões Padrão# Define permissões padrão para novos arquivos:
1
2
3
4
5
6
7
8
9
10
11
12
13
# Ver umask atual
umask
# Saída: 0022
# Definir umask
umask 0027
# Cálculo:
# Arquivos: 666 - umask = permissões
# 666 - 022 = 644 (rw-r--r--)
# Diretórios: 777 - umask = permissões
# 777 - 022 = 755 (rwxr-xr-x)
Umasks comuns:
0022: Arquivos 644, Diretórios 755 (padrão)0027: Arquivos 640, Diretórios 750 (mais restritivo)0077: Arquivos 600, Diretórios 700 (privado)ACL - Access Control Lists# Permissões mais granulares que o sistema tradicional:
Instalar ACL# 1
2
3
4
5
# Ubuntu/Debian
sudo apt install acl
# Fedora
sudo dnf install acl
Comandos ACL# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Ver ACL
getfacl arquivo.txt
# Dar permissão específica para usuário
setfacl -m u:usuario:rwx arquivo.txt
# Dar permissão para grupo
setfacl -m g:grupo:rx arquivo.txt
# Remover ACL de usuário
setfacl -x u:usuario arquivo.txt
# Remover todas ACLs
setfacl -b arquivo.txt
# ACL recursiva
setfacl -R -m u:usuario:rwx diretorio/
# ACL padrão (para novos arquivos)
setfacl -d -m u:usuario:rwx diretorio/
Exemplo Prático# 1
2
3
4
5
6
7
8
9
10
# Permitir que 'maria' leia arquivo do 'joao'
sudo setfacl -m u:maria:r /home/joao/documento.txt
# Verificar
getfacl /home/joao/documento.txt
# user::rw-
# user:maria:r--
# group::r--
# mask::r--
# other::---
Atributos de Arquivos# lsattr - Listar Atributos# chattr - Alterar Atributos# 1
2
3
4
5
6
7
8
9
10
11
# Imutável (não pode ser modificado/deletado, nem por root)
sudo chattr +i arquivo.txt
# Remover imutável
sudo chattr -i arquivo.txt
# Append only (só pode adicionar conteúdo)
sudo chattr +a log.txt
# Não atualizar tempo de acesso
sudo chattr +A arquivo.txt
Atributos úteis:
i: Imutávela: Append onlyA: No atime updatec: Comprimido automaticamentes: Secure deletion (sobrescreve com zeros)Links# Hard Links# Múltiplos nomes para o mesmo inode:
1
2
3
4
5
6
7
# Criar hard link
ln arquivo.txt link_arquivo.txt
# Verificar inodes
ls -li arquivo.txt link_arquivo.txt
# 1234567 -rw-r--r-- 2 usuario grupo 1024 arquivo.txt
# 1234567 -rw-r--r-- 2 usuario grupo 1024 link_arquivo.txt
Características:
Mesmo inode Deletar um não afeta o outro Não funciona entre filesystems Não funciona com diretórios Symbolic Links (Symlinks)# Atalhos para arquivos/diretórios:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Criar symlink
ln -s /caminho/completo/arquivo.txt link
# Symlink para diretório
ln -s /var/www/html ~/www
# Verificar
ls -l link
# lrwxrwxrwx 1 usuario grupo 24 link -> /caminho/completo/arquivo.txt
# Atualizar symlink
ln -sf novo_destino link
# Remover symlink
rm link # Não afeta o arquivo original
Características:
Arquivo separado apontando para outro Funciona entre filesystems Funciona com diretórios Se o original for deletado, o link fica “quebrado” Por Permissões# 1
2
3
4
5
6
7
8
9
10
11
# Arquivos com permissão 777
find /home -perm 777
# Arquivos com SUID
find / -perm -4000 2>/dev/null
# Arquivos com SGID
find / -perm -2000 2>/dev/null
# Arquivos world-writable
find / -perm -002 2>/dev/null
Por Proprietário# 1
2
3
4
5
6
7
8
9
10
11
# Arquivos do usuário
find /home -user usuario
# Arquivos do grupo
find /var -group www-data
# Arquivos sem dono (órfãos)
find / -nouser 2>/dev/null
# Arquivos sem grupo
find / -nogroup 2>/dev/null
Executar Ações# 1
2
3
4
5
6
7
8
9
# Alterar permissões em massa
find /var/www -type f -exec chmod 644 {} \;
find /var/www -type d -exec chmod 755 {} \;
# Alterar dono
find /var/www -exec chown www-data:www-data {} \;
# Deletar arquivos antigos
find /tmp -type f -mtime +7 -delete
Casos de Uso Práticos# 1. Configurar Servidor Web# 1
2
3
4
# Estrutura típica
sudo chown -R www-data:www-data /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
2. Diretório Compartilhado# 1
2
3
4
5
6
7
8
9
10
11
# Criar grupo
sudo groupadd equipe
# Adicionar usuários ao grupo
sudo usermod -aG equipe usuario1
sudo usermod -aG equipe usuario2
# Configurar diretório
sudo mkdir /compartilhado
sudo chgrp equipe /compartilhado
sudo chmod 2775 /compartilhado # SGID + rwxrwxr-x
3. Chaves SSH# 1
2
3
4
5
6
# Permissões corretas para SSH
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts
4. Scripts Executáveis# 1
2
3
4
5
# Tornar script executável
chmod +x script.sh
# Executar
./script.sh
1
2
3
4
5
6
7
8
# Copiar preservando permissões
cp -p arquivo.txt backup/
# Tar preserva permissões por padrão
tar czf backup.tar.gz /dados
# Rsync preservando tudo
rsync -av /origem/ /destino/
Troubleshooting de Permissões# Problema: Permission Denied# 1
2
3
4
5
6
7
8
9
10
11
# Verificar permissões
ls -l arquivo.txt
# Verificar dono
ls -l arquivo.txt
# Verificar grupos do usuário
groups
# Verificar ACL
getfacl arquivo.txt
Problema: Script não executa# 1
2
3
4
5
6
# Adicionar permissão de execução
chmod +x script.sh
# Verificar shebang
head -1 script.sh
# Deve ter: #!/bin/bash
Problema: Não consigo deletar arquivo# 1
2
3
4
5
6
7
8
# Verificar atributos
lsattr arquivo.txt
# Remover imutável
sudo chattr -i arquivo.txt
# Verificar permissões do diretório
ls -ld diretorio/
Boas Práticas de Segurança# 1. Princípio do Menor Privilégio# 1
2
3
4
# Evite 777
# Use permissões específicas
chmod 755 diretorio/ # Não 777
chmod 644 arquivo.txt # Não 666
2. Proteja Arquivos Sensíveis# 1
2
3
4
5
6
# Arquivos de configuração
chmod 600 ~/.ssh/id_rsa
chmod 600 /etc/shadow
# Logs sensíveis
chmod 640 /var/log/auth.log
3. Audite Permissões Perigosas# 1
2
3
4
5
# Encontrar arquivos SUID (potencial risco)
sudo find / -perm -4000 -ls 2>/dev/null
# Arquivos world-writable
sudo find / -perm -002 -type f -ls 2>/dev/null
4. Use Grupos Apropriadamente# 1
2
3
4
# Não adicione usuários ao grupo root
# Crie grupos específicos
sudo groupadd developers
sudo usermod -aG developers usuario
Comandos de Referência Rápida# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# Ver permissões
ls -l arquivo.txt
# Alterar permissões (simbólico)
chmod u+x arquivo.txt
# Alterar permissões (numérico)
chmod 644 arquivo.txt
# Alterar dono
sudo chown usuario:grupo arquivo.txt
# Alterar grupo
sudo chgrp grupo arquivo.txt
# Ver ACL
getfacl arquivo.txt
# Definir ACL
setfacl -m u:usuario:rwx arquivo.txt
# Ver atributos
lsattr arquivo.txt
# Definir atributos
sudo chattr +i arquivo.txt
# Hard link
ln arquivo.txt link.txt
# Symbolic link
ln -s /caminho/arquivo.txt link
# Buscar por permissões
find / -perm 777
Exercícios Práticos# Exercício 1: Permissões Básicas# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. Crie um arquivo
touch teste.txt
# 2. Defina permissões 644
chmod 644 teste.txt
# 3. Verifique
ls -l teste.txt
# 4. Torne executável
chmod +x teste.txt
# 5. Remova execução de outros
chmod o-x teste.txt
Exercício 2: Diretório Compartilhado# 1
2
3
4
5
6
7
8
9
10
11
# 1. Crie diretório
mkdir compartilhado
# 2. Defina SGID
chmod 2775 compartilhado
# 3. Crie arquivo dentro
touch compartilhado/arquivo.txt
# 4. Verifique grupo herdado
ls -l compartilhado/arquivo.txt
Exercício 3: Links# 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. Crie arquivo
echo "conteúdo" > original.txt
# 2. Crie hard link
ln original.txt hardlink.txt
# 3. Crie symlink
ln -s original.txt symlink.txt
# 4. Compare inodes
ls -li original.txt hardlink.txt symlink.txt
# 5. Delete original e veja diferença
rm original.txt
cat hardlink.txt # Funciona
cat symlink.txt # Erro: link quebrado
Recursos Adicionais# Documentação# 1
2
3
4
man chmod
man chown
man setfacl
man chattr
Links Úteis# Próximo capítulo : 5 - Gerenciamento de Pacotes e Software
Capítulo anterior : 3 - Comandos de Terminal