Lo que necesitas
- OpenSSH 8.2 o posterior en ambos lados. Esa versión añadió los tipos de clave
ed25519-skyecdsa-sk. Comprueba el cliente y el servidor conssh -V.verify-requirednecesita la 8.4. - Una clave que admita Ed25519. Es opcional en el estándar FIDO. Yubico dice que las YubiKey necesitan firmware 5.2.3 o más reciente. En las más antiguas, usa
-t ecdsa-sk. - Una compilación de OpenSSH con soporte FIDO. Mira la sección siguiente si usas un Mac.
Para ver si un servidor aceptará estas claves, ejecuta esto en el servidor y busca sk-ssh-ed25519@openssh.com:
sudo sshd -T | grep -i pubkeyacceptedalgorithms
En macOS, el ssh integrado no basta
El ssh-keygen que viene con macOS nos dio esto:
No FIDO SecurityKeyProvider specified
Key enrollment failed: invalid format
La compilación de OpenSSH de Homebrew depende de libfido2, que aporta este soporte. Instálala y comprueba que tu shell encuentra primero esa versión:
brew install openssh
which ssh-keygen
Crear la clave
ssh-keygen -t ed25519-sk -O verify-required -C "you@laptop"
Toca la clave cuando parpadee e introduce su PIN si te lo piden. Obtienes dos archivos:
~/.ssh/id_ed25519_sk: el handle. Parece una clave privada, pero solo contiene una referencia. Es inútil sin la clave de hardware.~/.ssh/id_ed25519_sk.pub: la clave pública.
Si no hay ninguna clave conectada, o el sistema no la ve, obtienes:
Key enrollment failed: device not found
Instalarla y entrar
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@server
ssh -i ~/.ssh/id_ed25519_sk user@server
La línea en authorized_keys funciona como cualquier otra, pero su tipo es sk-ssh-ed25519@openssh.com.
Las opciones que importan
| Opción | Qué hace |
|---|---|
-O verify-required | Cada firma necesita verificación del usuario, normalmente el PIN, además de un toque. Un token robado por sí solo ya no basta. |
-O resident | Guarda el handle en el token, para que puedas usarlo desde otro ordenador sin copiar un archivo. |
-O application=ssh:work | Pone un nombre a la clave. Debe empezar por ssh:. Útil para tener varias claves residentes en un token. |
-O no-touch-required | Firmar sin un toque. El servidor también debe permitirlo, así que déjalo desactivado salvo que tengas un motivo. |
Residente o no
| No residente (por defecto) | Residente | |
|---|---|---|
| Dónde está el handle | En un archivo de tu ordenador | En el token |
| Uso en un ordenador nuevo | Copiar el archivo handle | Descargarlo del token |
| Un ladrón necesita | El token y el archivo | El token, y el PIN si lo pusiste |
Una clave residente es cómoda, pero cualquiera que tenga el token puede recuperar el handle, así que combínala con un PIN:
ssh-keygen -t ed25519-sk -O resident -O verify-required -C "you@laptop"
En otro ordenador, obtén los archivos o carga la clave directamente en el agente:
ssh-keygen -K
ssh-add -K
ssh-keygen -K escribe los archivos en el directorio actual.
Exigir un PIN desde el servidor
Una clave creada sin verify-required puede quedar sujeta a esa exigencia desde el servidor. Añade la opción al principio de su línea en authorized_keys:
verify-required sk-ssh-ed25519@openssh.com AAAA... you@laptop
Prevé la pérdida del token
Si el token se pierde, la clave se pierde. Registra dos tokens, instala las dos claves públicas en cada servidor y guarda el segundo en un lugar seguro. Ten también otra vía de entrada, como una consola de tu proveedor de hosting, antes de desactivar otros accesos.
Guarda los archivos handle, y una nota de qué servidores abre cada token, en un mismo sitio, como un gestor de claves SSH con vault cifrado.
Preguntas
¿Se puede copiar la clave privada fuera de la YubiKey?
No. Según las notas de versión de OpenSSH, la parte privada de la clave es única para cada token y no se puede exportar. Por eso también conviene registrar un segundo token como copia de seguridad.
¿Sigo necesitando una frase de contraseña?
Es opcional. El archivo handle no basta sin el token, y un PIN con verify-required cubre el caso de un token robado. Una frase de contraseña en el archivo handle añade un paso más si la quieres.
¿Puedo usar la misma YubiKey en varios ordenadores?
Sí. Con una clave residente, ejecuta ssh-keygen -K en el nuevo ordenador para recuperar los archivos del token. Con una clave no residente, copia el archivo handle id_ed25519_sk al nuevo ordenador. En ambos casos, cada acceso sigue necesitando el token.
Fuentes
- ssh-keygen(1), sección del autenticador FIDO
- sshd(8), opciones de authorized_keys
- Notas de versión de OpenSSH
- Securing SSH with FIDO2, Yubico
- Fórmula openssh de Homebrew