Implementar un segundo factor de autenticación 2FA en servicios SSH sin duda es una muy buena opción de seguridad no solo para servidores expuestos a internet sino para aquellos usuarios que pueden elevarse a un contexto privilegiado de sudo y servidores críticos en una red interna corporativa.
Con este mecanismo de autenticación en dos pasos se estaría reduciendo en gran medida la superficie de ataque de los vectores de entrada a estos sistemas por parte de un posible atacante.
Implementación 2FA en SSH (Google Authenticator) Link to heading
Instalar el paquete del módulo PAM para 2FA libpam-google-authenticator de Google Authenticator, también se instalará el paquete libqrencode4 que permite generar códigos QR en la propia terminal.
sudo apt install libpam-google-authenticator -y
Configurar SSH para que haga uso de este módulo PAM. Añadir la siguiente línea en el fichero /etc/pam.d/sshd.
auth required pam_google_authenticator.so
Habilitar esta configuración en el fichero de configuración del servicio de SSH /etc/ssh/sshd_config. Añadimos o modificamos si ya existe la siguiente política a un valor “yes”.
ChallengeResponseAuthentication yes
Reiniciamos el servicio sshd para aplicar los cambios realizados en el servicio de SSH.
sudo systemctl restart sshd
Finalmente vinculamos la cuenta de usuario en la que queremos habilitar 2FA. Se nos mostrará un código QR el cual debemos vincular con nuestra App de doble factor, ya sea Google Authenticator u otra que utilicemos para generar códigos de un solo uso basado en tiempo TOTP.
google-authenticator
Se lanzará el asistente de configuración donde asociaremos la clave secreta con nuestra App de segundo factor. También se generarán “5 códigos de emergencia de un solo uso” los cuales los almacenaremos de forma segura en caso de perder el acceso a nuestra App de TOTP instalada en un dispositivo físico.
Conserva los códigos de emergencia
Los 5 códigos scratch que genera
google-authenticatorson tu único acceso si pierdes el dispositivo con la app TOTP. Anótalos en un gestor de contraseñas o impreso en un lugar seguro; sin ellos y sin el móvil, el bloqueo del acceso SSH es total y solo se recupera por consola física.

Figura 1: Creación de código QR - Asistente de vinculación para habilitar 2FA.
Una vez finalizado el asistente de vinculación. Si nos intentamos autenticar en el servidor nos solicitará la contraseña de usuario y un código de verificación TOTP.

Figura 2: Verificación del uso de 2FA en la autenticación SSH al servidor.
En este caso se ha vinculado con la App de Google Authenticator donde cada 30 segundos se generará un nuevo código TOTP.

Figura 3: Código TOTP en la App de Google Authenticator.
Aclarar que aunque tengamos la política de PasswordAuthentication no establecida en nuestro fichero de servicio SSH al implementar 2FA será ignorada y será exigido introducir la contraseña de usuario para autenticarse en el servidor.
PasswordAuthentication no afecta al challenge TOTP
Aunque
PasswordAuthentication noesté configurado, conChallengeResponseAuthentication yesy PAM activo SSH seguirá pidiendo el código TOTP más la password. La directiva de password solo afecta a la autenticación PAP plana, no al challenge interactivo de Google Authenticator.
Paranoid Mode 3FA: Combinar autenticación SSH Public Key + Password + TOTP Link to heading
¿Qué pasa si previamente tenemos configurado una autenticación de clave pública en nuestro servicio de conexión SSH hacia el servidor y añadimos 2FA TOTP?
Si ya tenemos configurada una autenticación asimétrica de clave pública y añadimos un segundo factor basado en TOTP a priori con esta configuración actual, no funcionará.
Si queremos combinar un tipo de factor TOTP junto con nuestra autenticación de clave pública en SSH debemos añadir la siguiente política en el fichero de configuración del servicio de SSH /etc/ssh/sshd_config.
AuthenticationMethods publickey,keyboard-interactive
Reiniciamos el servicio SSH para aplicar los cambios.
sudo systemctl restart sshd
De este modo cuando nos conectamos al servidor SSH no solo estaremos combinando SSH Public Key y TOTP sino que también debemos introducir la contraseña de usuario. Por lo que estaremos usando autenticación de tres factores (3FA) o también conocido como autenticación de múltiples factores (MFA) para acceder al servidor vía SSH.
- Autenticación con clave pública/privada.
- Autenticación password de la cuenta de usuario.
- Autenticación con código de verificación TOTP.
Aunque en el fichero de configuración del servicio SSH tengamos establecida la política PasswordAuthentication no al combinarla con keyboard-interactive nos obligará a introducir la password de la cuenta de usuario con el que nos autenticamos.

Figura 4: Verificación del uso de 3FA en la autenticación SSH al servidor.
Permitir autenticación SSH sin 2FA para usuarios que aún no configuraron Google Authenticator Link to heading
Si en la máquina servidor hay más usuarios que necesiten autenticarse vía SSH y, por el momento, estos usuarios aún no han configurado 2FA para sus cuentas, o si son usuarios sin privilegios para los que no se considera la implementación de 2FA, pero que igualmente deben poder autenticarse e iniciar sesión en el servidor sin necesidad de utilizar TOTP como segundo factor.
Podemos añadir el valor nullock a la siguiente directiva del módulo de PAM editando el fichero /etc/pam.d/sshd.
auth required pam_google_authenticator.so nullok
Saludos!