Yubikey Yubico : le login facile

Yubikey Yubico : le login facile
Photo by FLY:D / Unsplash

Comme beaucoup, j'aimerais bien me passer de mots de passes ou souvent juste avoir une double authent' sans avoir à démarrer une énième app sur mon smartphone ou lire un SMS avec un code à X chiffres. Une solution que j'ai vu passé par là et qui me trotte dans la tête depuis un moment, c'est d'utiliser une Yubikey, une clé usb physique disposant de plusieurs protocoles d'authentification récent :

  • FIDO2
  • U2F
  • Smart card
  • OTP
  • OpenPGP 3
  • ...

Bref, on se mets bien et c'est donc compatible avec quasi tout le monde :

  • Google
  • Amazon
  • Apple iCloud
  • Windows
  • Azure
  • Keypass
  • Psono
  • What else

Allez, je me prends une Yubikey série 5 NFC en USB-C et on verra bien. Si ça me va, je m'en prend une de spare en USB-A.

Gestion de la clé et découverte

Pour commencer, j'ai installer le gestionnaire Yubikey pour découvrir en graphique la clé et ses possibilités. Je ne suis pas un fin connaisseur des protocoles d'authentification et de ses raffinements. Vous pouvez installer le paquet Yubikey Manager :

# Arch Linux
$ sudo pacman -S yubikey-manager-qt
# Ubuntu/Debian
$ sudo apt install yubikey-manager-qt
# Fedora/RHEL
$ sudo dnf install yubikey-manager-qt
Install Yubikey Manager

Avec cette application, vous pourrez connaître la version du firmware installée et son numéro de série. Ce sera la partie Application qui nous intéressera le plus. La partie OTP permet de configurer le comportement de la clé pour un appui court et un autre long. Typiquement, si vous voulez utiliser la méthode Challenge-Response du module pam_yubico vous pourrez configurer l'une des deux possibilités pour cette possibilité.

La partie PIV. Pour que cette partie soit fonctionnel il faut avoir le service pcscd.service démarré sinon vous risquez d'avoir une erreur d'afficher :

Il suffira de démarrer le service, si toutefois l'erreur persiste c'est sûrement qu'il manque un paramètre pour que le service n'entre pas en conflit avec gpg. Il faudra juste ajouter une configuration supplémentaire dans votre home :

echo disable-ccid >> ~/.gnupg/scdaemon.conf

Plus d'explications avec cet article de Ludovic Rousseau.

Une fois le service démarré vous pourrez alors accéder à la configuration des codes PIN et PUK de la clé. Ceux-ci vous seront utiles pour configurer une clé OpenPGP sur votre clé USB Yubico. Plus de détails et valeurs par défaut des PIN et PUK ici et ici.

Nous reviendrons plus loin sur la gestion de votre clé OpenPGP sur votre Yubikey plus loin.

Linux, PAM

Première besoin, ne plus taper son mot de passe pour se logguer sur ma machine. Il est long, il est chiant. Donc, je dois pouvoir m'identifier avec ma clé sans avoir à taper de mot de passe et quand je la débranche mon laptop idéalement j'aimerais que ma session se verrouille.

Yubico fournit tout un tas de docs pour s'interfacer avec les différents services supportés ainsi que quelques modules PAM (Pluggable Authentication Module) pour Linux dont :

  • pam_yubico : Module permettant la double authent' ou sans mot de passe au choix en validant un token (OTP) Yubico sur le serveur public de Yubico ou le vôtre si vous en tourner un chez vous. Il vous faudra donc un accès internet pour valider votre token à moins d'utiliser la méthode HMAC-SHA1 Challenge-Response, plus de détails dans la doc.
  • pam_u2f : Pareil mais en se basant sur l'Universal Second Factor ou FIDO2, plutôt que sur validation de token.

De mon côté, j'ai choisi le module pam_u2f, ça fonctionne en offline de base sans setup supplémentaire. Pour l'installer :

# Arch Linux
$ sudo pacman -S pam-u2f
# Ubuntu
$ apt install libpam-u2f

Mon but étant de ne plus taper le mot de passe pour me connecter plutôt que le côté multifacteur, il faut ajouter une ligne dans le fichier system-auth dans la partie auth au-dessus de la ligne utilisant pam_unix. Voici un exemple :

#%PAM-1.0

auth       required                    pam_faillock.so      preauth
# Optionally use requisite above if you do not want to prompt for the password
# on locked accounts.
-auth      [success=2 default=ignore]  pam_systemd_home.so
auth       sufficient                    pam_u2f.so         cue
auth       [success=1 default=bad]     pam_unix.so          try_first_pass nullok
#auth       sufficient                  pam_yubico.so        id=85990 try_first_pass nullok debug


auth       [default=die]               pam_faillock.so      authfail
auth       optional                    pam_permit.so
auth       required                    pam_env.so
auth       required                    pam_faillock.so      authsucc
[...]
system-auth

Ici, j'utilise juste l'option cue qui affiche un rappel sur le prompt ou la fenêtre d'authent' pour appuyer sur le bouton tactile de la Yubikey. Il est possible d'ajouter un flag debug si besoin. Au besoin, vous pouvez lire la page de manuel du module pam avec la commande : man pam_u2f.

De même pour pouvoir utiliser cette méthode sur sudo et polkit (Composant qui vous affiche une popup pour augmenter vos privilèges graphiquement). Il suffit d'ajouter cette ligne en début de fichier au-dessus de pam_env.

auth sufficient pam_u2f.so cue
auth required pam_env.so
auth sufficient pam_fprintd.so
auth sufficient pam_unix.so try_first_pass likeauth nullok
auth required pam_deny.so
auth       include      system-auth
account    include      system-auth
password   include      system-auth
session    include      system-auth
sudo et polkit

Dernière chose à configurer avant de pouvoir profiter de l'authentification par la Yubikey, il faut créer un fichier de mapping pour lier la clé avec son compte utilisateur. Ici au choix, soit vous optez pour un fichier à la portée du système entier, soit un fichier par utilisateur. Uniquement l'un des deux fichiers sera lu, si vous utilisez un fichier système alors ceux des utilisateurs ne seront pas utilisés et vice-versa. Les différences ici seront que le fichier sera lu par l'utilisateur en question si vous utilisez un fichier de mapping par utilisateur sinon ce sera l'utilisateur root qui sera utilisé pour celui du système. Si votre partition contenant les répertoire utilisateurs est chiffrée vous voudrez certainement utiliser un fichier système accessible quoiqu'il arrive sans chiffrement. Plus de détails sur la documentation développeur officielle Yubico.

Donc, ceci étant dit ! Personnellement j'ai choisi d'utiliser un fichier par utilisateur, plus simple c'est le comportement par défaut du module, rien à ajouter et ma partition home n'est pas chiffrée.

$ pamu2fcfg -uusername > ~/.config/Yubico/u2f_keys
Ajout de la clé u2f au fichier utilisateur

Lock automatique de la session

Petit ajout rapide, pouvoir lock la session quand la clé est retirée de son port USB. Il suffit pour cela de configurer une petite règle udev et on est bon :

$ lsusb
Bus 004 Device 002: ID 05e3:0616 Genesys Logic, Inc. hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 006: ID 06cb:00f0 Synaptics, Inc. 
Bus 003 Device 025: ID 1050:0407 Yubico.com Yubikey 4/5 OTP+U2F+CCID
Bus 003 Device 018: ID 03f0:046b HP, Inc HP USB-C Dock G5
...
$ cat /etc/udev/rules.d/20-yubikey.rules 
ACTION=="remove", ENV{ID_BUS}=="usb", ENV{ID_MODEL_ID}=="0407", ENV{ID_VENDOR_ID}=="1050", RUN+="/bin/loginctl lock-sessions"
$ sudo udevadm control --reload-rules

Voilà, avec ça vous êtes tranquille pour vous authentifier sur votre Linux. Tant que vous avez la clé de branchée, il vous suffit d'appuyer sur le bouton de celle-ci plutôt que d'entrer votre mot de passe.

Déverrouillage du gestionnaire de mot de passe Psono avec la Yubikey

Deuxième besoin, utiliser mon gestionnaire de mot de passe perso et m'identifier pour l'ouvrir pour pouvoir récupérer mes mots de passes stockés. Ici, on arrive dans du simple et trivial. Il suffit de suivre la doc utilisateur psono.

Pour faire court et sans images :

Account --> Multifactor Authentication --> Yubikey OTP.

Donnez un nom et appuyer sur la clé pour y mettre un token. Et c'est bon

Ajouter sa clé GPG dans la clé

Troisième besoin, stocker ma clé OpenPGP me permettant de signer des trucs divers et variés. Bon là, c'est plus que Yubico le permet que je le fais et que c'est une bonne occaz d'utiliser ma clé OpenGPG. Cela peut servir pour chiffrer et/ou signer vos mails ou des fichiers, ou à peu près n'importe quoi en faite. L'avantage des smartcard c'est que la clé privée n'est jamais exposée et stockée dans la clé. Il faut absolument avoir la clé insérée dans un port USB pour pouvoir déchiffrer quelque chose qui aura été signé avec la clé public OpenPGP.

C'est un peu moins trivial, j'ai suivi la documentation Yubico et cet article aussi qui sont très bien faits. Je n'aurais pas grand chose à ajouter alors je vous encourage à aller la lire pour configurer votre clé. La seule chose qui peut être un peu étrange est la gestion du code PIN qui vous est demander à ce moment-là. Si vous n'avez pas été configurer ceux-ci depuis l'application Yubico Manager alors je vous enjoins à aller les configurer AVANT de poursuivre la configuration d'OpenPGP sur votre clé Yubico. Les informations sont en début de post dans le chapitre: Gestion de la clé et découverte. (Pas encore mis mon nez dans comment avoir des ancres dans un blog post avec ce CMS.  Je vais sûrement en changer...).

Voici l'état de ma clé après transfert sur la Yubikey :

$ gpg2 -K          
/home/claneys/.gnupg/pubring.kbx
--------------------------------
sec>  rsa4096 2023-03-06 [SC]
      2EA37F3CC41970767127F3438DC1A4B65BF0062F
      Card serial no. = 0006 23429221
uid           [ultimate] Romain FORLOT <rforlot@yahoo.com>
ssb>  rsa4096 2023-03-06 [E]
ssb>  rsa4096 2023-03-06 [A]
$ gpg2 --card-status            
Reader ...........: Yubico YubiKey OTP FIDO CCID 00 00
Application ID ...: D2760001240103040006234292210000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: 23429221
Name of cardholder: Romain Forlot
Language prefs ...: fr
Salutation .......: Mr.
URL of public key : https://keys.openpgp.org/vks/v1/by-fingerprint/2EA37F3CC41970767127F3438DC1A4B65BF0062F
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 5
KDF setting ......: off
Signature key ....: 2EA3 7F3C C419 7076 7127  F343 8DC1 A4B6 5BF0 062F
      created ....: 2023-03-06 21:19:48
Encryption key....: B3C5 389B 6EC9 9DEB F50A  8318 47C0 63EC 550F 446C
      created ....: 2023-03-06 21:19:48
Authentication key: 8402 59E8 BB14 E6E9 3A73  957A 4E9D 571C 5546 6EBC
      created ....: 2023-03-06 21:37:56
General key info..: pub  rsa4096/8DC1A4B65BF0062F 2023-03-06 Romain FORLOT <rforlot@yahoo.com>
sec>  rsa4096/8DC1A4B65BF0062F  created: 2023-03-06  expires: never     
                                card-no: 0006 23429221
ssb>  rsa4096/47C063EC550F446C  created: 2023-03-06  expires: never     
                                card-no: 0006 23429221
ssb>  rsa4096/4E9D571C55466EBC  created: 2023-03-06  expires: never     
                                card-no: 0006 23429221

Le signe après une clé sec ou ssb spécifie son statut :

  • un # signifie que la clé est inutilisable
  • un > signifie que la clé ou sous-clé est un stub dont le contenu est stocké sur une smartcard.
NOTE: L'état de votre clé vous indiquera toujours que vous disposez du secret permettant le déchiffrage de message chiffré avec votre clé publique. Pourtant, il ne sera pas possible pour autant de déchiffrer si la Yubikey n'est pas insérée. Ce qui réside sur votre disque n'est qu'un stub de la clé qui redirige vers la Yubikey. Aussi vous aurez normalement une pop-up vous demandant d'insérer la clé pour pouvoir déchiffrer un message.

Test de chiffrement avec la clé :

$ gpg2 -e --sign --armor -r 2EA37F3CC41970767127F3438DC1A4B65BF0062F un-fichier-avec-du-texte-lisible
$ gpg2 --decrypt fichier-avec-du-texte-lisible.asc > mon-fichier-déchiffré