November 1, 2023 · Linux

Autenticación de doble factor OTP con sudo y SSH usando la API Google Authenticator

Introducción:

Que es 2FA: La autenticación de dos factores, o 2FA, confirma la identidad de un usuario a través de dos factores diferentes: algo que sabe y algo que tiene. La 2FA también se conoce como autenticación multifactor, verificación en dos pasos y autenticación en dos pasos

Que es OTP: ‘one time password’ es un código de uso único que sirve para reforzar la seguridad de una contraseña o método de acceso. Se utiliza cuando se desea establecer un modo de entrada más protegido que las contraseñas estáticas

En esta guía, se explica cómo utilizar el módulo PAM de Google Authenticator para la autenticación SSH y sudo.

1. Instalar el módulo PAM de Google Authenticator

Debian, Ubuntu y otras distribuciones basadas en apt

apt-get install libpam-google-authenticator
    

CentOS, Rocky Linux, Alma Linux y otros clones basados en RHEL

yum install epel-release
yum install google-authenticator
    

2. Crear usuario con privilegios de Administrador en Linux y crear un usuario normal

Crearemos los usuarios con los siguientes comandos

useradd -m -s /bin/bash -d /home/sysadmin1 -c "Usuario administrador" sysadmin1
useradd -m -s /bin/bash -d /home/user1  user1
    

3. Eliminamos las contraseñas en los usuarios creados anteriormente

Ahora procedemos a Eliminar las contraseñas con los siguientes comandos

passwd -d sysadmin1
passwd -d user1
    

4. Generar tu código 2FA

Nota: Cada usuario que se conecte al servidor realizará estos pasos.

Ejecute el programa de configuración de Google Authenticator. Puede ejecutar el programa sin opciones de línea de comandos para una configuración interactiva o utilizar las siguientes opciones:

sysadmin1@server02:~$ google-authenticator -t -f -d -w 3 -e 10 -r 3 -R 30
    

Explicación de estas opciones:

El programa actualizará sus archivos de configuración y mostrará varios valores:

Importante: Siga las instrucciones de su aplicación 2FA para crear una nueva entrada con el código QR o la clave secreta. Guarde sus códigos de emergencia en un lugar seguro. Si necesita restablecer el código, vuelva a ejecutar el programa.

5. Instalación de extensión OTP para Google Chrome o navegadores basados de chromium

A continuación, instalaremos una extensión en nuestro navegador para usar el token generado anteriormente

Después de instalar la extensión procedemos a configurarla con el secret key que se generó en el paso anterior. En nuestro caso el secret key que se generó para nuestro usuario sysadmin1 es el siguiente "5C4B7VACW3DFOFHNSYB7KZPN4M" también como podemos ver se nos generó un código QR el cual podemos escanear con herramientas como freeOTP o Microsoft OTP.

En este caso la configuración la realizaremos de forma manual con la extensión instalada. El archivo de configuración se genera en por defecto en cada home de los usuarios en la siguiente ruta ~/.google_authenticator

6. Configurar SSH

Crearemos la llave privada y la llave publica ssh de nuestro usuario creado en el paso 2 de esta guía

ssh-keygen -t rsa -b 2048 -m pem
    


 Generating public/private rsa key pair.
 Enter file in which to save the key (/home/sysadmin1/.ssh/id_rsa):
 Created directory '/home/sysadmin1/.ssh'.
 Enter passphrase (empty for no passphrase):
 Enter same passphrase again:
 Your identification has been saved in /home/sysadmin1/.ssh/id_rsa
 Your public key has been saved in /home/sysadmin1/.ssh/id_rsa.pub
 The key fingerprint is:
 SHA256:vWqW2isolY2fv/YkhLd7vAO91sWqwshGqKlfGgNXYWo sysadmin1@server02
 The key's randomart image is:
        +---[RSA 2048]----+
        |    o            |
        |   o .           |
        |  E .            |
        | . .   . .       |
        |. .  =. S..  .   |
        | o  = oo....  o  |
        |  o+.= +o+oo o   |
        |  +=. B.B=* o    |
        |.oo. ..BBB++     |
        +----[SHA256]-----+
        sysadmin1@server02:~$
    

Ingresamos al siguiente directorio ~/.ssh  y renombramos el siguiente archivo id_rsa.pub a authorized_keys este es nuestro archivo de nuestra llave publica generada a partir del anterior paso

cd ~/.ssh
mv id_rsa.pub authorized_keys
    

Editar el archivo de configuración de SSH PAM.

vim /etc/pam.d/sshd

Agrega la siguiente línea al final del archivo. La opción permite a los usuarios que aún no han generado un código 2FA iniciar sesión, mientras que los códigos son obligatorios si el usuario ha seguido el paso 2 anterior. Esta opción es útil durante el lanzamiento. Una vez que todos los usuarios hayan generado códigos, puede eliminar la opción de requerir 2FA para todos.nulloknullok

auth required pam_google_authenticator.so nullok

Deshabilite la autenticación con contraseña de usuario. Comenta la siguiente línea añadiendo al principio.#

# @include common-auth

Guarde y cierre el archivo.

7. Configuración del servicio ssh

Edite el archivo de configuración del demonio SSH.

 nano /etc/ssh/sshd_config

Busque la línea para y establezca su valor en yes.ChallengeResponseAuthentication

Compruebe que las siguientes opciones están configuradas como se muestra o agréguelas si no existen.

AuthorizedKeysFile      .ssh/authorized_keys
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

Guarde y cierre el archivo y Reinicie el demonio de servicio SSH

systemctl restart ssh

8. Configurar 2FA para Sudo

Ahora editamos el archivo sudo de la siguiente manera.

visudo

y en el archivo de sudo insertamos la siguiente línea

sysadmin1 ALL=(ALL:ALL) ALL

guardamos y salimos y editamos el siguiente archivo de la siguiente manera

vim /etc/pam.d/common-auth

Agregue estas líneas al final del archivo. La opción permite a los usuarios que aún no han generado un código 2FA usar sudo, mientras que los códigos son necesarios si el usuario ha seguido el paso 2 anterior. Esta opción es útil durante el lanzamiento. Una vez que todos los usuarios hayan generado códigos, puede eliminar la opción de requerir 2FA para todos.

auth required pam_google_authenticator.so nullok
auth required pam_permit.so

Nota: Los usuarios que tengan NOPASSWD configurado en el archivo sudoers no recibirán el desafío 2FA.

Guardamos y cerramos el archivo

Pruebas de Conexión:

Como vemos se nos genera la opción de colocar nuestro token OTP como se ve en la imagen anterior.

Ahora vemos como no podemos conectar correctamente con nuestra llave privada y nuestro OTP generado de forma aleatoria

Recuperarse de un bloqueo de 2FA

Respaldo de emergencia

Si pierdes el acceso a tu aplicación de autenticación, usa uno de tus códigos de respaldo de emergencia. Los códigos son de un solo uso.

Deshabilitar 2FA para un usuario específico

Para deshabilitar la 2FA para un usuario específico:

  1. Inicie sesión como root.

Elimine el archivo en el directorio principal del usuario..google_authenticator

$ sudo rm /home/sysadmin1/.google_authenticator

Desactivar la 2FA para todos los usuarios

Para deshabilitar la 2FA para todos los usuarios:

  1. Editar./etc/ssh/sshd_config

Localice la siguiente línea:

AuthenticationMethods publickey,keyboard-interactive

Elimine el método:keyboard-interactive

AuthenticationMethods publickey

Edite también el archivo de pam ssh y descomente la línea

 vim /etc/pam.d/sshd
 @include common-auth

comanta la siguiente linea

# auth required pam_google_authenticator.so nullok

Guarde y cierre el archivo y, a continuación, reinicie el demonio SSH:

$ sudo systemctl restart ssh