Basta alocar um IP público em qualquer VPS na AWS, DigitalOcean ou Hetzner para que, em questão de minutos, scanners automatizados comecem a bombardear a porta 22 do seu servidor com ataques de dicionário e força bruta.

Consultar o arquivo /var/log/auth.log (ou journalctl -u ssh) em servidores recém-criados revela milhares de tentativas de autenticação para usuários previsíveis como root, admin, user e postgres.

Neste guia prático de engenharia de sistemas, veremos os 4 passos obrigatórios para blindar o serviço OpenSSH, erradicar autenticação por senha e implementar detecção de intrusos com Fail2ban.

1. Por que Chaves Ed25519 em vez de RSA?

As chaves Ed25519 (baseadas na curva elíptica Curve25519) tornaram-se o padrão da indústria por motivos claros:

  • Segurança Imbatível: Oferecem segurança equivalente a chaves RSA de ~3000 bits com uma fração do tamanho do arquivo (apenas 68 caracteres);
  • Velocidade de Assinatura: O handshake SSH e a verificação criptográfica ocorrem em menos da metade do tempo;
  • Resistência a Canais Laterais: Menos suscetíveis a ataques baseados em tempo de resposta (timing attacks).

Gere sua chave localmente na sua máquina de desenvolvimento:

ssh-keygen -t ed25519 -C "seu-email@dominio.com" -f ~/.ssh/id_ed25519_servidor 

Copie a chave pública para o servidor remoto:

ssh-copy-id -i ~/.ssh/id_ed25519_servidor.pub usuario@<IP-DO-SERVIDOR> 

2. Configurando o /etc/ssh/sshd_config.d/99-hardening.conf

Em distribuições Linux modernas (Debian 12+, Ubuntu 22.04+), a melhor prática é não alterar o arquivo principal diretamente, mas criar um arquivo de substituição modular em /etc/ssh/sshd_config.d/:

# /etc/ssh/sshd_config.d/99-hardening.conf  # 1. Proibir login direto como superusuário (root) PermitRootLogin no # 2. Desativar completamente autenticação por senha PasswordAuthentication no PermitEmptyPasswords no ChallengeResponseAuthentication no KbdInteractiveAuthentication no # 3. Forçar uso estrito de chaves públicas PubkeyAuthentication yes # 4. Limitar tentativas consecutivas de autenticação MaxAuthTries 3 MaxSessions 2 # 5. Desativar encaminhamento X11 desnecessário X11Forwarding no # 6. Desconectar sessões ociosas automaticamente (após 10 minutos) ClientAliveInterval 300 ClientAliveCountMax 2 

Valide a sintaxe antes de reiniciar o daemon:

sudo sshd -t sudo systemctl restart sshd 

⚠️ Atenção: Mantenha uma janela de SSH aberta enquanto testa o login em uma nova janela para evitar ficar trancado fora do servidor!

3. Instalando e Ajustando o Fail2ban

O Fail2ban inspeciona os logs do sistema operacional e cria regras dinâmicas de firewall (nftables ou iptables) para banir IPs que apresentem comportamento suspeito:

sudo apt update && sudo apt install -y fail2ban 

Crie o arquivo de regras locais em /etc/fail2ban/jail.local:

# /etc/fail2ban/jail.local [DEFAULT] bantime = 24h findtime = 10m maxretry = 3 banaction = nftables-multiport [sshd] enabled = true port = ssh filter = sshd logpath = %(sshd_log)s backend = systemd 

Inicie e habilite o serviço:

sudo systemctl enable --now fail2ban 

Para verificar o status das jails ativas e a lista de IPs banidos:

sudo fail2ban-client status sshd 

Conclusão e Recursos

A segurança de um servidor começa pela superfície de ataque mais exposta. Eliminando o login por senha e aplicando chaves Ed25519 com Fail2ban, você neutraliza mais de 99% dos scanners automatizados da internet.

Confira o guia aprofundado com auditoria de chaves físicas FIDO2 e cofres criptografados no meu blog:

👉 Guia Completo de Hardening no Vexis Sentinel

Você mantém a porta 22 padrão ou costuma alterar para uma porta alta não padrão? Qual a sua estratégia favorita?