Clé SSH et Yubikey


Les Yubikey sont des clés de sécurité physiques. Une Yubikey peut-être utilisée comme facteur de double authentification (FIDO2 / Webauthn), peut stocker des paramètres OTP (toujours pour de la double authentification). Là, ce qui nous intéresse, c’est que FIDO2 permet de stocker des passkey credentials (aussi appelé resident keys). En gros, il peut stocker une clé privée, y compris une clé SSH.

Avant de commencer, précision sur les Yubikey : tout ce qui arrive dessus, reste uniquement sur la Yubikey (en gros). Ça veut dire que les facteurs de double authentification, comme la clé SSH, sont à doubler par ailleurs parce qu’on ne peut pas en faire de backup. Donc, sur chaque site où elle sert de double authentification, on enregistre aussi la seconde clé. Pour la clé SSH qu’on va générer, on en fait une 2e sur la 2e clé, et on enregistre les deux sur les serveurs.

J’utilise cette documentation de Yubico.

À noter qu’il faut d’abord créer un code PIN pour FIDO2 avec l’application officielle YubiKey Manager (aller dans applications -> FIDO2).

$ ssh-keygen -t ed25519-sk -O resident -O verify-required -O application=ssh:servers_main
Generating public/private ed25519-sk key pair.
You may need to touch your authenticator to authorize key generation.
Enter PIN for authenticator: 
You may need to touch your authenticator again to authorize key generation.
Enter file in which to save the key (/home/user/.ssh/id_ed25519_sk): .ssh/servers_main_sk
Enter passphrase for ".ssh/servers_main_sk" (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in .ssh/servers_main_sk
Your public key has been saved in .ssh/servers_main_sk.pub

Génération d’une clé au format ed25519. L’ajout de -sk indique que la clé est générée en lien avec une clé de sécurité. L’option resident indique que la clé est stockée sur la Yubikey, et verify-required que l’on veut une vérification de l’utilisateur (code PIN + appui sur la clé). L’option application permet de nommer la clé.

Il faut rentrer le code PIN de la clé, et également toucher la clé pour valider la présence de l’usager (et que ce ne soit pas un script en train de forcer la clé). Il est possible de chiffrer la clé avec un mot de passe, mais ça veut dire devoir rentrer le mot de passe en plus du PIN et de toucher la clé, donc je n’en mets pas.

À noter que cela crée 2 fichiers dans .ssh, un fichier de clé privée et un fichier de clé publique. Ils sont à utiliser pour se connecter aux serveurs SSH, mais ils ne sont pas sensibles. Le fichier de clé privée fait juste le lien avec la clé de sécurité.

Pour les regénérer :

$ ssh-keygen -K
Enter PIN for authenticator: 
You may need to touch your authenticator to authorize key download.
Enter passphrase for "id_ed25519_sk_rk_servers_main" (empty for no passphrase): 
Enter same passphrase again: 
Saved ED25519-SK key ssh:servers_main to id_ed25519_sk_rk_servers_main

Je n’ai pas eu besoin de toucher ma clé. Ça permet aussi d’accéder à la clé depuis un autre ordinateur.

Pour me connecter à mon serveur :

ssh user@192.168.1.XX -p XXXX -i .ssh/servers_main_sk

Ensuite, on peut ajouter la clé SSH à ssh-agent pour qu’elle soit utilisée automatiquement.

ssh-add .ssh/servers_main_sk
# Ou directement depuis la clé
ssh-add -K

Cela ne fonctionnera pas automatiquement sans installer un paquet supplémentaire permettant à ssh-add de demander le code PIN :

sudo dnf install openssh-askpass

Si ça ne fonctionne pas (parce que je ne sais pas pourquoi, ça fonctionnait très bien et maintenant non), on peut se connecter en désactivant l’agent SSH (l’option peut se configurer dans le fichier config du client SSH) :

ssh user@adress -o IdentityAgent=none

Je crée mes clés d’administration des serveurs de cette manière. Cependant, mes outils de sauvegarde automatique ne vont probablement pas apprécier. Dans ce cas, je vais créer des utilisateurs normaux (sans droits administrateurs), avec des clés plus classiques. En les chiffrant avec un mot de passe, Gnome devrait normalement m’afficher une invite pour rentrer le mot de passe de déchiffrement.

ssh-keygen -a 500 -t ed25519