La autenticación por clave SSH es segura, pero añadir un segundo factor (código TOTP de Google Authenticator) convierte el acceso a tus servidores en algo prácticamente irrompible: incluso si alguien roba tu clave privada, sin el código del móvil no puede entrar.
Instalar Google Authenticator PAM
sudo apt update && sudo apt install -y libpam-google-authenticator
Configurar el módulo TOTP para cada usuario
google-authenticator
El asistente hará varias preguntas:
Do you want authentication tokens to be time-based?→ y (TOTP)- Muestra un QR code: escanéalo con Google Authenticator, Authy o cualquier app TOTP
- Muestra códigos de emergencia (guárdalos en un lugar seguro)
Do you want me to update your "~/.google_authenticator" file?→ yDo you want to disallow multiple uses of the same authentication token?→ yBy default, tokens are good for 30 seconds...→ n (ventana estándar)Do you want to enable rate-limiting?→ y
Configurar PAM para SSH
sudo nano /etc/pam.d/sshd
Añadir al principio del archivo:
auth required pam_google_authenticator.so
Para que el código sea además de la clave SSH (no en lugar de):
auth required pam_google_authenticator.so nullok
Configurar SSH para aceptar el segundo factor
sudo nano /etc/ssh/sshd_config
Cambiar o añadir:
PubkeyAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
ChallengeResponseAuthentication yes
KbdInteractiveAuthentication yes
UsePAM yes
sudo sshd -t
sudo systemctl restart sshd
Probar la configuración
Abre una nueva sesión de terminal sin cerrar la actual:
ssh usuario@servidor
Eximir ciertas cuentas del 2FA
Si quieres que algunas cuentas de servicio no usen 2FA:
sudo nano /etc/ssh/sshd_config
Match Group sshusers
AuthenticationMethods publickey,keyboard-interactive
Match User deploy,ansible,backup
AuthenticationMethods publickey
Alternativa: 2FA solo para acceso desde internet
Match Address 10.0.0.0/8,192.168.0.0/16
AuthenticationMethods publickey
Match Address *
AuthenticationMethods publickey,keyboard-interactive
Gestionar los códigos de emergencia
Los códigos de emergencia se guardan en ~/.google_authenticator. Copia de seguridad:
cat ~/.google_authenticator
gpg --symmetric --cipher-algo AES256 ~/.google_authenticator
Regenerar los códigos TOTP
google-authenticator --force
La combinación clave SSH + TOTP es actualmente el estándar de facto para acceso seguro a servidores. Incluso si alguien compromete tu red o intercepta tu clave privada, sin el segundo factor en tu dispositivo físico no puede autenticarse. El tiempo de configuración es de 10 minutos por servidor y el impacto en el flujo de trabajo es mínimo.