Hardening de Linux: CIS Benchmark, sysctl, PAM e Auditd
Hardening é o processo de reduzir a superfície de ataque de um sistema operacional, eliminando vulnerabilidades, desabilitando serviços desnecessários e implementando controles de segurança rigorosos. Em ambientes corporativos e produção, aplicar hardening não é opcional — é obrigatório. Este artigo cobre os quatro pilares principais que todo profissional de Linux deve dominar: CIS Benchmark (o padrão de conformidade), sysctl (configuração do kernel), PAM (autenticação e autorização) e Auditd (auditoria de eventos). Ao final, você será capaz de implementar uma estratégia sólida de segurança em qualquer distribuição Linux.
CIS Benchmark: O Padrão de Conformidade
O que é CIS Benchmark?
O CIS (Center for Internet Security) Benchmark é um conjunto de recomendações de configuração baseadas em consenso da comunidade de segurança global. Não é uma lei, mas sim um padrão reconhecido internacionalmente que descreve como configurar sistemas Linux de forma segura. Cada recomendação possui um nível de severidade e está mapeada a frameworks como NIST, PCI-DSS e ISO 27001.
O benchmark é organizado em níveis: Nível 1 (configurações essenciais, pouco impacto operacional) e Nível 2 (configurações avançadas, maior impacto). Existem também recomendações específicas para diferentes papéis: servidor, workstation, ou ambientes containerizados. Implementar CIS não significa apenas ler um documento — significa automatizar sua verificação e manutenção.
Verificando conformidade com ferramentas
O projeto CIS-CAT é a ferramenta oficial, porém paga. Para fins educacionais e produção, você pode usar alternativas open-source como lynis ou oscap. Abaixo, um exemplo prático de uso do lynis, uma ferramenta de auditoria que verifica conformidade com CIS:
# Instalação em Debian/Ubuntu
sudo apt-get update && sudo apt-get install -y lynis
# Executar auditoria completa
sudo lynis audit system
# Auditoria focada em hardening específico
sudo lynis audit system --quiet --quick
# Gerar relatório em arquivo
sudo lynis audit system > /tmp/lynis_report.txt 2>&1
O output do lynis mostra sugestões organizadas por categoria. Cada linha apresenta um ID (ex: AUTH-9286), o resultado (pass/warning/suggestion) e a ação recomendada. O importante é priorizar os warnings (requisitos não atendidos) antes das suggestions (melhorias).
Implementando recomendações críticas do CIS
As recomendações mais críticas do CIS envolvem: remover pacotes não essenciais, desabilitar serviços desnecessários, configurar permissões de arquivo corretas e implementar autenticação forte. Aqui está um script que automatiza algumas dessas tarefas:
#!/bin/bash
# Script de hardening baseado em CIS Benchmark - Nível 1
# 1. Remover pacotes não essenciais
sudo apt-get remove -y xserver-xorg* avahi-daemon cups dhcp3-server
# 2. Desabilitar serviços desnecessários
sudo systemctl disable bluetooth.service avahi-daemon.service cups.service
# 3. Corrigir permissões de arquivos críticos
sudo chmod 644 /etc/passwd
sudo chmod 644 /etc/group
sudo chmod 600 /etc/shadow
sudo chmod 600 /etc/gshadow
# 4. Verificar e corrigir permissões de diretórios home
for user in $(awk -F: '($3>=1000)&&($1!="nfsnobody"){print $1}' /etc/passwd); do
if [ -d /home/$user ]; then
sudo chmod 750 /home/$user
sudo chown $user:$user /home/$user
fi
done
# 5. Desabilitar montagem de sistemas de arquivo inseguros
echo "install cramfs /bin/false" | sudo tee -a /etc/modprobe.d/cramfs.conf
echo "install freevxfs /bin/false" | sudo tee -a /etc/modprobe.d/freevxfs.conf
echo "install jffs2 /bin/false" | sudo tee -a /etc/modprobe.d/jffs2.conf
# 6. Configurar timeout de sessão
echo "TMOUT=900" | sudo tee -a /etc/profile.d/timeout.sh
echo "Hardening inicial concluído. Execute: sudo lynis audit system"
Execute este script com sudo bash hardening.sh. Após executar, o sistema terá passado em várias verificações do CIS Nível 1.
Sysctl: Configuração do Kernel
Entendendo sysctl
sysctl é a ferramenta que permite ler e modificar parâmetros do kernel em tempo de execução. Esses parâmetros controlam comportamentos críticos de segurança: proteção contra ataques de IP spoofing, desabilitação de redirects ICMP, proteção contra SYN floods, e mais. Diferente de modificações no código-fonte do kernel, sysctl oferece flexibilidade — as mudanças persistem após reboot quando adicionadas ao arquivo /etc/sysctl.conf ou em arquivos dentro de /etc/sysctl.d/.
A filosofia é simples: quanto menos "escuta" sua rede, menos vulnerável ela fica. Servidores de produção devem rejeitar pacotes suspeitos e responder minimamente às requisições de rede.
Configurações críticas de sysctl
Crie um arquivo dedicado para suas configurações de hardening:
sudo tee /etc/sysctl.d/99-hardening.conf > /dev/null << 'EOF'
# ===== PROTEÇÃO CONTRA ATAQUES DE REDE =====
# Habilitar SYN cookies (proteção contra SYN flood)
net.ipv4.tcp_syncookies = 1
# Rejeitar source-routed packets
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv6.conf.all.send_redirects = 0
net.ipv6.conf.default.send_redirects = 0
# Rejeitar ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# Ignorar pacotes ICMP ping
net.ipv4.icmp_echo_ignore_all = 0 # Mude para 1 se quiser desabilitar ping
net.ipv6.conf.all.disable_ipv6 = 0 # Desabilitar apenas se não usar IPv6
# ===== PROTEÇÃO CONTRA IP SPOOFING =====
# Reverse path filtering (validar origem dos pacotes)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# ===== PROTEÇÃO CONTRA ATAQUES DE PORTA =====
# Rejeitar pacotes com bad ICMP
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Aumentar limites de conexão
net.ipv4.tcp_max_syn_backlog = 2048
net.core.somaxconn = 1024
# ===== RESTRIÇÕES DE KERNEL =====
# Desabilitar Kexec (reboot sem passar pelo BIOS)
kernel.kexec_load_disabled = 1
# Desabilitar Magic SysRq
kernel.sysrq = 0
# Aumentar proteção contra core dumps
fs.suid_dumpable = 0
kernel.core_uses_pid = 1
# ===== PROTEÇÃO DE MEMÓRIA =====
# ASLR (Address Space Layout Randomization)
kernel.randomize_va_space = 2
# Proteção do kernel pointer
kernel.kptr_restrict = 2
# Proteção do dmesg
kernel.dmesg_restrict = 1
EOF
# Aplicar as configurações
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
# Verificar uma configuração específica
sudo sysctl net.ipv4.tcp_syncookies
Cada parâmetro acima foi escolhido com base em anos de prática e recomendações CIS. Não mude números arbitrariamente — entenda o trade-off: algumas configurações podem impactar latência ou throughput em cenários específicos. Por exemplo, aumentar tcp_max_syn_backlog ajuda contra SYN floods, mas consome mais memória.
Verificando e validando configurações
# Listar todas as configurações de rede relacionadas a segurança
sudo sysctl -a | grep -E "(rp_filter|syncookies|redirects|icmp)" | sort
# Comparar com as recomendações CIS
sudo sysctl kernel.randomize_va_space
sudo sysctl kernel.exec-shield
# Restaurar um valor padrão
sudo sysctl -w net.ipv4.ip_forward=0
# Fazer mudança persistente (permanente após reboot)
echo "net.ipv4.ip_forward=0" | sudo tee -a /etc/sysctl.d/99-hardening.conf
sudo sysctl -p
PAM: Autenticação e Autorização
Entendendo PAM
PAM (Pluggable Authentication Modules) é a camada responsável por autenticação, autorização e gerenciamento de sessão em Linux. Todo login, sudo, SSH e até alteração de senha passa por PAM. É aqui que você define quem pode acessar, de onde, com qual senha, que desafios de autenticação enfrentar, e o que acontece quando alguém falha na autenticação.
A estrutura do PAM é modular: você pode trocar, adicionar ou remover módulos sem modificar aplicações. Configurações vivem em /etc/pam.d/ e /etc/security/. Compreender PAM é essencial porque um erro aqui pode bloquear todos os usuários do sistema (incluindo você).
Configurando autenticação forte
Começaremos com uma configuração robusta de PAM para SSH. O arquivo padrão está em /etc/pam.d/common-password:
# Ver o arquivo original
cat /etc/pam.d/common-password
# Fazer backup
sudo cp /etc/pam.d/common-password /etc/pam.d/common-password.bak
Agora, configure requisitos de senha forte usando pam_pwquality:
# Instalação
sudo apt-get install -y libpam-pwquality
# Configurar requisitos de senha
sudo tee /etc/security/pwquality.conf > /dev/null << 'EOF'
# Requisitos de senha forte
minlen = 14
dcredit = -1 # Pelo menos 1 dígito
ucredit = -1 # Pelo menos 1 letra maiúscula
lcredit = -1 # Pelo menos 1 letra minúscula
ocredit = -1 # Pelo menos 1 caractere especial
maxrepeat = 3 # Máximo 3 caracteres repetidos
usercheck = 1 # Rejeitar senhas que contenham username
enforce_for_root # Aplicar também para root
difok = 5 # Pelo menos 5 caracteres diferentes da senha anterior
EOF
# Verificar a configuração
sudo cat /etc/security/pwquality.conf
Controlando tentativas de login falho
Implemente bloqueio de conta após múltiplas tentativas erradas usando pam_faillock:
# Configurar PAM para SSH (criar novo arquivo se não existir)
sudo tee /etc/pam.d/sshd-hardened > /dev/null << 'EOF'
# Bloqueio após falhas
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=900
# Autenticação real
@include common-auth
# Bloqueio pós-falha
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
# Gerenciamento de conta
@include common-account
# Política de senha
@include common-password
# Gerenciamento de sessão
session required pam_permit.so
session required pam_umask.so umask=0077
session optional pam_lastlog.so showfailed
@include common-session
EOF
# Verificar logs de tentativas falhas
sudo faillock --user username
sudo faillock --user username --reset # Desbloquear usuário
Habilitando autenticação multifator (2FA) com TOTP
Para ambientes críticos, implemente TOTP (Time-based One-Time Password) usando google-authenticator:
# Instalação
sudo apt-get install -y libpam-google-authenticator
# Usuário configura seu próprio TOTP (execute como o usuário, não root)
google-authenticator --time-based --disallow-reuse --force --rate-limit=3 --rate-time=30
# Isso gera um QR code e chaves de backup. Salve em local seguro.
# Configurar PAM para exigir TOTP
sudo tee /etc/pam.d/sshd-2fa > /dev/null << 'EOF'
# Autenticação padrão
@include common-auth
# TOTP obrigatório (descomente para ativar)
# auth required pam_google_authenticator.so nullok serial=/dev/null secret=${HOME}/.google_authenticator
# Gerenciamento de sessão
@include common-session
EOF
# Testar: ssh user@host (será pedido senha + código TOTP)
Monitorando acessos ao sudoers
Configure logs específicos para sudo e restrinja quem pode usá-lo:
# Criar grupo para usuários sudo (opcional, mas recomendado)
sudo groupadd -f sudoers-group
sudo usermod -aG sudoers-group username
# Configurar sudoers com validação e logs
sudo visudo -f /etc/sudoers.d/99-hardening << 'EOF'
# Exigir senha mesmo para sudo anteriores
Defaults use_pty
# Logging de todos os comandos sudoeers
Defaults log_file="/var/log/sudo.log"
Defaults logfile_maxlen=5000
Defaults syslog="authpriv"
# Restrição de comando específica
# %sudoers-group ALL=(ALL:ALL) NOPASSWD:/usr/bin/systemctl restart nginx
# Exigir re-autenticação a cada 5 minutos
Defaults timestamp_timeout=5
# Bloquear comandos perigosos
Defaults use_pty
Defaults log_output
# Repassword após 5 erros
Defaults passwd_tries=3
EOF
# Verificar sudoers sem risco (visudo validar a sintaxe)
sudo visudo -c
# Ver logs de sudo
sudo tail -f /var/log/sudo.log
Auditd: Auditoria e Monitoramento
Entendendo Auditd
Auditd é o daemon de auditoria do kernel Linux. Diferente de logs de aplicação (que você pode deletar ou manipular), auditd registra chamadas de sistema (syscalls) em nível de kernel, enviando os eventos para um daemon em espaço de usuário que grava em arquivo. Isso permite rastrear quem fez o quê, quando e de onde — essencial para conformidade regulatória (PCI-DSS, HIPAA, SOX).
Auditd é mais granular que logs de sistema. Enquanto syslog pode registrar "arquivo modificado", auditd registra o processo exato, o usuário, o UID, o GID, o inode, a permissão anterior e tudo mais. Isso tem custo: performance. Portanto, implemente regras específicas, não tudo.
Instalação e primeiras configurações
# Instalação
sudo apt-get install -y auditd audispd-plugins
# Iniciar o serviço
sudo systemctl start auditd
sudo systemctl enable auditd
# Verificar status
sudo systemctl status auditd
sudo auditctl -l # Listar regras ativas
# Ver eventos em tempo real
sudo ausearch -k audit
sudo tail -f /var/log/audit/audit.log
Definindo regras de auditoria
Crie regras específicas para rastrear ações críticas:
# Backup das regras padrão
sudo cp /etc/audit/rules.d/audit.rules /etc/audit/rules.d/audit.rules.bak
# Criar arquivo com regras de hardening
sudo tee /etc/audit/rules.d/99-hardening.rules > /dev/null << 'EOF'
# ===== REGRAS DE AUDITORIA PARA HARDENING =====
# Remove qualquer regra anterior
-D
# Buffer tamanho
-b 8192
# Failure mode (enviará alertas se buffer cheio)
-f 2
# ===== AUDITORIA DE AUTENTICAÇÃO =====
# Monitorar arquivo de senhas
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/group -p wa -k group_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/sudoers.d/ -p wa -k sudoers_changes
# Monitorar logins
-w /var/log/faillog -p wa -k faillog_changes
-w /var/log/lastlog -p wa -k lastlog_changes
# ===== AUDITORIA DE ARQUIVOS CRÍTICOS =====
# Kernel e módulos
-w /boot/grub2/ -p wa -k grub_changes
-w /lib/modules/ -p a -k kernel_modules
# Executáveis system-wide
-w /usr/sbin/ -p x -k exec_sbin
-w /usr/bin/ -p x -k exec_bin
# ===== AUDITORIA DE PERMISSÕES SENSÍVEIS =====
# Monitorar chmod, chown, chgrp
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change
-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time_change
-a always,exit -F arch=b64 -S clock_settime -k time_change
-a always,exit -F arch=b32 -S clock_settime -k time_change
# ===== AUDITORIA DE EXECUÇÃO DE COMANDOS =====
# Rastrear execuções via /bin/sh, /bin/bash
-a always,exit -F path=/bin/sh -F perm=x -F auid>=1000 -F auid!=-1 -k exec_shell
-a always,exit -F path=/bin/bash -F perm=x -F auid>=1000 -F auid!=-1 -k exec_shell
# ===== AUDITORIA DE REDE =====
# Mudanças em configuração de rede
-w /etc/hostname -p wa -k hostname_change
-w /etc/hosts -p wa -k hosts_change
-w /etc/sysconfig/network -p wa -k network_config_change
# Finalizar e aplicar
-e 2
EOF
# Recarregar regras
sudo auditctl -R /etc/audit/rules.d/99-hardening.rules
# Verificar regras carregadas
sudo auditctl -l
# Fazer as regras persistentes
sudo systemctl restart auditd
Consultando eventos de auditoria
Auditd gera muito log. Você precisa de ferramentas para filtrar dados relevantes:
# Ver todos os eventos
sudo tail -n 50 /var/log/audit/audit.log
# Filtrar por tipo de evento (ex: arquivo modificado)
sudo ausearch -k passwd_changes -v
# Filtrar por usuário
sudo ausearch -ui 1000 -v
# Filtrar por processo
sudo ausearch -exe /usr/sbin/useradd -v
# Procurar eventos de falha
sudo ausearch -m AVC -v # AppArmor/SELinux denials
# Gerar relatório de mudanças no último dia
sudo aureport --start today -k passwd_changes
# Procurar por criação de arquivos suspeitos em /tmp
sudo ausearch -k exec_bin -i -v | grep -E "(open|create)" | tail -20
Analisando logs com aureport e ausearch
Implemente um script para monitorar eventos críticos:
#!/bin/bash
# Script de monitoramento de eventos críticos de auditoria
# Arquivo de log
AUDIT_LOG="/var/log/audit/audit.log"
REPORT_FILE="/tmp/audit_report_$(date +%Y%m%d_%H%M%S).txt"
echo "=== RELATÓRIO DE AUDITORIA - $(date) ===" > $REPORT_FILE
echo -e "\n--- MUDANÇAS EM /etc/passwd ---" >> $REPORT_FILE
sudo ausearch -k passwd_changes -v 2>/dev/null | tail -20 >> $REPORT_FILE
echo -e "\n--- MUDANÇAS EM /etc/shadow ---" >> $REPORT_FILE
sudo ausearch -k shadow_changes -v 2>/dev/null | tail -20 >> $REPORT_FILE
echo -e "\n--- MUDANÇAS EM SUDOERS ---" >> $REPORT_FILE
sudo ausearch -k sudoers_changes -v 2>/dev/null | tail -20 >> $REPORT_FILE
echo -e "\n--- FALHAS DE LOGIN (últimas 24h) ---" >> $REPORT_FILE
sudo ausearch -k faillog_changes -ts recent -v 2>/dev/null >> $REPORT_FILE
echo -e "\n--- EXECUÇÕES DE SHELL (últimas 10) ---" >> $REPORT_FILE
sudo ausearch -k exec_shell -v 2>/dev/null | tail -10 >> $REPORT_FILE
echo -e "\n--- RESUMO POR USUÁRIO ---" >> $REPORT_FILE
sudo aureport --start today 2>/dev/null >> $REPORT_FILE
# Exibir relatório
cat $REPORT_FILE
# Opcional: enviar para syslog ou arquivo persistente
# cp $REPORT_FILE /var/log/audit_hardening_$(date +%Y%m%d).txt
Execute o script manualmente ou via cron para monitoramento contínuo:
# Agendar verificação diária às 6 da manhã
0 6 * * * /path/to/audit_monitor.sh >> /var/log/audit_monitor.log 2>&1
Conclusão
Dominar hardening de Linux exige prática com essas quatro ferramentas em conjunto. Primeiro aprendizado: CIS Benchmark não é um checklist estático — é um framework que evolui. Use ferramentas como lynis para verificação contínua, não apenas uma vez. Segundo aprendizado: sysctl e PAM trabalham em camadas diferentes — sysctl protege o kernel e a rede; PAM protege a autenticação. Ambas são essenciais, mas falhar em uma delas compromete a segurança geral. Terceiro aprendizado: Auditd é seu detective, não seu policial. Configure regras específicas para eventos que importam (mudanças em sudoers, criação de usuários, acesso a /etc/shadow), não tudo, ou seu log se tornará inútil. O pior cenário é ter auditoria sem análise.
Implementar segurança é um processo contínuo: monitore, teste, ajuste e documente. Um servidor bem hardened não é invulnerável, mas reduz drasticamente a superfície de ataque e detecta intrusões rapidamente.
Referências
- CIS Benchmarks Official Documentation: https://www.cisecurity.org/benchmark/linux
- Linux Kernel sysctl Documentation: https://www.kernel.org/doc/html/latest/admin-guide/sysctl/
- Linux PAM Project - Official Docs: http://www.linux-pam.org/
- Audit Framework Project: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/chap-system_auditing
- Linux Hardening Best Practices - Lynis Guide: https://cisofy.com/documentation/lynis/