Dans l’épisode précédent, je décrivais comment j’avais créé mes clefs et sous-clefs et la façon dont j’avais exporté les sous-clefs sur une YubiKey. Place à une mise en application du côté de la connexion SSH entre un poste client et un serveur. J’utilise déjà le processus d’authentification par clef SSH pour me connecter sur mes machines serveurs, distantes géographiquement ou pas, virtuelles ou non. Le principe est donc d’utiliser la clef d’authentification pour se connecter en SSH aux machines.
On gagne en praticité, car une seule clef va nous permettre de nous connecter à chacune de nos machines une fois celles-ci configurées. Cela passe néanmoins par une configuration de la machine cliente pour utiliser gpg-agent en lieu et place de ssh-agent, chose qui n’est pas forcément aisée. Je vais décrire la configuration que j’ai mise en place, résultat de plusieurs échecs successifs avant d’arriver à quelque chose de fonctionnel et en sachant que j’utilise Xorg et I3 pour la partie affichage et interface.
Configuration côté serveur
La première étape consiste à récupérer les informations de la clef nécessaires à la configuration du serveur. Après avoir inséré notre YubiKey, nous exécutons donc la commande suivante :
$ ssh-add -L
ssh-rsa BFFEB3NzaC ... pdqsdfwX6m1 cardno:000123456789
Nous pouvons alors copier les informations renvoyées par cette commande et les insérer dans le fichier authorized_keys de notre serveur.
Configuration côté client
Le but est maintenant de remplacer ssh-agent par gpg-agent. Nous commençons donc par configurer ce dernier en éditant le fichier .gnupg/gpg-agent.conf :
enable-ssh-support
pinentry-program /usr/bin/pinentry-curses
max-cache-ttl 300
default-cache-ttl 300
Dans le fichier .pam_environment, nous ajoutons les lignes suivantes :
SSH_AGENT_PID DEFAULT=
SSH_AUTH_SOCK DEFAULT="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh"
Et enfin dans .zshrc :
export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >> /dev/null
Il me semble que cette configuration est suffisante pour obtenir quelque chose de fonctionnel. Sur mon poste, j’ai quelques déclarations supplémentaires du côté des fichiers .profile, .zprofile qui font doublon pour la déclaration de la variable GPG_TTY. Il devrait être possible de les supprimer sans risques.
Test unique
Pour réaliser un test unique, après configuration de gpg-agent et avant d’effectuer toutes les modifications ci-dessus et de tester la persistance au redémarrage, j’ai utilisé les commandes ci-dessous pour tester la connexion au serveur avec la clef d’authentification et vérifier cette première étape.
sudo killall gpg-agent
sudo killall ssh-agenteval $( gpg-agent --daemon --enable-ssh-support )
Nous pouvons alors essayer la connexion SSH vers notre serveur et retrouver la configuration utilisant ssh-agent après un simple redémarrage. L’utilisation de l’option -vvv étant particulièrement utile pour suivre les étapes de connexion et détecter d’éventuels problèmes.
ssh user@server -vvv
Conclusion
Avec cette configuration, je suis donc en mesure de me connecter à mes serveurs via SSH en utilisant ma clef d’authentification stockée sur ma YubiKey et le PIN associé à la clef. S’il est plutôt aisé de réaliser une première connexion réussie, la principale difficulté concerne la persistance de la configuration et le lancement correcte des composants à l’ouverture de la session; en particulier pour l’affichage de l’interface de saisi du PIN via pinentry-curses.
Sources
Using GnuPG (2.1) for SSH authentication
YubiKey for SSH, Login, 2FA, GPG and Git Signing