Utiliser une clef USB comme mot de passe
Le 8 novembre 2007, à 10:46 par Ulhume...

L'idée ici est assez simple : utiliser la partition d'un clef usb pour s'authentifier sur un serveur grâce au plugin pam_usb. Ainsi, plus aucun mot de passe n'est demandé.

Deux mots sur PAM

L'authentification sous Linux est aujourd'hui quasi-universellement confiée à PAM pour Plugin Authentification Module. PAM est utilisé à chaque fois que vous vous connectez sur votre système. Son fonctionnement consiste à confier à une série de modules enfichables, des plugins, le soin de déterminer si votre accès est autorisé ou pas. Les plugins sont appelés les uns après les autres et chacun dit oui ou non. Le paramétrage de PAM permet alors de savoir si un OUI est nécessaire ou s'il suffisant pour vous accepter.

En standard, PAM utilise surtout un seule plugin, pam_unix, qui va vérifier votre mot de passe dans /etc/shadow. Mais il est possible d'ajouter toute sorte de plugins pour enrichir la politique d'authentification. Par exemple pam_ldap pour s'authentifier sur un serveur LDAP. Et dans notre cas pam_usb pour le faire via une simple clef USB.

Les modules PAM sont situés en /lib/security et leur configuration en /etc/pam.d. Dans le cas d'une Mandriva, ce dossier contient un fichier par application utilisant PAM (imap, sshd, etc..) qui contient généralement des directives include permettant d'avoir un comportement commun par défaut, via le fichier system-auth. Les lignes qui nous intéressent ici sont celles qui régissent l'authentification et qui commencent par le mot clef auth:

  1. auth        sufficient    pam_unix.so likeauth nullok
  2. auth        sufficient    pam_ldap.so use_first_pass
  3. auth        required      pam_deny.so

Dans ce fragment, on s'aperçoit que l'authentification va d'abord se faire via le système classique d'UNIX (fichier /etc/shadow), puis, le cas échéant, via LDAP. Si aucun des deux n'as fonctionné, c'est pam_deny qui prends le relais et vous envois balader.

Le mot clef sufficient indique que si le module a correctement authentifié l'utilisateur, les modules suivants ne sont pas interrogés. Le mot clef required indique quant à lui que l'on doit passer par lui obligatoirement. Ainsi dans l'exemple précédent si nous avions remplacé (ne le faite pas !) les sufficient par des required, il faudrait pour qu'un utilisateur qui s'autentifie, soit présent dans /etc/shadow ET sur LDAP.

Préparation de la clef USB

Première étape, préparer le clef usb. Soit vous utilisez une veille clef et vous la dédiez totalement, soit vous pouvez créer sur votre clef de travail une minuscule partition dédiée au stockage des clefs. Dans un cas comme dans l'autre la partition ne peut être formatté qu'en EXT3 ou REISER. Pas de FAT32 donc. C'est pour cela que sur ma clef de 1GO, j'ai formatté une première partition de 1GO-7Mo en FAT32 pour une utilisation classique, et une petite partition de 7Mo (j'ai pas réussi à faire moins) en EXT3 pour mes clefs. A 2ko la clef, cela en fait 3500, ce qui me semble suffisant Wink

Pour créer et formatter la ou les partitions, je vous conseille d'utiliser drakdisk. Il vous faut donc supprimer les partitions existantes, en créez deux nouvelles en ne laissant que 1mo à la seconde. Puis enfin formatter la deuxième partition en EXT3 ou Reiser. La première partitions peut quant à elle être formattée selon vos goûts.

La clef formattée, nous allons donner un label à la seconde partition. Ce label va nous permettre de localiser la clef plus facilement par la suite et aussi, pour les unix modernes, va être utilisé lors d'une insertion comme nom pour le point de montage automatique. Pour changer le label d'une partition, allez voir par là. Tapez sync puis débranchez et rebranchez la clef pour être sur que tout va bien.

Pour la suite de ce tutorial, je part du principe que la partition a pour label usb-pass. Qu'elle est donc accessible via /dev/disk/by-label/usb-pass et qu'elle dispose d'un UUID proprement définit.

Installation de pam usb

La solution adoptée par pam_usb est d'écrire une série de nombre aléatoire sur notre partition de 1Mo. A la connexion, cette série de chiffre (nommée pad) est comparée à celle qui a été copie dans le dossier utilisateur. Si ça colle, l'utilisateur est validé et pam_usb générée une nouvelle série de chiffres qui stock à nouveau sur la clef et dans le dossier utilisateur. Et ainsi de suite. Cette méthode garantie que toute donnée copies deviendra vite caduque à un détail près. En effet, si je débranche ma clef, que quelqu'un la copie, et se reconnecte avant moi, je suis grillé... La solution a donc ses limites qu'il est important de connaître.

La version 0.4.1 incluse dans la Mandriva 2008.0 était un peu buggée, il est plus sage de compiler soit même la dernière version du module. Il faut pour cela aller sur le site de pam_usb pour télécharger le dernier tarball (pam_usb-0.4.2.tar.gz) et le compiler :

  1. tar -zxvf pam_usb-0.4.2.tar.gz
  2. cd pam_usb-0.4.2
  3. urpmi libhal1-devel libpam0-devel pmount
  4. make install

Ceci fait, branchez votre clef USB, et lancez la commande suivante. Il va vous être demandé de choisir parmi les partitions de clef usb présente sur le système celle qui contiendra les données d'authentification. Choisissez la petite partition pass-usb. Tapez enfin Y pour sauver ces informations dans le fichier de configuration /etc/pamusb.conf.

pamusb-conf --add-device maClef

Ensuite nous allons ajouter un utilisateur authentifiable sur la clef. Pour cela utilisez la commande suivante en indiquant en paramètre l'utilisateur à rajouter.

pamusb-conf --add-user gaston

Voilà, c'est terminé. Il suffit maintenant d'ajouter dans /etc/pam.d/system-auth la ligne indiquant à PAM que la clef USB est le premier moyen suffisant pour s'authentifier sur ce système :

  1. auth        required      pam_env.so
  2. auth        sufficient    pam_usb.so
  3. auth        sufficient    pam_unix.so likeauth nullok
  4. auth        required      pam_deny.so

Il ne reste maintenant plus qu'à tester. Une fois que tout est bon, vous pouvez rendre pam_usb moins bavard en modifiant /etc/pamusb.conf comme suite :

  1. <defaults>
  2.   <option name="debug">false</option>
  3.   <option name="quiet">true</option>
  4. </defaults>

Commentaires

Spami , le 18 August, 2007 - 20:34

C'est un exellent tuto !
Mais il ne faut égarer sa clef USB dans ce cas Smiling

Ulhume, le 18 August, 2007 - 23:05

Merci Smiling

Bah sinon, il y a toujours le mot de passe qui continue à fonctionner;-) Le seul truc, c'est qu'à la longue on oublie le fameux mot de passe ...

djib , le 8 November, 2007 - 13:52

Intéressant et plutôt cool !

Juke , le 8 November, 2007 - 14:11

Salut

Est t'il possible de ne pas avoir à taper le login.
Genre je suis sur gdm, quand je branche ma clé, il se loggue automatiquement avec l'utilisateur correspondant.

A+

Julien

Ulhume, le 8 November, 2007 - 15:08

@Juke pas directement non, mais cela doit être jouable en modifiant l'agent (les sources).

Dup , le 8 November, 2007 - 21:50

Ce qui pourrait être drôle c'est de configurer l'accès pour root, et d'activer le support de pam_usb dans le fichier /etc/pam.d/sshd Big grin

Ulhume, le 9 November, 2007 - 00:33

@Dup LOL Wink Petit malin, rassures toi j'y avais déjà pensé, et chose étrange, si tu fais cela, ssh ne répond plus. Quel que soit l'accès d'ailleurs. Je ne sais pas si c'est fait exprès mais si tu tentes un ssh sur une machine où la clef est branchée, ça t'envoie bouler Smiling

dup , le 9 November, 2007 - 08:23

Ah oui tiens je me demande pourquoi ca ne marche pas, ce pourrait-il que le client recherche la clé usb sur le poste initiant la connexion plutôt que le serveur, ce qui me paraît bizarre ? En tous cas je vois je ne suis pas le seul à y avoir pensé.

Ulhume, le 9 November, 2007 - 09:06

@dup ben tu sais, dés qu'il y a une conneries à faire Wink

Plus sérieusement je viens de refaire le test avec la dernière version (le coup de l'erreur c'était avec la 0.4.1). Maintenant lorsque je tente une connexion à partir d'une machine distante sur une machine avec pamusb configurée et une clef insérée, le système me demande malgrès tout mon mot de passe. Donc le cas est prévu (heureusement tu me diras Wink et l'erreur devrait être une mauvaise gestion du fallback(pamusb/shadow) dans le même cas de figure.

Donc ça va, c'est safe Smiling

Dup , le 9 November, 2007 - 17:51

Bon ca me rassure alors Smiling
Il est vrai que j'ai entendu dire que la version 4.1 est buggé.

Ulhume, le 10 November, 2007 - 06:55

C'est un fait, il avait au moins deux bugs, celui-là et une erreur bien casse pied de reconnaissance de partitions, les deux sont réglés à l'évidence.

Poster un nouveau commentaire

Le contenu de ce champ est gardé secret et ne sera pas montré publiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • To highlight piece of code, just surround them with <code type="language"> Your code &tl;/code>>. Language can be java,c++,bash,etc... Everything Geshi support.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Textual smileys will be replaced with graphical ones.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.

Plus d'informations sur les options de formatage

Connexion utilisateur
Sommaire
Commentaires récents