Dans cet article nous allons voir comment configurer notre serveur distant pour pouvoir se connecter et s’authentifier avec une clé Yubikey sur un serveur Alma Linux. J’essaierai d’ajouter prochainement les commandes équivalentes pour Debian.
Pour ce qui est de la configuration des clés GPG et de leur stockage sur votre Yubikey, je vous renvoie vers la documentation officielle du constructeur ; elle est suffisemment éloquente pour vous permettre de réaliser cela en toute simplicité. Vous pouvez vous arrêter juste avant la partie sur la configuration de GitHub : nous avons juste besoin de la clé SSH publique pour configurer notre serveur.
https://developers.yubico.com/PGP/SSH_authentication/index.html
Nous utiliserons le plugin pour pam intitulé libpam_rssh.so, disponible sur github : https://github.com/z4yx/pam_rssh
Enfin, avant de commencer, sachez que l’utilisation de cette option est à vos risques et périls ! Ne supprimez pas les autres méthodes d’authentification, et durcissez votre politique de sécurité sur votre serveur.
Préparation
Installez les prérequis pour compiler le plugin pam « libpam_rssh.so » :
sudo dnf install pam-devel openssl-devel cargoCréez le répertoire pour stocker les clés publiques autorisées à se connecter et à utiliser sudo (indispensable pour des raisons de sécurit : le fichier authorized_keys utilisé habituellement dans ~/.ssh ne doit pas l’être dans le cas de l’utilisation de libpam_rssh !)
sudo mkdir /etc/authorized_keysCompilation du plugin
Dans votre répertoire de travail :
git clone --recurse-submodule https://github.com/z4yx/pam_rssh.git
cd pam_rssh/
cargo build --releaseUne fois la compilation terminée, déplacez le plugin dans le bon répertoire :
cp target/release/libpam_rssh.so /lib64/security/Configuration
Editez le fichier /etc/pam.d/sudo :
sudo vim /etc/pam.d/sudoRajoutez la ligne suivante au-dessus de toutes les autres :
auth sufficient libpam_rssh.so auth_key_file=/etc/authorized_keys/${user}.keys cueOptions utilisées :
- auth_key_file : chemin vers le fichier contenant la clé publique permettant de se connecter. Pour rappel, cela permet de ne pas utiliser le fichier standard dans ~/.ssh/authorized_key pour éviter les failles de sécurité.
- cue : rappelle à l’utilisateur de toucher la yubikey pour autoriser l’action. Vous pouvez supprimer cette option si vous n’avez pas activé l’option obligeant l’action de l’utilisateur pour lire les clés gpg !!
Votre fichier devrait ressembler à ça :

Editez le fichier sudoers :
sudo visudoAprès la litanie des Defaults env_keep += "quelquechose", ajoutez la ligne suivante :
Defaults env_keep += "SSH_AUTH_SOCK"Ce qui donne, dans mon cas :

Enfin, ajoutez la clé SSH publique que vous avez exporté au tout début (avec gpg --export-ssh-key <authentication-key-id> > ssh_auth_key.pub, cf. la documentation de Yubico) dans le fichier /etc/authorized_keys/<votre_username>.keys. Ajoutez la également dans ~/.ssh/authorized_keys pour permettre la connexion SSH standard. Pour récapituler :
- La clé publique enregistrée dans
~/.ssh/authorized_keysvous permet de vous connecter à votre compte via ssh sans entrez de mot de passe (en somme, rien de nouveau ici sauf le fait qu’il est nécessaire d’avoir sa yubikey pour pouvoir se connecter) - La clé publique enregistrée dans
/etc/authorized_keys/<votre_username>.keyspermet l’utilisation de sudo avec votre clé Yubikey (si tant est que vous vous êtes connecté avec ssh -A)
Utilisation
L’utilisation est très simple. Connectez vous au serveur avec l’option -A de ssh :
ssh -A <votre-username>@10.0.0.20Entrez votre code pin et touchez votre clé, et voilà ! Testez un sudo dnf check-upgrade : touchez votre clé, et observez la magie opérer.
Sécurisation supplémentaire
Vous pouvez utiliser d’autres modules de pam pour durcir la sécurité. Par exemple blocage du compte après x tentatives erronées, enregistrement des saisies utilisateur, logging avancé, etc.
Cela fera peut être l’objet d’une prochaine mise à jour de cet article.