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:
- -t : Usar verificación TOTP
- -f : Escribe la configuración en
~/.google_authenticator
- -d : No permite la reutilización de tokens utilizados anteriormente.
- -w 3 : El tamaño de la ventana de los tokens permitidos. De forma predeterminada, los tokens caducan cada 30 segundos. Un tamaño de ventana de 3 permite la autenticación con el token antes y después del token actual para el sesgo del reloj.
- -e 10 : Generar 10 códigos de respaldo de emergencia
- -r 3 -R 30 : Límite de velocidad. Permita 3 inicios de sesión cada 30 segundos.
El programa actualizará sus archivos de configuración y mostrará varios valores:
- Un código QR. Puede escanear este código con la mayoría de las aplicaciones de autenticación.
- Una clave secreta. Ingrese esta clave en su aplicación si no puede escanear el código QR.
- El código de verificación inicial, que caducará en 30 segundos.
- Una lista de 10 códigos de emergencia de un solo uso.
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:
- 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:
- 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