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.

SSH Hardening: Implementação de MFA e PAM em servidores Linux críticos.

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).

  1. 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 servidor

    ssh-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).

  2. Etapa 2: Instalação e Configuração do TOTP

    2.1. Instalar módulo PAM

    sudo 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.

  3. 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 sobre nullok: 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, remova nullok para 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 reiniciar

    sudo sshd -t

    Se não houver output, a config está válida

    sudo systemctl restart ssh

  4. 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

  5. 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
Apenas após sucesso confirmado, feche a sessão original
  1. 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;

Subscribe to Blog do Francisco Monteiro

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
joao.silva@exemplo.com
Inscreva-se