Pular para o conteúdo principal

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