SSH Hardening: Implementação de MFA e PAM em servidores Linux críticos.
Implementação de MFA via TOTP e chaves ED25519 em servidores Linux. Guia com configuração PAM, sshd_config e prevenção de lockout em produção.
Servidores Linux expostos à internet sofrem varreduras automatizadas de força bruta contra SSH continuamente. Autenticação por senha isolada é insuficiente.
Este guia documenta a implementação de defesa em profundidade para SSH
- Substituição de senhas por chaves criptográficas ED25519
- Configuração de MFA via TOTP (Google Authenticator PAM)
- Integração PAM + SSHD com exigência de ambos os fatores
- Mitigação de risco de lockout durante a transição
Resultado: Eliminação do vetor de ataque por força bruta e conformidade com padrões de acesso privilegiado.
⚠️ Aviso: Mantenha sua sessão SSH atual aberta durante toda a configuração.
Teste em uma nova janela antes de fechar a sessão existente.
Erros na configuração do PAM podem resultar em perda total de acesso ao servidor.
Por que senhas não são suficientes;
Redes de bots varrem blocos CIDR inteiros buscando portas abertas.
Ataques de dicionário testam milhares de combinações por segundo. Mesmo senhas complexas são vulneráveis a "credential stuffing" e vazamentos de bases de dados.
A defesa eficaz exige dois pilares:
• Algo que você possui (chave privada ED25519);
• Algo que você tem acesso temporário (token TOTP rotativo).
Pré-requisitos;
• Servidor Ubuntu/Debian (testado em Ubuntu 22.04 LTS e 24.04 LTS);
• Acesso root ou sudo;
• App autenticador TOTP (Google Authenticator, Bitwarden, Aegis, Raivo);
• Sessão SSH ativa (não feche até validar tudo).
- Etapa 1: Migração para Chaves ED25519
ED25519 oferece segurança equivalente a RSA-3072 com chaves significativamente menores e operações mais rápidas.
1.1. Gerar par de chaves (máquina local)ssh-keygen -t ed25519 -C "email@dominio.com.br
Defina uma "passphrase" forte para proteger a chave privada local.
1.2. Copiar chave pública para o servidorssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@ip-do-servidor
1.3. Validar acesso por chave
Abra uma nova janela de terminal e teste:ssh usuario@ip-do-servidor
Confirme que o login ocorre sem solicitação de senha do servidor (apenas passphrase da chave local, se definida). - Etapa 2: Instalação e Configuração do TOTP
2.1. Instalar módulo PAMsudo apt update && sudo apt install libpam-google-authenticator -y
2.2. Configurar TOTP (como usuário comum, NÃO como root)google-authenticator
2.3. Responda conforme abaixo
Time-based tokens? "Y" (TOTP padrão RFC 6238, códigos expiram em 30s);
Update ~/.google_authenticator? "Y" (Persiste configuração e segredo);
Disallow multiple uses? "Y" (Previne replay attacks);
Increase rate-limiting? "Y" (Bloqueia após 3 tentativas falhas em 30s);
Enable rate-limiting? "Y" (Mitiga brute-force no próprio token);
2.4. Armazenar códigos de emergência
Os scratch codes exibidos são seu único fallback se perder acesso ao app TOTP. Armazene-os em cofre físico ou gerenciador de senhas offline.
⚠️ Não os mantenha no mesmo servidor.
2.5. Validar TOTP antes de prosseguir
Insira o código de 6 dígitos quando solicitado pelo assistente.
Se falhar, não continue. Resolva o problema de sincronização de tempo (timedatectl status) antes de alterar o PAM. - Etapa 3: Integração PAM + SSHD
3.1. Configurar PAM para SSH
Edite/etc/pam.d/sshd:sudo nano /etc/pam.d/sshd
Adicione ao final do arquivo:# MFA TOTP
auth required pam_google_authenticator.so nullok
💡 Nota sobrenullok: Durante a fase de transição, este parâmetro permite que usuários que ainda não configuraram TOTP façam login.
Remova-o apenas após confirmar que TODOS os usuários ativos possuem TOTP configurado. Em produção madura, removanullokpara exigir MFA universal.
3.2. Configurar SSHD para exigir ambos os fatores
Edite/etc/ssh/sshd_config:sudo nano /etc/ssh/sshd_config
Altere/adicione as seguintes diretivas:# Desabilitar autenticação por senha
PasswordAuthentication no
# Desabilitar login direto como root
PermitRootLogin no
# Habilitar autenticação interativa (necessária para TOTP)
KbdInteractiveAuthentication yes
# Exigir chave pública E TOTP nesta ordem
AuthenticationMethods publickey,keyboard-interactive
3.3. Validar sintaxe e reiniciar
Verificar erros de configuração ANTES de reiniciarsudo sshd -t
Se não houver output, a config está válidasudo systemctl restart ssh - Validação Final
4.1. Mantenha a sessão SSH original aberta
4.2. Abra nova janela de terminal
4.3. Conecte-se: ssh usuario@ip-do-servidor - Fluxo esperado
• Autenticação por chave aceita (silenciosa ou passphrase local)
• Prompt Verification code: aparece
• Insira código TOTP de 6 dígitos
• Login concedido

- Próximos Passos (Hardening Avançado)
• Remover nullok após migração completa de todos os usuários
• Implementar CrowdSec para bloqueio automático de IPs
• Restringir acesso SSH por firewall (UFW/nftables) a IPs conhecidos
• Configurar certificados SSH assinados por CA interna (elimina gestão de chaves individuais)
• Auditoria periódica de ~/.google_authenticator e /var/log/auth.log
Referências;