Pam et Mir:ror : une authentification RFID sous Linux
Cette pluvieuse journée du 14 juillet m’a permis de poursuivre mes petits travaux sur le lecteur rfid « Mir:ror ». Dans les articles précédents, je me suis surtout intéressé au déclenchement d’événements en fonction des puces rfid détectées (ou pas) par le lecteur, oubliant l’essence même du RFID : l’authentification. J’ai donc profité de ce temps à ne pas mettre mon chat dehors pour écrire un module PAM (Pluggable Authentification Module) permettant d’authentifier un utilisateur via le Mir:ror.
L’idée est simple : si mon Mir:ror est connecté à l’ordinateur et qu’un fichier contenant mon rfid est présent dans mon répertoire, je veux pouvoir ouvrir ma session à l’aide d’une puce RFID (carte, badge, ztamp:s, laaaaapin…) à la place de saisir mon mot de passe.
Je ne vais pas m’attarder ici à décrire la manière dont est codé le module, je vous laisse le soin de lire les sources… Je vais me contenter d’expliquer son installation et son utilisation.
Mise en garde :
Pour plusieurs raisons dont la simplification du module et mes piètres talents de développeur, il va sans dire que ce petit programme ne doit pas être utilisé en environnement sécurisé. Par contre, pour la maison, c’est plutôt fun !
Nous touchons ici à une partie sensible du système : l’authentification. Les manipulations ci-dessous sont donc à réaliser avec prudence.
Compilation :
Pour pouvoir compiler pam_mir-ror, il nous faut installer un version récente de la librairie de développement pam (libpam-dev). J’ai utilisé la version 1.0.1 proposée par défaut sous Debian Lenny.
$ sudo aptitude install libpam-dev
L’archive contenant les sources est téléchargeable ci-dessous :
Une fois téléchargée, il faut la décompresser et tout simplement lancer la commande « make ».
$ tar -xvzf pam_mir-ror.0.2.tar.gz
$ cd pam_mir-ror.0.2
$ make
Si tout se passe bien, nous devrions obtenir deux binaires :
- read_mir-ror : Un petit outil permettant la lecture à partir du Mir:ror,
- pam_mir-ror.so : Le module pam.
read_mir-ror
Le petit outil read_mir-ror va nous permettre de tester le lecteur. Il suffit de l’exécuter et d’approcher une puce rfid.
$ sudo ./read_mirror
0000D0081A025303420200D2
La série de chiffres affichée n’est rien d’autre que l’ID de l’objet détecté.
Il est préférable d’utiliser read_mirror avec les droits root, au moins la première fois, pour l’accès au périphérique mir:ror. Par défaut, le mir:ror n’est accessible que par root. Les droits du handler sont changés à la première utilisation de la fonction de détection (inclue dans l’outil et le module). Il serait certainement plus propre de coder un petit outil qui serait automatiquement lancé par udev ou hotplug au branchement du Mir:ror, mais pour un module PAM, ce n’est pas très important.
Génération du fichier utilisateur
Le même outil (read_mir-ror), va nous permettre de générer le fichier .authtag contenant le rfid propre à chaque utilisateur :
Pour l’utilisateur courant :
$ sudo ./read_mirror > ~/.authtag
$ sudo chmod 400 ~/.authtag
Pour un autre utilisateur (toto):
$ sudo ./read_mirror > /home/toto/.authtag
$ sudo chmod 400 /home/toto/.authtag
Il faut bien entendu présenter la puce au lecteur juste après la commande ./read_mirror.
Le fichier .authtag doit maintenant contenir le tag :
$ cat ~/.authtag
0000D0081A025303420200D2
Module PAM : pam_mir:ror.so
Pour qu’il soit utilisable par PAM, il faut que pam_mir:ror.so soit présent dans /lib/security (lib64/security pour une architecture 64 bits)
$ sudo cp pam_mir-ror.so /lib/security
ou pour un module 64 bits :
$ sudo cp pam_mir-ror.so /lib64/security
La dernière étape va être l’ajout du module à PAM. Pour cela, il nous faut éditer le fichier :
/etc/pam.d/common-auth pour y ajouter, avant les modules pam_unix.so ou pam_unix2.so :
auth sufficient pam_mir-ror.so
/etc/pam.d/common-auth
# # /etc/pam.d/common-auth - authentication settings common to all services ... auth sufficient pam_mir-ror.so # here are the per-package modules (the "Primary" block) auth [success=1 default=ignore] pam_unix.so nullok_secure # 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) # end of pam-auth-update config |
Avant de rebooter frénétiquement la machine pour voir ce que ça peut donner avec gdm, je conseille vivement de tester sur une console (crtl-alt-F1 par exemple)… Comme expliqué en début d’article, nous touchons ici à une partie sensible du système et c’est mieux de garder la main pour éviter des pirouettes telles qu’un redémarrage en single user ou à partir d’un liveCD pour réparer.
J’ai fait en sorte que le module loggue un minimum. En fonction du système, ces logs sont visibles dans /var/log/auth.log ou /var/log/syslog.
Dernière version des sources : pam_mir-ror.0.2.tar.gz