Ce second article vient compléter l'utilisation des clés pour se connecter sans authentification par mot de passe. Une première partie s'intéresse au type de chiffrement à utiliser, le second sur l'usage des passhprases et de l'agent ssh
Quel type de clé ?
L'utilitaire pour génerer les clés ssh-keygen permet de spécifier le type d'algorithme à utiliser. Oubliez les clés de type DSA et RSA en 2020, elles sont deprecated! ED25519 et EcDSA sont les recommandés.
Il suffit donc de préciser le type lors de la génération. Dans l'exemple suivant, je vais également renseigner une passphrase.
e.blindauer@juliette ~$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/e.blindauer/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/e.blindauer/.ssh/id_ed25519.
Your public key has been saved in /home/e.blindauer/.ssh/id_ed25519.pub.
The key fingerprint is: SHA256:N3UhUzmg1zCLfS1vgZrwT9qHBWuanoj/lKPgPKmZ8oE e.blindauer@juliette
The key's randomart image is:
+--[ED25519 256]--+
| ooo |
| . o . |
| E . + . o |
|o = + . . o |
|+ . * S + . |
| + + o B B o . |
| B o +o* o o = |
| o . +=. . * . |
| .+ooo . o. |
+----[SHA256]-----+
Je saute l'étape de placer la clé publique sur le serveur avec la commande ssh-copy-id.
Ensuite, lors de l'utilisation de la clé, on peut vérifier que la clé demande de renseigner la passphrase:
e.blindauer@juliette ~$ ssh -i .ssh/id_ed25519 alice.net.mooby.net
Enter passphrase for key '.ssh/id_ed25519':
Linux alice 4.19.0-8-amd64 #1 SMP Debian 4.19.98-1 (2020-01-26) x86_64
e.blindauer@alice ~$
La passphrase? oui, une seule fois.
Il est très fortement recommandé de mettre une passphrase. Elle sera demandé pour pouvoir utiliser la clef. Ce n'est pas incompatible avec le fait de pouvoir s'authentifier sans interaction. On va justement voir ici, qu'il existe des outils pour gérer cette passphrase et ne pas avoir à la fournir à chaque fois. Celui fourni par défaut est ssh-agent. Sur toute bonne distribution il est lancé avec la session de l'utilisateur, et une variable d'environnement est présente pour interagir avec.
Vérification que le processus ssh-agent tourne (debian 10):
e.blindauer@juliette ~$ pgrep ssh-agent
10518
Vérification de la variable d'environnement:
e.blindauer@juliette ~$ env |grep ssh
SSH_AUTH_SOCK=/tmp/ssh-Y2H0qUKiP2V5/agent.10483
Le role de ssh-agent est de demander gérer les clés et leurs passphrase. Une clé ajoutée à ce service est directement utilisable sans avoir à redemander la passphrase. On peut ajouter toutes les clés en une fois:
e.blindauer@juliette ~$ ssh-add
Enter passphrase for /home/e.blindauer/.ssh/id_ed25519:
Identity added: /home/e.blindauer/.ssh/id_ed25519 (e.blindauer@juliette)
Pour lister les clés disponibles dans l'agent:
e.blindauer@juliette ~$ ssh-add -l
2048 SHA256:ZO1oKDPws8lLLF/IZ4n/djscm7qEc7hrk3i/OEkFvRE /home/e.blindauer/.ssh/id_rsa (RSA)
1024 SHA256:s1b/ruMleFj/Rorm3P16eAKyOOhPXbii2lGeZhBgmD8 /home/e.blindauer/.ssh/id_dsa (DSA)
256 SHA256:N3UhUzmg1zCLfS1vgZrwT9qHBWuanoj/lKPgPKmZ8oE e.blindauer@juliette (ED25519)
On peut vérifier alors qu'on peut se connecter directement, sans avoir a rentrer la passphrase:
e.blindauer@juliette ~$ ssh -i ~/.ssh/id_ed25519 alice.net.mooby.net
Linux alice 4.19.0-8-amd64 #1 SMP Debian 4.19.98-1 (2020-01-26) x86_64
e.blindauer@alice ~$
Derrière ssh-agent
ssh-agent peut etre utilisé à la volé, par exemple pour gérer des clés de déploiement. son usage est assez vfacile: quand il se lancé, il sort sur sa sortie standard des elements pour retrouver sa trace pour les futures interactions: la variable d'environnement SSH_AUTH_SOCK
, son lancement dans un script ne se fait donc pas juste par un "ssh-agent", mais par eval $(ssh-agent): les commande suivantes auront acces à cette variable d'environnement pour ce daemon dédié. Et ne pas oublier le ssh-agent -k qui permettra de le faire quitter fin de script.
Les alternatives à ssh-agent
Il existe des alternatives à ssh-agent. En particulier, sous gnome, gnome-keyring-daemon peut jouer ce travail. Il faut qu'il soit demarré avec le support pour cela, cf. la mage man:
-c, --components=ssh,secrets,pkcs11
Ask the daemon to only initialize certain components. Valid components are ssh, secrets, pkcs11.
By default all components are initialized.
Sous KDE, kwallet fait également le travail.
il existe d'autres implementation du keychain possible comme "keychain"