A la base de código de OpenSSH Soporte experimental para la autenticación de dos factores utilizando dispositivos que admiten el protocolo , desarrollado por la alianza . U2F permite la creación de tokens hardware de bajo coste para verificar la presencia física del usuario, interactuando con él vía USB, Bluetooth o NFC. Estos dispositivos se promocionan como un medio de autenticación de dos factores en sitios web, ya son compatibles con los principales navegadores y son producidos por varios fabricantes, incluidos Yubico, Feitian, Thetis y Kensington.
Para interactuar con dispositivos que confirman la presencia del usuario, se ha añadido a OpenSSH un nuevo tipo de clave, "sk-ecdsa-sha2-nistp256@openssh.com" ("ecdsa-sk"). Esta clave utiliza el algoritmo ECDSA (Algoritmo de Firma Digital de Curva Elíptica) con la curva elíptica NIST P-256 y el hash SHA-256. Los procedimientos para interactuar con tokens se han trasladado a una biblioteca intermedia, que se carga de forma similar a la biblioteca de soporte PKCS#11 y actúa como contenedor de la biblioteca. , que proporciona herramientas para comunicarse con tokens a través de USB (se admiten los protocolos FIDO U2F/CTAP 1 y FIDO 2.0/CTAP 2). Biblioteca intermedia libsk-libfido2 preparada por desarrolladores de OpenSSH en el núcleo libfido2, así como para OpenBSD.
Para habilitar U2F, puede utilizar un nuevo corte del código base de OpenSSH y la rama HEAD de la biblioteca , que ya incluye la capa necesaria para OpenSSH.
Libfido2 admite la ejecución en OpenBSD, Linux, macOS и Windows.
Para autenticar y generar una clave, configure la variable de entorno SSH_SK_PROVIDER para que apunte a libsk-libfido2.so (export SSH_SK_PROVIDER=/path/to/libsk-libfido2.so) o defina la biblioteca mediante la opción SecurityKeyProvider. A continuación, ejecute "ssh-keygen -t ecdsa-sk" o, si las claves ya se han creado y configurado, conéctese al servidor mediante "ssh". Al ejecutar ssh-keygen, el par de claves generado se guardará en "~/.ssh/id_ecdsa_sk" y podrá usarse como cualquier otra clave.
La clave pública (id_ecdsa_sk.pub) debe copiarse al archivo authorized_keys del servidor. El servidor solo verifica la firma digital, mientras que la interacción con los tokens se realiza en el cliente (libsk-libfido2 no necesita estar instalado en el servidor, pero debe ser compatible con el tipo de clave "ecdsa-sk"). La clave privada generada (id_ecdsa_sk) es esencialmente un descriptor de clave que forma la clave real solo al combinarse con la secuencia secreta almacenada en el token U2F.
Si un atacante obtiene la clave id_ecdsa_sk, también necesitará acceder a un token de hardware para autenticarse, sin el cual la clave privada almacenada en el archivo id_ecdsa_sk es inútil. Además, por defecto, cualquier operación de clave (tanto la generación como la autenticación) requiere la confirmación local de la presencia física del usuario, como tocar el sensor del token, lo que dificulta los ataques remotos a sistemas con el token conectado. Como capa adicional de defensa, también se puede establecer una contraseña para acceder al archivo de claves al ejecutar ssh-keygen.
Se puede agregar una clave U2F a ssh-agent a través de "ssh-add ~/.ssh/id_ecdsa_sk", pero ssh-agent debe construirse con soporte para claves "ecdsa-sk", la capa libsk-libfido2 debe estar presente y el agente debe estar ejecutándose en el sistema al que está conectado el token.
Se agrega el nuevo tipo de clave "ecdsa-sk" porque el formato de clave ecdsa de OpenSSH difiere del formato U2F para firmas digitales ECDSA al tener campos adicionales.
Fuente: opennet.ru
