Authentification locale à double facteur via U2F
Il n'est guère nécessaire de rappeler que les mots de passe constituent une faiblesse significative dans les architectures informatiques. Pas une semaine ne se passe sans que l'on apprenne la compromission de mots de passe, parfois sur une échelle de plusieurs dizaines voire centaines de millions de comptes.
L'authentification à double facteur vise à limiter la dépendance sur un mot de passe : il faut non plus un mais deux éléments d'authentification, le second éléments étant variable dans le temps et dépendant d'un composant matériel particulier. Ce peut être un téléphone, avec une application comme Google Authenticator, ou un composant spécial de type ActivCard ou Token RSA.
Depuis 2015, un nouveau type de produit est apparu, dont le très faible coût se révèle particulièrement intéressant : les clés FIDO/U2F (pour Universal 2nd Factor, ou double-facteur universel). Il s'agit de crypto-clés USB qui facilitent singulièrement la mise en oeuvre d'une authentification à double facteur, y compris pour une authentification locale.
Installation sous Linux
Nous voulons, sur une machine, que certaines opérations d'authentification utilisent un second facteur reposant sur une clé U2F. Dans un premier temps, nous n'activerons l'authentification à double facteur que pour les élévations ou changements de privilèges (su et sudo). Ensuite, l'authentification à double facteur sera généralisée.
Règles udev
La clé U2F doit être reconnue par udev pour être accessible à l'utilisateur. Celui-ci, dans la configuration ci-dessous, doit être membre du groupe plugdev.
Il suffit d'ajouter une règle udev similaire à la suivante (les variables idVendor et idProduct peuvent différer, selon le fournisseur de la clé) :
ATTRS{idVendor}=="2581", ATTRS{idProduct}=="f1d0", GROUP="plugdev", MODE="0660"
Lorsqu'elle est connectée, la clé peut provoquer la production de messages comme les suivants :
kernel: usb 2-1.4: New USB device found, idVendor=2581, idProduct=f1d0
kernel: usb 2-1.4: New USB device strings: Mfr=1, Product=1, SerialNumber=1
kernel: usb 2-1.4: Product: Plug-up
kernel: usb 2-1.4: Manufacturer: Plug-up
kernel: usb 2-1.4: SerialNumber: Plug-up
Les identifiants du vendeur et du produit apparaissent sur la seconde ligne.
Configuration de PAM
Il est nécessaire de disposer d'un module PAM spécifique traitant l'authentification U2F : pam_u2f. Ce module est développé par Yubico. Le code source se trouve sur Github. Ce module est probablement disponible sur toutes les distributions Linux.
Pour ajouter l'authentification U2F aux commandes su et sudo, il suffit de modifier les fichiers /etc/pam.d/su ou /etc/pam.d/sudo. Ici, nous voulons que cette authentification soit obligatoire et que tout échec provoque le rejet de l'opération.
$ grep auth /etc/pam.d/su
auth include system-auth
auth required pam_u2f.so debug interactive
L'option interactive provoque l'affichage d'un message informant l'utilisateur qu'il doit introduire sa clé dans un port USB. Cette option est utile pour les clés ne disposant pas de bouton d'activation, comme celle qui illustre l'article. Si vous disposez d'une clé U2F avec un bouton d'activation, l'option interactive peut être remplacé'e par l'option cue, qui affiche un message rappelant à l'utilisateur qu'il doit appuyer sur le bouton de sa clé. En l'absence de l'une de ces deux options, aucune information particulière n'est affichée, ce qui peut dérouter un utilisateur qui ne serait pas habitué à l'authentification à double facteur.
L'option debug permet d'afficher à l'écran des traces de fonctionnement de pam_u2f. Il est préférable de retirer cette option lorsque les tests sont terminés.
Extension à tous les services
Dans la section précédente, nous avons ajouté sélectivement la directive concernant l'authentification à double facteur dans le fichier de configuration PAM des services qui nous intéressent (su, sudo, etc.). Par le jeu des inclusions de configurations, il est possible de n'ajouter cette directive que dans un fichier maître, typiquement le fichier system-auth qui est inclus par pratiquement tous les autres.
Attention cependant : assurez-vous au préalable que tous les clients qui s'appuyent sur PAM sont capables d'afficher les messages produits par pam_u2f pour l'introduction de la clé ou l'activation du bouton de celle-ci. Si ce n'est pas le cas, vérifiez que vos utilisateurs sont bien informés qu'ils doivent insérer/activer leur clé dès qu'un mot de passe leur est demandé. Sinon, ils vont oublier cette étape techniquement invisible pour eux, et ne pourront plus utiliser le service concerné.
Configuration du module pam_u2f
Le module pam_u2f va chercher les informations sur les clés dans un fichier, qui peut être général au système (/etc/u2f_mappings) ou propre à chaque utilisateur (~/.config/Yubico/u2f_keys). Pour des raisons de souplesse, nous recommandons la configuration par utilisateur.
Le fichier u2f_keys ne doit contenir qu'une seule ligne. Le fichier u2f_mappings doit contenir une ligne par utilisateur. La forme des lignes est identique pour les deux fichiers.
Le module pam_u2f va chercher dans le fichier u2f_keys ou u2f_mappings les informations nécessaires pour l'authentification. Ces informations sont produites à l'aide de la commande pamu2fcfg. Il suffit de lancer cette commande alors que la clé U2F n'est pas connectée, et de brancher la clé à la demande :
$ pamu2fcfg
No U2F device available, please insert one now, you have 14 seconds
Device found!
XXXX:YYYYY,ZZZZZ
Le XXXX correspond au nom de l'utilisateur. Note : selon les distributions Linux, il peut être nécessaire que l'utilisateur concerné soit dans le groupe usb ou plugdev.
Pour un utilisateur, la ligne produite doit être copiée dans le fichier u2f_keys. Si celui-ci contient déjà une ligne, les informations, après en avoir retiré le nom de l'utilisateur (XXXX ci-dessus), doivent être ajoutée à la ligne courante, séparée par deux points :
XXXX:informations,existantes:nouvelles,informations
Pour une configuration globale, les données produites par pamu2fcfg doivent être copiées dans le fichier u2f_mappings. S'il y a déjà une ligne pour l'utilisateur concerné, il faut ajouter les informations produites à cette ligne, après leur avoir ôté le nom de l'utilisateur, comme pour le fichier u2f_keys.
Test avec su et sudo
Le module pam_u2f étant configuré avec l'option interactive, voici ce que l'on obtient lors d'une élévation de privilèges :
$ su -
Password:
Insert your U2F device, then press ENTER.
#
Et pour sudo :
$ sudo mount
Password:
Insert your U2F device, then press ENTER.
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
[...]
$
Conclusion
Il est aujourd'hui très facile d'ajouter une authentification à double facteur sur les postes de travail, que ce soit pour toutes les opérations nécessitant une authentification ou seulement pour certaines d'entre elles. Il s'agit d'un progrès significatif dans la sécurisation de l'accès aux systèmes.
Etant donnée la petite taille des clés U2F, il est facile de les égarer. Pour éviter de perdre l'accès à un système, nous conseillons de configurer, pour certains utilisateurs, une seconde clé d'accès. Cette dernière doit être mise à l'abri et utilisée uniquement en cas de perte de la clé principale.