Ir al contenido
  1. Posts/

Configurando una Llave de Seguridad Yubikey 2FA/U2F en Fedora

·2099 palabras·10 mins· loading · loading ·
Linux Seguridad DevOps Linux Seguridad 2FA Devops
Autor
Enmanuel Moreira
Ingeniero DevOps de día y aprendiz de Barman en mis tiempos libres, con experiencia en Kubernetes, Cloud, y DevOps. También disfruta de hacer stream de juegos, hablar de CI/CD, desplegar en producción un viernes con Terraform y automatizar tareas aburridas con Ansible.

PROMO DigitalOcean
#

Antes de comenzar, quería contarles que hay una promoción en DigitalOcean donde te dan un crédito de USD 200.00 durante 60 días para que puedas probar los servicios que este Proveedor Cloud ofrece. Lo único que tienes que hacer es suscribirte a DigitalOcean con el siguiente botón:

DigitalOcean Referral Badge

O a través del siguiente enlace: https://bit.ly/digitalocean-itsm

Después de este breve espacio publicitario, vamos manos a la obra!

Introducción
#

En esta guia vamos a configurar una llave física de seguridad Yubikey como segundo factor de autenticación (2FA) usando U2F en Fedora con KDE y SDDM. Con KDE como ambiente de escritorio podemos usar Yubikey para asegurar los siguientes tipos de inicio de sesión:

  • Pantalla de inicio de sesión (both initial and lock screen)
  • sudo
  • su
  • Ventanas emergentes de autenticación (policykit) cuando se abre una app en la GUI.

Hay varios modelos de Yubikey, la que tengo especificamente es el modelo Yubikey 5 NFC

Necesitaremos para ello digitar nuestra contraseña y además que el dispositivo Yubikey este conectado a nuestro equipo por un puerto USB, y una vez que sea requerido, pulsar el pequeño botón que tiene la llave para poder realizar la acción. Asi que, no podremos iniciar sesión o ejecutar comandos como sudo sin nuestra llave física Yubikey.

Que no Cubre esta Guia
#

No requerimos la llave física para SSH o cualquier forma de autenticación remota, solo aplica para los métodos de inicio de sesión antes mencionados. Además, no reemplaza el uso de autenticación usuario/contraseña. Eventualmente, este post puede ser modificado en un futuro, pero se escapa del propósito de esta guia.

Advertencia
#

  • Seguir los pasos de este post bajo tu propio riesgo! Ni yo ni nada mas somos los responsables de ejecutar cualquiera de los pasos aqui descritos y perder el acceso a tu sistema.

  • Haz pruebas! Configura una maquina virtual o un computador por separado para confirmar si funciona de manera correcta, incluyendo después de un reinicio.

  • Recomiendo encarecidamente tener mínimo 2 Yubikey en caso de que una de ellas se rompa o dañe.

  • No sigas esta guia a menos que entiendas las implicaciones de que es lo que estas haciendo y prevenir que tu sistema quede inaccesible.

Tenga en cuenta que si no tienes encriptado tu disco duro, es posible evitar la necesidad de una Yubikey/2FA. También recomendaría proteger con contraseña su UEFI/BIOS junto con encriptar el disco, pero eso depende de ti.

Requisitos
#

Entonces, para proseguir, necesitaríamos lo siguiente:

  1. Una Yubikey (Solo la he probado con el modelo Yubikey 5 NFC pero puede servir con otros modelos)

  2. Un puerto USB libre (Normal o Tipo C según el modelo de la llave)

  3. Fedora con KDE instalado (Fedora 40 es el que tengo en este momento)

Paquetes Necesarios
#

Necesitaremos solo dos paquetes a instalar pam-u2f y pamu2fcfg:

sudo dnf install pam-u2f pamu2fcfg -y

Configurando las Llaves/Mapeado
#

En este paso creamos los archivos que nos permitirán mapear nuestras llaves para la cual se autentiquen. Lo podemos hacer de dos maneras: La primera es tener un único archivo para cada usuario en donde se puedan configurar y cambiar sus propias llaves cuando sea necesario y para que ninguna persona tenga acceso a todas las llaves en un solo lugar, facilitando un poco la configuración posterior de los archivos PAM (Método el cual usaré) La segunda opción es usando un único archivo de mapeo en /etc/u2f_mappings.

Creando los Archivos de Mapeado de Llaves
#

Necesitamos crear 1 archivo para cada usuario y 1 archivo para el usuario root.

Cada Usuario (con sesión iniciada):

  1. Creamos la carpeta de configuración de la llave con el siguiente comando:
mkdir ~/.config/Yubico
  1. Ejecutamos el siguiente comando para guardar la llave:
pamu2fcfg > ~/.config/Yubico/u2f_keys

Cuando la Yubikey parpadee, presionamos el botoncito que tiene incorporado.

Si queremos agregar otra llave como respaldo, por ejemplo, ejecutamos el siguiente comando:

pamu2fcfg -n >> ~/.config/Yubico/u2f_keys

Tocamos el botón de la llave de respaldo y luego tocamos el botón de la llave principal para que quede guardada.

Usuario Root:

  1. Nos cambiamos al usuario root con el comando su -. Nos pedirá la contraseña de root.

  2. Si no estamos en el directorio, nos cambiamos con cd /root

  3. Creamos la carpeta de configuración de la llave con el siguiente comando:

mkdir -p ~/.config/Yubico
  1. Ejecutamos el siguiente comando para guardar la llave:
pamu2fcfg > ~/.config/Yubico/u2f_keys

Si queremos agregar otra llave como respaldo, por ejemplo, ejecutamos el siguiente comando:

pamu2fcfg -n >> ~/.config/Yubico/u2f_keys

Después de haber completado este procedimiento, cada usuario tendrá el archivo ~/.config/Yubico/u2f_keys en la carpeta /home/usuario (/root para el usuario root) que contendrá las llaves para cada llave física Yubikey que hemos configurado.

Probando el Mapeo de Llaves
#

Para asegurarnos que hemos seguido los pasos indicados con anterioridad, habilitando 2FA con sudo es la manera mas rápida y segura paa probar.

Siguiendo los pasos que te voy a indicar en el apartado de Sudo 2FA, podemos probar. Asegúrate de mantener la terminal abierta mientras haces los cambios, si la cierras muy probablemente no podrás iniciar sesión como sudo o bloquear el acceso.

Abre una segunda terminal y ejecuta sudo echo test. Te pedirá la contraseña de sudo y toca el botón de la Yubikey después de ver el texto “test” en la salida. En caso que no pase nada, chequea de nuevo en la primera terminal y luego cierra y abre la segunda e intenta de nuevo.

Si funciona y aun asi no quieres 2FA con sudo, simplemente eliminamos o comentamos la lineas añadidas en el archivo /etc/pam.d/sudo.

Implementando 2FA
#

A partir de aqui es donde habilitamos el uso de la Yubikey como 2FA via U2F para cada inicio de sesión que deseemos. Todos los archivos a modificar se encuentran en /etc/pam.d y se aplicará a todos los usuarios.

Sudo 2FA
#

Para habilitar 2FA usando U2F con la Yubikey para sudo, hacemos lo siguiente:

  1. Modificamos el archivo /etc/pam.d/sudo con nuestro editor de confianza:
sudo nano /etc/pam.d/sudo
  1. Cambiamos la linea donde dice auth include system-auth para auth substack system-auth.

  2. Debajo de la linea auth substack system-auth agregamos lo siguiente: auth required pam_u2f.so cue

  3. Para guardar los cambios pulsamos CRTL+S y para salir del editor CRTL+X

Quedaria más o menos así:

#%PAM-1.0
auth       substack     system-auth
auth       required     pam_u2f.so cue
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so revoke
session    required     pam_limits.so
session    include      system-auth

Con cue al final de la linea añadida, nos aseguramos que en el prompt de la terminal nos muestre un mensaje que diga "Please touch the device" para que toquemos el botoncito de la Yubikey y autorizar el comando indicado.

Asi, cuando usemos sudo en la terminal, aparte de pedirnos la contraseña, nos pedirá que presionemos el botoncito de la Yubikey. Si la llave no está conectada o no presionamos el boton en un tiempo razonable, la autenticación fallará y el comando no se ejecutará.

SU 2FA
#

Para habilitar 2FA usando U2F con tu Yubikey para root su:

  1. Modificamos el archivo /etc/pam.d/su con nuestro editor de confianza:
sudo nano /etc/pam.d/su
  1. Debajo de la linea auth substack system-auth agregamos lo siguiente: auth required pam_u2f.so cue

  2. Para guardar los cambios pulsamos CRTL+S y para salir del editor CRTL+X

Quedaría más o menos así:

#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid
auth            substack        system-auth
auth            required        pam_u2f.so cue
auth            include         postlogin
account         sufficient      pam_succeed_if.so uid = 0 use_uid quiet
account         include         system-auth
password        include         system-auth
session         include         system-auth
session         include         postlogin
session         optional        pam_xauth.so

Con cue al final de la linea añadida, nos aseguramos que en el prompt de la terminal nos muestre un mensaje que diga "Please touch the device" para que toquemos el botoncito de la Yubikey y autorizar el comando indicado.

Para que su funcione con la Yubikey, cualquier usuario que intente cambiarse de usuario para root, necesite tener la llave asignada a el, es decir, el usuario necesitaria tener su llave registrada en el archivo u2f_keys.

Asi, cuando usemos su en la terminal, aparte de pedirnos la contraseña, nos pedirá que presionemos el botoncito de la Yubikey. Si la llave no está conectada o no presionamos el botón en un tiempo razonable, la autenticación fallará y no podremos cambiarnos al usuario root.

Inicio de Sesión en KDE con 2FA
#

Para habilitar 2FA usando U2F con la Yubikey e iniciar sesión en KDE via SDDM, hacemos lo siguiente:

  1. Modificamos el archivo /etc/pam.d/sddm con nuestro editor de confianza:
sudo nano /etc/pam.d/sddm
  1. Debajo de la linea auth substack password-auth agregamos lo siguiente: auth required pam_u2f.so

  2. Para guardar los cambios pulsamos CRTL+S y para salir del editor CRTL+X

Quedaría más o menos así:

auth     [success=done ignore=ignore default=bad] pam_selinux_permit.so
auth        substack      password-auth
auth        required      pam_u2f.so
-auth        optional      pam_gnome_keyring.so
-auth        optional      pam_kwallet5.so
-auth        optional      pam_kwallet.so
auth        include       postlogin

account     required      pam_nologin.so
account     include       password-auth

password    include       password-auth

session     required      pam_selinux.so close
session     required      pam_loginuid.so
-session    optional    pam_ck_connector.so
session     required      pam_selinux.so open
session     optional      pam_keyinit.so force revoke
session     required      pam_namespace.so
session     include       password-auth
-session     optional      pam_gnome_keyring.so auto_start
-session     optional      pam_kwallet5.so auto_start
-session     optional      pam_kwallet.so auto_start
session     include       postlogin

cue no funciona en la pantalla de inicio de sesión como con sudo/su.

Cuando iniciamos sesión en la GUI, nos pedirá la contraseña. No nos mostrará ningún indicativo visual que debemos presionar el botón de la Yubikey, sin embargo, el botón comenzará a parpadear después de colocar la contraseña y presionar ENTER por lo que es el momento de presionar el botón de la llave. si la llave no estuviera conectada o no se presiona el botón en un tiempo razonable, no se podrá autenticar y fallará el inicio de sesión.

Pantalla de Bloqueo de KDE con 2FA
#

Para habilitar 2FA usando U2F con la Yubikey y desbloquear la pantalla en KDE via SDDM, requerimos que la llave esté conectada todo el tiempo que la pantalla esté bloqueada. Para lograrlo, haremos lo siguiente:

  1. Modificamos el archivo /etc/pam.d/kde con nuestro editor de confianza:
sudo nano /etc/pam.d/kde
  1. Debajo de la linea auth substack password-auth agregamos lo siguiente: auth required pam_u2f.so

  2. Para guardar los cambios pulsamos CRTL+S y para salir del editor CRTL+X

Quedaría más o menos así:

auth        substack      system-auth
auth        required      pam_u2f.so
auth        include       postlogin

account     required      pam_nologin.so
account     include       password-auth

password    include       password-auth

session     required      pam_selinux.so close
session     required      pam_loginuid.so
session     required      pam_selinux.so open
session     optional      pam_keyinit.so force revoke
session     required      pam_namespace.so
session     include       password-auth
session     include       postlogin

cue no funciona en la pantalla de desbloqueo como con sudo/su.

Cuando desbloqueamos la pantalla y nos relogueamos al sistema, nos pedirá la contraseña. No nos mostrará ningún indicativo visual que debemos presionar el botón de la Yubikey, sin embargo, el botón comenzará a parpadear después de colocar la contraseña y presionar ENTER por lo que es el momento de presionar el botón de la llave. si la llave no estuviera conectada o no se presiona el botón en un tiempo razonable, no se podrá autenticar y fallará el inicio de sesión.

PolicyKit KDE Agent 2FA
#

Para habilitar 2FA usando U2F con la Yubikey para autenticarnos con las ventanaz emergentes de ciertas aplicaciones en KDE que requieran credenciales (por ejemplo: la GUI del Firewall), haremos lo siguiente:

  1. En caso que no exista el archivo de configuración, lo creamos desde su archivo por defecto:
sudo cat /usr/lib/pam.d/polkit-1 > /etc/pam.d/polkit-1`
  1. Editamos el archivo:
sudo nano /etc/pam.d/polkit-1`
  1. Debajo de la linea auth include system-auth añadimos lo siguiente: auth required pam_u2f.so

  2. Para guardar los cambios pulsamos CRTL+S y para salir del editor CRTL+X

Quedaría más o menos así:

#%PAM-1.0

auth       include      system-auth
auth       required     pam_u2f.so
account    include      system-auth
password   include      system-auth
session    include      system-auth

cue no funciona en la pantalla de desbloqueo como con sudo/su.

Cuando ejecutemos un programa con GUI que necesite autenticación, nos pedirá la contraseña. No nos mostrará ningún indicativo visual que debemos presionar el botón de la Yubikey, sin embargo, el botón comenzará a parpadear después de colocar la contraseña y presionar ENTER por lo que es el momento de presionar el botón de la llave. si la llave no estuviera conectada o no se presiona el botón en un tiempo razonable, no se podrá autenticar y fallará la autenticación.

Referencias
#

Espero que te vaya gustado este artículo y ¡nos vemos en la próxima!