O endurecimento (hardening) de sistemsa operacionais é um processo fundamental para reduzir a superfície de ataque e fortalecer a postura de segurança de servidores Linux. A seguir, apresentamos configurações críticas recomendadas para ambientes de produção.
- Configuração de Timeout de Sessão
Para encerrar sessões inativas automaticamente, edite o arquivo de perfil global do sistema:
# Adicione ao final do /etc/profile
readonly TMOUT=180
export TMOUT
O valor define o tempo em segundos de inatividade antes da desconexão. Recomenda-se valores inferiores a 300 segundos.
- Restrição de Acesso FTP para Usuário Root
Para impedir que o superusuário acesse o serviço FTP, adicione "root" à lista de usuários bloqueados nos seguintes caminhos:
echo "root" >> /etc/vsftpd/ftpusers
echo "root" >> /etc/vsftpd/user_list
Reinicie o serviço após as alterações com systemctl restart vsftpd.
- Priorização do Protocolo SSH sobre Telnet
O Telnet transmite dados em texto puro, sendo inseguro para administração remota. Desative-o e garanta que o SSH esteja ativo:
# Desativar telnet via systemd
systemctl stop telnet.socket
systemctl disable telnet.socket
# Garantir que SSH está habilitado
systemctl enable sshd
systemctl start sshd
- Permissões Restritivas para Arquivos de Log
Arquivos de registro devem ter permissões limitadas para evitar leitura ou modificação por usuários não autorizados:
LOGDIR="/var/log"
chmod 640 ${LOGDIR}/messages
chmod 640 ${LOGDIR}/secure
chmod 640 ${LOGDIR}/maillog
chmod 640 ${LOGDIR}/cron
chmod 640 ${LOGDIR}/spooler
chmod 640 ${LOGDIR}/boot.log
- Habilitação de Auditoria via Syslog
Configure o daemon de logs para registrar eventos de autenticação. No rsyslog (mais comum em distribuições recentes):
# Em /etc/rsyslog.conf ou /etc/rsyslog.d/50-default.conf
authpriv.* /var/log/auth.log
Reinicie com systemctl restart rsyslog.
- Ancaminhamento de Logs para Servidor Remoto
Centralize registros em um servidor de logs externo para aálise consolidada:
# Adicionar ao /etc/rsyslog.conf
*.* @@logserver.example.com:514
Use @@ para TCP ou @ para UDP. Certifique-se de que o firewall permite a comunicação na porta configurada.
- Registro de Atividades do Cron
Todas as execuções de tarefas agendadas devem ser registradas:
# Em /etc/rsyslog.conf
cron.* /var/log/cron.log
- Máscara de Permissão Padrão (umask)
Defina uma máscara restritiva para novos arquivos e diretórios criados no sistema:
# Em /etc/login.defs
UMASK 027
# Em /etc/profile
umask 027
Valores comuns incluem 027, 037 ou 077, dependendo do nível de restrição desejado.
- Bloqueio de Login Remoto como Root via SSH
Edite a configuração do daemon SSH:
# Em /etc/ssh/sshd_config
PermitRootLogin no
Reinicie o serviço: systemctl restart sshd.
- Controle de Acesso ao Comando su
Limite quais usuários podem alternar para o superusuário:
# Em /etc/pam.d/su
auth required pam_wheel.so use_uid
Adicione usuários permitidos ao grupo wheel: usermod -aG wheel usuario_permitido.
- Permissões de Arquivos Críticos de Autenticação
Proteja os bancos de dados de usuários e grupos do sistema:
chmod 644 /etc/passwd /etc/group
chmod 600 /etc/shadow /etc/gshadow
- Desativação de Serviços Desnecessários
Serviços não utilizados aumentam a superfície de ataque. Desative-os:
UNNECESSARY_SERVICES=(
"daytime" "echo" "discard" "chargen"
"ntalk" "ident" "printer" "tftp"
"kshell" "klogin" "nfs" "rpcbind"
"ypbind" "sendmail" "avahi-daemon"
)
for svc in "${UNNECESSARY_SERVICES[@]}"; do
systemctl stop "${svc}" 2>/dev/null
systemctl disable "${svc}" 2>/dev/null
done
- Desativação de Contas de Sistema Não Utilizadas
Contas de serviço sem uso devem ter seu shell definido como nologin:
SYSTEM_ACCOUNTS=("listen" "gdm" "webservd" "nobody" "nobody4" "noaccess")
for account in "${SYSTEM_ACCOUNTS[@]}"; do
usermod -s /sbin/nologin "${account}" 2>/dev/null
done
- Restrição de Usuários FTP em Diretórios
Para confinar usuários FTP aos seus diretórios home, configure chroot no vsftpd:
# Em /etc/vsftpd.conf
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
- Remoção de Arquivos de Confiança de Rede
Arquivos como .rhosts, .netrc e hosts.equiv podem permitir autenticação indevida. Localize e elimine-os:
find / -type f \( -name ".rhosts" -o -name ".netrc" -o -name "hosts.equiv" \) -exec rm -f {} \;
- Expiração de Senhas
Force a renovação periódica de credenciais:
# Em /etc/login.defs
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
- Complexidade de Senhas
Implemente políticas de senha robustas usando pam_pwquality ou pam_cracklib:
# Em /etc/pam.d/system-auth ou /etc/pam.d/common-password
password requisite pam_pwquality.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
Parâmetros: dcredit (dígitos), ucredit (maiúsculas), lcredit (minúsculas), ocredit (caracteres especiais). Valores negativos indicam quantidade mínima obrigatória.
- Desativação de FTP Anônimo
# Em /etc/vsftpd.conf
anonymous_enable=NO
local_enable=YES
- Comprimento Mínimo de Senha
# Em /etc/login.defs
PASS_MIN_LEN 12
- Limitação de Tentativas de Login
Bloqueie contas após múltiplas falhas de autenticação usando pam_faillock ou pam_tally2:
# Em /etc/pam.d/sshd (acima da linha de auth include)
auth required pam_faillock.so preauth silent deny=3 unlock_time=900 fail_interval=900
auth [default=die] pam_faillock.so authfail deny=3 unlock_time=900 fail_interval=900
# Desbloqueio manual de conta específica
faillock --user nome_usuario --reset
- Proteção de Arquivos Essenciais com Atributos Imutáveis
Impedir modificação mesmo por root usando atributos do sistema de arquivos:
chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow
# Para reverter: chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
- Autenticação Exclusiva por Chaves SSH
Desative autenticação por senha para conexões SSH:
# Em /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
Reinicie o serviço após alterações: systemctl restart sshd.
- Remoção de Informações de Identificação do Sistema
Evite que ataquantes identifiquem a distribuição e versão do sistema:
BANNER_FILES=("/etc/issue" "/etc/issue.net" "/etc/motd")
for file in "${BANNER_FILES[@]}"; do
if [ -f "$file" ]; then
> "$file"
echo "Acesso não autorizado é proibido." >> "$file"
fi
done