SecuryBlack LogoSecuryBlack
← Blog/Seguridad

Cómo configurar 2FA / TOTP en SSH para blindar el acceso a tu VPS

·9 min de lectura
Cómo configurar 2FA / TOTP en SSH para blindar el acceso a tu VPS

Aunque deshabilites las contraseñas y uses únicamente llaves SSH criptográficas, existe un riesgo residual si la clave privada almacenada en tu ordenador local cae en manos inadecuadas. Para alcanzar el máximo nivel de protección en tus servidores, es fundamental seguir una guía de hardening y seguridad para servidores VPS bien estructurada.

En este tutorial aprenderás a configurar la autenticación de dos factores (2FA/TOTP) en OpenSSH utilizando PAM (Pluggable Authentication Modules) y aplicaciones estándar como Google Authenticator, Authy o 1Password.


1. ¿Por qué combinar llaves SSH con 2FA?

El esquema tradicional exige elegir entre contraseña + 2FA o llave SSH. Sin embargo, OpenSSH permite exigir ambos factores simultáneamente:

  1. Factor 1 (Algo que tienes): La clave privada SSH guardada en tu máquina local.
  2. Factor 2 (Algo que generas al instante): Un código temporal de 6 dígitos (TOTP) en tu smartphone.

Con esta combinación, incluso si un atacante consigue copiar tu archivo id_ed25519, no podrá acceder al VPS sin el código de un solo uso.


2. Paso 1: Instalar el módulo PAM de Google Authenticator

Accede a tu VPS por SSH e instala el paquete oficial en sistemas Debian o Ubuntu:

sudo apt update && sudo apt install libpam-google-authenticator -y

3. Paso 2: Generar la clave secreta y códigos de rescate

Ejecuta el asistente interactivo para el usuario con el que te conectas (evita hacerlo directamente como root):

google-authenticator

El asistente te hará varias preguntas de seguridad. Te recomendamos responder lo siguiente:

  • Do you want authentication tokens to be time-based?: y (Sí, basar tokens en el tiempo).
  • Escanea el código QR que aparece en la terminal con tu aplicación de autenticación (o introduce la clave secreta a mano).
  • Guarda los 5 códigos de emergencia (emergency scratch codes) en un lugar seguro offline. Si pierdes el móvil, serán la única forma de entrar.
  • Update your ~/.google_authenticator file?: y.
  • Disallow multiple uses of the same authentication token?: y (Evita ataques de reanimación).
  • Permit time skew (increase window)?: n (Mantiene el margen ajustado a 30 segundos).
  • Enable rate-limiting?: y (Limita a máximo 3 intentos cada 30 segundos).

4. Paso 3: Configurar PAM para incluir el módulo

Abre el archivo de configuración de PAM para SSH:

sudo nano /etc/pam.d/sshd

Si usas llaves SSH + 2FA, añade la siguiente línea al final del archivo:

auth required pam_google_authenticator.so nullok

(La directiva nullok permite que los usuarios que aún no hayan configurado 2FA puedan entrar. Una vez que todos lo tengan activo, retira nullok para exigir 2FA obligatoriamente).


5. Paso 4: Ajustar la configuración de OpenSSH (sshd_config)

Abre el archivo principal de configuración de SSH:

sudo nano /etc/ssh/sshd_config

Asegúrate de ajustar los siguientes parámetros:

# Activar la integración con PAM
UsePAM yes

# Permitir autenticación interactiva para pedir el código TOTP
KbdInteractiveAuthentication yes

# Exigir clave SSH Y código TOTP (ambos necesarios)
AuthenticationMethods publickey,keyboard-interactive

Guarda los cambios y valida la sintaxis antes de reiniciar:

sudo sshd -t

Si no hay errores de sintaxis, reinicia el demonio SSH:

sudo systemctl restart ssh

6. Paso 5: Probar la conexión (¡Sin cerrar tu sesión actual!)

No cierres la ventana de terminal actual. Abre una segunda ventana e intenta conectar a tu servidor:

ssh tu_usuario@IP_DE_TU_VPS

El servidor primero validará tu llave SSH y a continuación te solicitará:

Verification code:

Introduce el código de 6 dígitos generado por tu aplicación móvil. Si la autenticación es correcta, habrás entrado con doble factor.


7. Auditoría de seguridad continua con SecuryBlack

Configurar 2FA en SSH es un paso excelente, pero la seguridad de tu servidor requiere auditar periódicamente otros aspectos críticos (puertos expuestos, permisos de archivos, reglas de UFW y actualizaciones del kernel).

El agente de seguridad open source FerroSentry integrado en SecuryBlack audita continuamente la configuración de tu demonio SSH y de tu cortafuegos, avisándote de inmediato si algún parámetro de seguridad se desconfigura por error.