yubikey-linux-intro-part2.webp

Parte 2 - Usar YubiKey con SSH para autenticarse en servidores SSH remotos. No voy a explicar qué es SSH y sus casos de uso o configuración, pero podría hacer un análisis profundo si alguien está interesado.

Nota: Toda la configuración se realiza en Fedora con GNOME DE (aplicable 1-a-1 en distribuciones relacionadas) y YubiKey 5C / USB (no la versión Biométrica).



Autenticación SSH con YubiKey FIDO2

¿Qué es FIDO2?

FIDO2 es un estándar de autenticación abierto que te permite usar llave de seguridad de hardware (como YubiKey) para autenticación sin contraseña.


OpenSSH + FIDO2

OpenSSH agregó soporte para FIDO2 en la versión 8.2, lo que significa que ahora podemos usar la YubiKey junto con (o en lugar de) autenticación tradicional basada en contraseña o clave.

Cuando te autenticas, las operaciones criptográficas ocurren directamente en el token de hardware en sí. Así que incluso si alguien compromete tu computadora y roba tus archivos de llave SSH, aún no puede autenticarse sin tener físicamente tu YubiKey.

Esto ofrece otra capa de seguridad. Cada autenticación requiere que toques físicamente tu YubiKey (también puedes configurarla para requerir verificación de PIN si deseas más seguridad).


Tipos de Llaves SSH FIDO2

Hay 2 tipos de llaves SSH FIDO2:

Llaves No Residentes:

  • La llave privada se almacena como un archivo en la computadora junto con tus otras llaves SSH.
  • Esto es igual a una llave SSH tradicional, sin embargo, la llave es inútil por sí sola. Requiere tu YubiKey para realizar cualquier operación (como iniciar sesión).
  • Estas llave no consumen ninguno de los espacios de credenciales de tu YubiKey (puedes crear tantas como desees).
  • Para autenticarse en un servidor SSH, la llave privada debe estar presente en tu computadora y la llave pública debe estar presente en el archivo authorized_keys del servidor SSH de destino.

Llaves Residentes:

  • La llave privada se almacena directamente en la memoria interna de YubiKey. No se almacenan en la computadora.
  • Estas llave consumen uno de los espacios de credenciales de tu YubiKey (YubiKey 5 contiene hasta 100). Entonces, si creas llave residentes para conectarte a docenas de servidores, puedes agotar los espacios.
  • Para autenticarse en un servidor SSH, puedes simplemente conectar tu YubiKey a cualquier computadora (incluso nueva) y el agente SSH puede “descubrir” la llave en el dispositivo y usarla para autenticarse en el servidor SSH de destino con la llave pública correspondiente en su archivo authorized_keys.


Configuración

Requisitos

  • OpenSSH 8.2 o más reciente para soporte FIDO2.
  • El paquete yubikey-manager, que proporciona la herramienta CLI ykman para gestionar la aplicación FIDO2 de YubiKey y más.
# Instalar SSH
sudo dnf install openssh-clients

# Verificar versión de OpenSSH
ssh -V

# Instalar el paquete "yubikey-manager" si no está instalado
sudo dnf install yubikey-manager

Configurar PIN FIDO2 en YubiKey

Antes de generar llave o usar verificación de PIN, debes establecer un PIN FIDO2 en tu YubiKey.

# Cambiar o establecer tu PIN FIDO2
ykman fido access change-pin

# Verificar que tu PIN funcione
ykman fido access verify-pin

Importante: Este PIN es separado de los PINs de PIV y OpenPGP. Cada aplicación YubiKey tiene su propio PIN.


Generar Llaves SSH

Llave No Residente (Recomendada)

Las llaves no residentes no consumen espacios de credenciales en YubiKey, y si la YubiKey se pierde o roba, un atacante no puede obtener la llave privada SSH de la YubiKey por sí solo.

Opciones de Generación de Llaves:

  • -t <type>: Tipo de algoritmo de llave a utilizar.
    • ed25519-sk: Utilizar el algoritmo Ed25519 (recomendado).
    • ecdsa-sk: Alternativa si Ed25519 no es compatible, usualmente para servidores antiguos.
  • -O verify-required: Requiere tanto PIN como toque en YubiKey para cada uso, de lo contrario solo se necesita el toque.
  • -C "comment": Agregar un comentario para identificar la llave. Esto puede ser cualquier cadena, pero la recomendación es especificar algo para identificar quién creó la llave y dónde se generó.
# Generar llave no residente con verificación de PIN
ssh-keygen -t ed25519-sk -O verify-required -C "user@hostname"

# Se te pedirá que:
# 1. Toques tu placa metálica de YubiKey
# 3. Elijas una contraseña para el archivo de clave (opcional pero recomendado)

Llave Residente (Portátil)

Las llaves residente se almacenan en la YubiKey en sí, lo que permite portabilidad entre máquinas. Requieren un PIN para generar y usar.

Opciones de Generación de Llaves:

  • -t <type>: Tipo de algoritmo de clave a utilizar.
    • ed25519-sk: Utilizar el algoritmo Ed25519 (recomendado).
    • ecdsa-sk: Alternativa si Ed25519 no es compatible, usualmente para servidores antiguos.
  • -O <option>
    • -O resident: Crea una llave residente almacenada en YubiKey.
    • -O application=ssh:hostname: Etiqueta opcional para múltiples credenciales SSH. Principalmente se utiliza para diferenciar entre todas las llaves almacenadas en YubiKey.
    • -O verify-required: Requiere tanto PIN como toque en YubiKey para cada uso, de lo contrario solo se necesita el toque.
  • -C "comment": Agregar un comentario para identificar la llave. Esto puede ser cualquier cadena, pero la recomendación es especificar algo para identificar quién creó la llave y dónde se generó.
# Generar llave residente con verificación de PIN
ssh-keygen -t ed25519-sk -O resident -O verify-required -O application=ssh:hostname -C "user@hostname"

# Se te pedirá que:
# 1. Ingreses tu PIN FIDO2 (si se usa verify-required)
# 2. Toques tu placa metálica de YubiKey
# 3. Elijas una contraseña para el archivo de clave (opcional pero recomendado)

Agregar Llave Pública a Servidores SSH

Este paso es idéntico para AMBOS tipos de llave.

Después de generar una llave (cualquier tipo), obtienes un archivo de llave pública .pub (por ejemplo, id_ed25519_sk.pub), que debe agregarse al archivo ~/.ssh/authorized_keys del servidor SSH de destino al que deseas conectarte.

# Copiar llave pública generada al servidor remoto
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@remote-server

# O agregar manualmente a authorized_keys
cat ~/.ssh/id_ed25519_sk.pub | ssh user@remote-server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Agregar Llaves al Agente SSH

Una vez que la llave pública se agrega al servidor SSH de destino al que deseas conectarte, sigue estos pasos:

  • Llaves No Residentes: Necesitas el archivo de clave privada en tu computadora para autenticarte. Agregar la clave al agente SSH es opcional.
  • Llaves Residentes (Se Requiere Agente): Necesitas configurar el Agente SSH para obtener la llave directamente de la memoria de YubiKey para autenticarte. Agregar la llave al agente es un requisito para llaves residentes. Esto se puede hacer en cualquier nueva máquina desde la que desees conectarte. Solo necesitas que la llave pública esté en el servidor SSH de destino.
# Iniciar ssh-agent (si no está ejecutándose)
eval "$(ssh-agent -s)"

# No Residente: Agregar archivo de llave privada al agente SSH
ssh-add ~/.ssh/id_ed25519_sk

# Residente (en cualquier nueva máquina): Descubrir y cargar la llave desde YubiKey
ssh-add -k

# Listar llaves cargadas
ssh-add -l

Usar SSH con YubiKey

Una vez que tu llave pública se agrega al archivo authorized_keys del servidor SSH de destino, (y se carga al agente SSH para llaves residente), la conexión es simple.

# SSH detectará automáticamente y usará YubiKey para autenticación
ssh user@remote-server

# Especificar explícitamente la llave generada por Yubikey
ssh -i ~/.ssh/id_ed25519_sk user@remote-server

# Se te pedirá que:
# 1. Ingreses tu PIN FIDO2 (si verify-required fue configurado)
# 2. Toques tu YubiKey

Nota Importante para Usuarios de GNOME

Por defecto, el entorno de escritorio GNOME Linux utiliza su propio agente SSH (SSH_AUTH_SOCK=/run/user/1000/gcr/ssh), que no funciona bien con llaves de hardware FIDO2. Esto generalmente resulta en un error de autenticación: sign_and_send_pubkey: signing failed for ED25519-SK "/home/user/.ssh/id_ed25519_sk" from agent: agent refused operation.

Para solucionar esto, simplemente agrega la opción -o "IdentityAgent=none" al conectarte a la máquina de destino. Esto omite el agente GNOME predeterminado para autenticarse correctamente.

# Conectar en un entorno GNOME Linux
ssh -o "IdentityAgent=none" -i ~/.ssh/id_ed25519_sk user@remote-server

# Se te pedirá que:
# 1. Ingreses tu PIN FIDO2 (si verify-required fue configurado)
# 2. Toques tu YubiKey

Puede que parezca un comando muy largo solo para conectarse a un servidor SSH, pero puedes especificar estas opciones de conexión en el archivo de configuración de tu cliente SSH ~/.ssh/config para evitar escribir tanto para cada conexión.

Y eso es todo, ¡super simple y ahora eres más seguro!


Eliminar Llaves Residente de YubiKey

Los comandos generales de gestión de YubiKey están en la Parte 1, para completar este artículo, los agregué a continuación.

Listar Llaves Residente

# Listar llaves residente en YubiKey
ykman fido credentials list

# Ejemplo de salida
Credential ID  RP ID  Username  Display name
5f85afc4...    ssh:   openssh   openssh    

Eliminar Llaves Residente

# Eliminar una llaves residente de YubiKey especificando su ID de credencial
# Eliminar llave residente con ID de credencial "5f85afc4"
ykman fido credentials delete 5f85afc4


¿Qué Sigue?

El próximo artículo será sobre la configuración de YubiKeys para GPG/PGP/PPP/GGG…