Usuario y clave con One Time Password (Google Authenticator o Latch OTP)
En esta parte del manual, vamos a autenticarnos con el usuario/contraseña de siempre, pero además, deberemos usar un OTP con Google Authenticator o Latch OTP para entrar en la sesión. Es decir, dotaremos al servidor SSH de verificación en dos pasos.
Lo primero que debemos hacer es instalar una serie de dependencias necesarias para poder configurar la doble autenticación en nuestro servidor SSH. Para ello abriremos un terminal y teclearemos:
$ sudo apt install libpam0g-dev make gcc wget ssh
Una vez que las dependencias están instaladas en nuestro sistema ya podemos descargar el software para la doble autenticación.
$ sudo apt install libpam-google-authenticator
Ya tenemos instalado Google Authenticator en nuestro sistema operativo. Los siguientes pasos a seguir son la configuración de la herramienta para poderla utilizar en nuestro SSH.
Para comenzar con la configuración de Google Authenticator simplemente debemos teclear en el terminal:
$ google-authenticator
NOTA: Ejecutarlo sin permisos de root (sudo), es decir, ejecutarlo como usuario «normal». Si lo ejecutas como root, ese Google Auth solo estará disponible en el propio root, y al deshabilitarlo en el propio SSH no hará nada.
A continuación veremos un sencillo asistente desde el terminal. Lo primero que nos preguntará es si queremos que nuestros tokens de acceso estén basados en el tiempo. A continuación veremos la clave privada, la clave de verificación y los códigos de emergencia si no tenemos nuestro móvil a mano. Debemos guardar todos estos datos de forma segura de manera que podamos recuperar el acceso en caso de pérdida de la clave de autenticación.
Después le decimos que guarde los cambios en el archivo de nuestra carpeta /home y nos preguntará si queremos que cada token sea utilizado una única vez, aunque eso limite a un inicio de sesión cada 30 segundos. Para protegernos frente a posibles ataques MITM seleccionamos que sí. Por último, nos preguntará si queremos ampliar el periodo de validez de cada código en lugar de solo 1 minuto y 30 segundos (para evitar problemas de sincronización de tiempo). Para evitar ataques de fuerza bruta también podemos limitar las conexiones a 3 por cada 30 segundos.
El escaneo del código QR o la introducción manualmente de código se puede realizar en programas como Google Authenticator, Authy, Latch y un largo etcétera. Recomendamos el uso de Google Authenticator o Latch.
El siguiente paso que debemos hacer es abrir el fichero de configuración de «sshd» para indicarle que utilice este módulo para el inicio de sesión. Para ello podemos teclear:
$ sudo nano /etc/pam.d/sshd
Y añadiremos al final del fichero la siguiente línea:
auth required pam_google_authenticator.so
Guardamos los cambios y abrimos el fichero sshd_config con el siguiente comando:
$ sudo nano /etc/ssh/sshd_config
Y cambiamos la línea «ChallengeResponseAuthentication no» por «ChallengeResponseAuthentication yes».
Reiniciamos el servidor con «sudo /etc/init.d/ssh restart» y una vez que vuelva a arrancar, ya tendremos la autenticación en dos pasos habilitada.
Una vez hecho, con el inicio de sesión también nos pedirá una clave de un solo uso, el código generado por nuestra aplicación móvil.
Clave pública SSH con One Time Password (Google Authenticator o Latch OTP)
La configuración a nivel de clave pública debe ser exactamente igual que antes, y a nivel de instalación y configuración del Google Authenticator también. La única diferencia es que en el fichero sshd_config deberemos tener algo así:
PasswordAuthentication no
ChallengeResponseAuthentication yes
PubKeyAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
Y en el fichero /etc/pam.d/sshd debemos tener algo como esto:
#@include common-auth
auth required pam_google_authenticator.so
Muy importante poner una almohadilla (#) para comentar el @include, de esta forma, nos autenticaremos correctamente con clave pública más el código OTP generado por el móvil. De esta forma, estaremos diciéndole al servidor que acepte autenticación con clave pública únicamente.