tux-secuJ'ai récemment acquis une Yubikey que j'utilise en conjonction de lastpass. Cette clé me permet d'effectuer une authentification à deux facteurs. J'ai donc souhaité étendre ce concept sous un système Gnu/Linux[1]. Pour cela il faut d'abord ajouter une source qui contient la librairie PAM pour la yubikey.

$ sudo add-apt-repository ppa:fredrikt/yubico
$ sudo apt-get update
$ sudo apt-get install libpam-yubico

Sous Mint / Ubuntu, seul le super utilisateur à le droit d'écrire sur le périphérique usb de Yubico. C'est gênant pour notre utilisation car les processus d'authentification qui ne seraient pas lancés en tant de root ne supporteraient pas l'utilisation de la yubikey.
C'est par exemple le cas de gnome-screensaver, c'est l'utilisateur connecté qui exécute ce process. Donc, si on laisse ubuntu dans l'état initial, on peut ouvrir une session avec lightdm, mais on ne pourra jamais débloquer l'écran de veille car  la yubikey n'est pas accessible :

gnome-screensaver-dialog: USB error: Access denied (insufficient permissions)


Il faut donc ajouter une règle udev permettant de faire appartenir le device USB à un groupe dans lequel on mettra les utilisateurs qui veulent utiliser la yubikey pour l'authentification pam.
Tout d'abord on crée le groupe : 

$ addgroup yubikey

Puis , on ajoute l'utilisateur qui possède la yubikey dans le groupe : 

$ adduser toto yubikey

Enfin on crée un fichier /etc/udev/rules.d/71-yubikey.rules qui contient la ligne suivante : 

$ sudo echo 'SUBSYSTEM=="usb",ACTION=="add",ATTR{idVendor}=="1050",ATTR{idProduct}=="0010",GROUP="yubikey"' > /etc/udev/rules.d/71-yubikey.rules

Pour ma part j'ai redémarré le système pour que tout soit pris en compte, mais il suffit peut être de lancer les commandes :

$ sudo udevadm control --reload-rules
$ sudo service lightdm restart

Il faut savoir que la yubikey dernière génération[2] dispose de deux slots de configuration permettant ainsi de l'utiliser de deux manières différentes. Par défaut le slot1 est configuré pour générer un mot de passe à usage unique. Lors d'une utilisation de cette méthode le mot de passe généré est vérifié auprès du serveur yubicloud de chez yubico. Cette méthode est valable mais elle nécessite une connexion internet. Hors si ce n'est pas gênant pour l'authentification sur un service en ligne, ça l'est pour l'authentification sur un ordinateur qui peut potentiellement être déconnecté du réseau.
Il faut alors configurer le slot2 pour une utilisation en mode challenge/response.

Pour cela il faut installer l'outil de personnalisation fourni par yubico. Sous les ubuntu like rien de plus simple : 

$ sudo apt-get install yubikey-personalization-gui

Puis on lance l'outil graphique[3] :

$ yubikey-personalization-gui

Il faut alors cliquer sur l'onglet "Challenge-Response" puis sur le bouton "HMAC-SHA1". Ensuite dans la partie "Configuration Slot" cliquer sur "Configuration Slot 2", laisser toutes les options par défaut puis cliquer sur le bouton "Write Configuration" de la partie "Actions".
Une fois cette étape effectuée on peut utiliser notre yubikey à la fois pour la génération de mots de passe à usage unique mais aussi en mode challenge-response.

Il faut maintenant associer notre yubikey à un compte utilisateur présent sur l'ordinateur. Pour cela, il faut utiliser la commande "ykpamcfg".
Normalement cette commande suffit :

$ ykpamcfg -2 -v

La yubikey est maintenant associée à l'utilisateur, il faut donc configurer pam pour qu'il utilise la yubikey comme deuxième facteur d'authentification.
Tout d'abord, il convient de faire une copie de sauvegarde du fichier /etc/pam.d/common-auth :

$ sudo cp /etc/pam.d/common-auth /home/toto/

Puis, il faut modifier le fichier en question pour qu'il ressemble à cela : 

#
# /etc/pam.d/common-auth - authentication settings common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of the authentication modules that define
# the central authentication scheme for use on the system
# (e.g., /etc/shadow, LDAP, Kerberos, etc.). The default is to use the
# traditional Unix authentication mechanisms.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.

# here are the per-package modules (the "Primary" block)
auth required pam_unix.so nullok_secure try_first_pass
auth [success=1 new_authtok_reqd=ok ignore=ignore default=die] pam_yubico.so mode=challenge-response
# here's the fallback if no module succeeds
auth requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth required pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth optional pam_cap.so
# end of pam-auth-update config

Voilà, à présent lorsque vous voudrez vous authentifier, il faudra connecter la yubikey puis saisir votre mot de passe habituel. Si la yubikey n'est pas présente lors de la saisie du login/mot de passe l'authentification échouera.

[1] : Mint en l'occurence, mais cela fonctionne très bien avec les autres distributions.
[2] : À partir de la version 2.2.
[3] : N'oubliez pas d'insérer votre yubikey dans un port usb.

Source