Ce qu'il vous faut
- OpenSSH 8.2 ou plus des deux côtés. Cette version a ajouté les types de clé
ed25519-sketecdsa-sk. Vérifiez le client et le serveur avecssh -V.verify-requireddemande la 8.4. - Une clé qui prend en charge Ed25519. C'est facultatif dans la norme FIDO. Yubico indique que les YubiKey demandent un firmware 5.2.3 ou plus récent. Sur les plus anciennes, utilisez
-t ecdsa-sk. - Une version d'OpenSSH compilée avec la prise en charge de FIDO. Voir la section suivante si vous utilisez un Mac.
Pour savoir si un serveur acceptera ces clés, exécutez ceci sur le serveur et cherchez sk-ssh-ed25519@openssh.com :
sudo sshd -T | grep -i pubkeyacceptedalgorithms
Sur macOS, le ssh intégré ne suffit pas
Le ssh-keygen fourni avec macOS nous a donné ceci :
No FIDO SecurityKeyProvider specified
Key enrollment failed: invalid format
La version d'OpenSSH de Homebrew dépend de libfido2, qui fournit cette prise en charge. Installez-la et vérifiez que votre shell trouve cette version en premier :
brew install openssh
which ssh-keygen
Créer la clé
ssh-keygen -t ed25519-sk -O verify-required -C "you@laptop"
Touchez la clé quand elle clignote, et saisissez son PIN si on vous le demande. Vous obtenez deux fichiers :
~/.ssh/id_ed25519_sk: le handle. Il ressemble à une clé privée mais ne contient qu'une référence. Il est inutile sans la clé matérielle.~/.ssh/id_ed25519_sk.pub: la clé publique.
Si aucune clé n'est branchée, ou si le système ne la voit pas, vous obtenez :
Key enrollment failed: device not found
L'installer et se connecter
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@server
ssh -i ~/.ssh/id_ed25519_sk user@server
La ligne dans authorized_keys fonctionne comme n'importe quelle autre, mais son type est sk-ssh-ed25519@openssh.com.
Les options qui comptent
| Option | Ce qu'elle fait |
|---|---|
-O verify-required | Chaque signature exige une vérification de l'utilisateur, en général le PIN, en plus d'un toucher. Un jeton volé ne suffit alors pas. |
-O resident | Stocke le handle sur le jeton, pour pouvoir l'utiliser depuis un autre ordinateur sans copier de fichier. |
-O application=ssh:work | Définit un nom pour la clé. Il doit commencer par ssh:. Utile pour garder plusieurs clés résidentes sur un même jeton. |
-O no-touch-required | Signature sans toucher. Le serveur doit aussi l'autoriser : laissez-la désactivée sauf raison précise. |
Résidente ou non
| Non résidente (par défaut) | Résidente | |
|---|---|---|
| Où se trouve le handle | Dans un fichier sur votre ordinateur | Sur le jeton |
| Usage sur un nouvel ordinateur | Copier le fichier handle | Le télécharger depuis le jeton |
| Un voleur a besoin | Du jeton et du fichier | Du jeton, et du PIN si vous en avez défini un |
Une clé résidente est pratique, mais quiconque tient le jeton peut récupérer le handle : associez-la donc à un PIN :
ssh-keygen -t ed25519-sk -O resident -O verify-required -C "you@laptop"
Sur un autre ordinateur, récupérez les fichiers ou chargez la clé directement dans l'agent :
ssh-keygen -K
ssh-add -K
ssh-keygen -K écrit les fichiers dans le dossier courant.
Exiger un PIN côté serveur
Une clé créée sans verify-required peut quand même y être soumise par le serveur. Ajoutez l'option au début de sa ligne dans authorized_keys :
verify-required sk-ssh-ed25519@openssh.com AAAA... you@laptop
Prévoir la perte du jeton
Si le jeton disparaît, la clé disparaît. Enregistrez deux jetons, installez les deux clés publiques sur chaque serveur et gardez le second en lieu sûr. Gardez aussi une autre voie d'accès, comme une console de votre hébergeur, avant de désactiver les autres connexions.
Gardez les fichiers handle, et la liste des serveurs que chaque token ouvre, au même endroit, par exemple dans un gestionnaire de clés SSH avec coffre chiffré.
Questions
La clé privée peut-elle être copiée hors de la YubiKey ?
Non. D'après les notes de version d'OpenSSH, la partie privée de la clé est propre à chaque jeton et ne peut pas être exportée. C'est aussi pourquoi il faut enregistrer un second jeton comme secours.
Ai-je encore besoin d'une phrase secrète ?
Elle est facultative. Le fichier handle ne suffit pas sans le jeton, et un PIN avec verify-required couvre le cas d'un jeton volé. Une phrase secrète sur le fichier handle ajoute une étape si vous la souhaitez.
Puis-je utiliser la même YubiKey sur plusieurs ordinateurs ?
Oui. Avec une clé résidente, lancez ssh-keygen -K sur le nouvel ordinateur pour récupérer les fichiers depuis le jeton. Avec une clé non résidente, copiez le fichier handle id_ed25519_sk sur le nouvel ordinateur. Dans les deux cas, chaque connexion demande toujours le jeton.
Sources
- ssh-keygen(1), section sur les authentificateurs FIDO
- sshd(8), options d'authorized_keys
- Notes de version d'OpenSSH
- Sécuriser SSH avec FIDO2, Yubico
- Formule Homebrew openssh