Hace 2 años que para ssh solo uso Yubikey con Fido2

Creo que he pasado por todas las fases de autenticación por ssh: Primero contraseña en texto plano, después llave ssh en keepass con keagent, más tarde con yubikey gpg (que pereza), y finalmente he dado con una bastante segura, simple y práctica: Yubikey + fido2.

portada2

Todo programador o sys admin debería tener un par de yubikey de las baratas (30€). No solo te olvidas de recordar contraseñas gracias a las passkey, sino que las conexiones spor ssh (tanto a servidores como a github) son simples rápidas y sobre todo seguras.

Mi colección actual consta de 1 yubikey de las que tinen gpg, una onlykey (un capricho) y 2 yubikey de las baratas.

Paranoia con sentido

Pensaba (iluso de mi) que mis llaves ssh estaban seguras con keepass, el cual las servía automáticamente al agente ssh cuando conectaba con un servidor. Ya no era un novato que guardaba mis contraseñas en texto plano.

Hasta que un día, leí una entrevista a un tipo al que habían robado bastantes bitcoins. Al parecer guardaba la llave en keepass y la consideraba segura. Ahí fue cuando me emparanioe.

Evidentemente una base de datos de keepass es inviolable si no sabes la contraseña. Pero claro, la contraseña hay que escribirla. Si tu máquina está intervenida por un keylogger, pueden robar tu base de datos y tu contraseña en menos que canta un gallo. Es una falsa sensación de seguridad brutal.

Fue ahí cuando me di cuenta de que la comunidad de bitcoin había identificado el problema y lo había resuelto con unos dispositovos que llamaban billeteras frías o cold wallet. Para ellos, keepass era una billetera caliente o hotwallet (siempre que se usara en un ordenador que se conecta regularmente a internet). La billetera fría estaba protegida por un chip llamado secure element, el cual impedía el acceso a las llaves a cualquier curioso. Con la billetera fría, todo cálculo criptográfico ocurre en un “ordenador a parte” o air gap, de tal forma que tu ordenador puede estar lleno de virus y conectado a internet, que no van a poder robar tu llave privada.

Seguí investigando y descubrí que para llaves ssh existía algo similar a las cold wallet de bitcoin: Yubikey.

Yubikey gpg o Fido2

Para no extenderme diré que cree una llave gpg, la metí en mi yubikey y finalmente pude conectar con mi servidor remoto por ssh. El problema es que el agente gpg debe interactuar con el agente ssh, y estos dos agentes se llevan fatal. Harto de gpg, busqué y descubrí que había una librería que usaba el módulo piv de yubikey para usar un agente mucho más fiable. De hecho el tipo que la había programado lo había hecho cansado de gpg agent. Pero nunca lo llegué a probar porque descubrí Fido2.

Fido2 era una tecnología bastante reciente y por eso casi no había tutoriales. Lo cierto es que pude generar llaves ssh en cuestión de segundos y simplemente todo funcionaba perféctamente. De hecho, el proceso de crear y usar llaves ssh fido2 es similar al de crear las llaves en texto plano, salvo por el comando que genera la llave, que cambia un poco.

El único inconveniente es que no puedo tener una copia de la llave privada, así que es obligatorio tener como mínimo una pareja de yubikeys por si perdes una de ellas.

Conlusión

Desde que lo descubrí, uso llaves fido2 para cualquier conexión ssh. Todos los que trabajan conmigo usan yubikeys con fido2. Ya nadie de mi entorno usa llaves en texto plano ni en keepass.

Ahora duermo tranquilo. Si alguien se cuela en mis servidores, desde luego que no será autenticándose por ssh.