Capítulo 9.1 - Segurança de Permissões
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Aplicar o princípio do menor privilégio
- Proteger as permissões de arquivos
- Compreender os riscos de permissões amplas
- Auditar as permissões do sistema
- Corrigir permissões incorretas
Princípio do Menor Privilégio
Conceito
Conceder apenas as permissões necessárias, nada além disso.
Vantagens:
- Redução da superfície de ataque
- Limitação de danos
- Conformidade com segurança
Permissões Seguras
Arquivos Normais
# Arquivos de configuração
chmod 644 arquivo.conf # rw-r--r--
chmod 600 arquivo.conf # rw------- (privado)
# Scripts executáveis
chmod 755 script.sh # rwxr-xr-x
chmod 700 script.sh # rwx------ (privado)
# Arquivos sensíveis
chmod 600 .ssh/id_rsa # Chave privada
chmod 644 .ssh/id_rsa.pub # Chave pública
chmod 700 .ssh/ # Diretório SSH
Diretórios
# Diretórios normais
chmod 755 diretorio/ # rwxr-xr-x
# Diretórios privados
chmod 700 diretorio/ # rwx------
# Diretórios compartilhados
chmod 775 shared/ # rwxrwxr-x
chmod 1777 /tmp # Sticky bit
Permissões Perigosas
A Evitar
# 777 - Todos os direitos (PERIGOSO!)
chmod 777 arquivo # EVITAR!
# SUID/SGID desnecessários
chmod u+s script.sh # Verificar necessidade
# Diretórios world-writable
chmod 777 diretorio/ # EVITAR!
Detectar
# Arquivos com permissões amplas
find /home -type f -perm -o+w
find / -type f -perm 777 2>/dev/null
# Diretórios world-writable
find / -type d -perm -o+w ! -path "/proc/*" 2>/dev/null
# Arquivos SUID/SGID
find / -type f -perm /4000 2>/dev/null # SUID
find / -type f -perm /2000 2>/dev/null # SGID
Segurança no SSH
Permissões Corretas
# Diretório .ssh
chmod 700 ~/.ssh
# Chaves privadas
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_ed25519
# Chaves públicas
chmod 644 ~/.ssh/id_rsa.pub
chmod 644 ~/.ssh/authorized_keys
# Config
chmod 600 ~/.ssh/config
Verificação
# Script de verificação
#!/bin/bash
SSH_DIR="$HOME/.ssh"
if [ -d "$SSH_DIR" ]; then
# Verificar permissões do diretório
PERMS=$(stat -c "%a" "$SSH_DIR")
if [ "$PERMS" != "700" ]; then
echo "ATENÇÃO: .ssh deveria ser 700, atualmente $PERMS"
fi
# Verificar chaves privadas
for key in "$SSH_DIR"/id_*; do
if [ -f "$key" ] && [[ "$key" != *.pub ]]; then
PERMS=$(stat -c "%a" "$key")
if [ "$PERMS" != "600" ]; then
echo "ATENÇÃO: $key deveria ser 600, atualmente $PERMS"
fi
fi
done
fi
Segurança no Cron
Permissões do Crontab
# Crontab do usuário
chmod 600 ~/.crontab # Se arquivo externo
# Verificar crontab do sistema
ls -l /etc/crontab
ls -l /etc/cron.d/*
Ambiente do Cron
# Crontab seguro
PATH=/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com
# Usar caminhos absolutos
0 2 * * * /usr/local/bin/backup.sh
# Redirecionar saída
0 2 * * * /usr/local/bin/script.sh > /var/log/script.log 2>&1
# Não usar variáveis não definidas
Scripts Cron Seguros
#!/bin/bash
# Script cron seguro
# Opções de segurança
set -euo pipefail
# Caminhos absolutos
SCRIPT_DIR="/usr/local/bin"
LOG_FILE="/var/log/meu-script.log"
# Função de logging
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" >> "$LOG_FILE"
}
# Verificações
if [ ! -f "$SCRIPT_DIR/config" ]; then
log "ERRO: Arquivo de configuração ausente"
exit 1
fi
# Processamento...
log "Início do processamento"
# ...
log "Fim do processamento"
Auditoria de Permissões
Script de Auditoria
#!/bin/bash
# Auditoria de permissões
echo "=== Arquivos world-writable ==="
find /home -type f -perm -o+w 2>/dev/null
echo "=== Diretórios world-writable ==="
find /home -type d -perm -o+w 2>/dev/null
echo "=== Arquivos SUID ==="
find /home -type f -perm /4000 2>/dev/null
echo "=== Arquivos SGID ==="
find /home -type f -perm /2000 2>/dev/null
echo "=== Permissões SSH ==="
if [ -d ~/.ssh ]; then
ls -la ~/.ssh
fi
Correção Automática
#!/bin/bash
# Corrigir permissões SSH
SSH_DIR="$HOME/.ssh"
if [ -d "$SSH_DIR" ]; then
chmod 700 "$SSH_DIR"
# Chaves privadas
find "$SSH_DIR" -name "id_*" ! -name "*.pub" -exec chmod 600 {} \;
# Chaves públicas
find "$SSH_DIR" -name "*.pub" -exec chmod 644 {} \;
# authorized_keys
[ -f "$SSH_DIR/authorized_keys" ] && chmod 600 "$SSH_DIR/authorized_keys"
# config
[ -f "$SSH_DIR/config" ] && chmod 600 "$SSH_DIR/config"
echo "Permissões SSH corrigidas"
fi
Boas Práticas
Arquivos
- 644 para arquivos normais
- 600 para arquivos sensíveis
- 755 para scripts executáveis
- 700 para scripts privados
Diretórios
- 755 para diretórios normais
- 700 para diretórios privados
- 775 para diretórios compartilhados (com grupo)
- 1777 para /tmp (sticky bit)
Verificações
- Auditar regularmente
- Automatizar com scripts
- Documentar exceções
- Revisar após mudanças
Resumo
Neste capítulo, você aprendeu:
Menor privilégio: Permissões mínimas necessárias
Segurança: Permissões apropriadas conforme o tipo
Detecção: Encontrar permissões perigosas
SSH: Permissões corretas para chaves e configuração
Cron: Segurança de scripts e ambiente
Auditoria: Scripts para verificar e corrigir
Próximos Passos
Capítulo 9.2: Configuração do sudo
Capítulo 9.3: Firewall
Capítulo criado em: Dezembro de 2024