I. Introduction

Cela fait plusieurs années que j’utilise une yubikey pour m’authentifier sur mes PC personnels sous GNU/Linux avec la méthode “Challenge-Response” propre à yubico reposant sur HMAC-SHA1.

Sur ma machine actuelle tournant sur Kali Linux, j’ai décidé de mettre en place une authentification “passwordless” utilisant la norme ouverte FIDO U2F. J’ai recherché si une implémentation de FIDO 2 existait pour PAM. À priori, c’est dans les cartons, mais cela reste encore un projet en cours de développement.

II. U2F et PAM

Comment fonctionne, dans les grands principes, l’authentification U2F avec la yubikey sur le système GNU/Linux ?

  1. Grâce à la commande pamu2fcfg, une paire de clés publique/privée est générée. La clé publique (associée à un utilisateur précis) sera publiée dans un fichier de configuration présent dans le répertoire personnel de l’utilisateur (/home/bilbo/.config/Yubico/u2f_keys) sur le système GNU/Linux. La clé privée (associée au même utilisateur) sera conservée sur la clé de sécurité physique USB.

  2. Le système d’exploitation envoie un challenge concernant l’utilisateur qui souhaite s’authentifier à la clé de sécurité matérielle via USB.

  3. La clé de sécurité signe ce challenge à l’aide de la clé privée qu’elle possède.

  4. Le système d’exploitation va alors vérifier le challenge signé à l’aide de la clé publique qui a été associée précédemment à l’utilisateur concerné (l’OS assurera également d’autres contrôles permettant d’éviter les attaques MITM ou par rejeu).

  5. L’utilisateur concerné peut ensuite finaliser l’authentification U2F en appuyant sur la touche prévue à cet effet sur la clé de sécurité physique.

II. Mise en oeuvre

Installer les paquets permettant à PAM de prendre en compte l’authentification U2F mais également l’outil de configuration lié à cette norme.

bilbo@comte:~$ sudo apt-get install pamu2fcfg libpam-u2f

Insérer la yubikey et vérifier si celle-ci est bien compatible U2F (il n’y a normalement aucun problème).

bilbo@comte:~$ lsusb | grep U2F                      
Bus 003 Device 008: ID 2130:9147 Yubico.com Yubikey 4/5 OTP+U2F+CCID

Générer un fichier de configuration pour l’utilisateur concerné par l’authentification “passwordless”

bilbo@comte:~$ pamu2fcfg >> ~/.config/Yubico/u2f_keys

Modifier le fichier de configuration PAM lié au gestionnaire de sessions de la distribution GNU/Linux utilisée (ici lightdm). La ligne importante à ajouter est : auth sufficient pam_u2f.so. Elle se place en amont de la ligne concernant l’authentification par mot de passe.

L’utilisation de la méthode sufficient permet de dire que ce type d’authentification (ici U2F) n’est pas obligatoire et qu’en cas d’absence ou d’échec lié à U2F, il sera tout de même possible d’utiliser un mot de passe traditionnel.

bilbo@comte:~$ sudoedit /etc/pam.d/lightdm
#%PAM-1.0

auth      requisite pam_nologin.so

session      required pam_env.so readenv=1
session      required pam_env.so readenv=1 envfile=/etc/default/locale

auth sufficient pam_u2f.so
.....

Il suffit ensuite de fermer la session et de se réauthentifier. Entrer l’identifiant, insérer la yubikey, appuyer sur le touche “y” et enjoy. :D

III. Conclusion

L’authentification U2F avec une yubikey et PAM est relativement triviale à mettre en place. Si vous souhaitez l’étendre à l’usage de sudo par exemple, il faudra ajouter la même ligne spécifique dans le fichier de configuration PAM correspondant (/etc/pam.d/sudo).

En termes de robustesse, Challenge-Response et U2F se valent mais FIDO U2F a l’avantage d’être une norme ouverte et un standard compatible avec n’importe quel type de clé de sécurité matérielle quand l’authentification “Challenge-Response” reste spécifique à la yubikey.

FIDO 2 étant le remplaçant de U2F, j’attends avec impatience l’intégration de cette norme au niveau du service d’authentification PAM de façon stable.

IV. Sources

https://wiki.debian.org/Security/U2F

https://wiki.gentoo.org/wiki/PAM/U2F

https://github.com/WiSECURE/pam-fido2