Pam et Mir:ror : une authentification RFID sous Linux

pam_mirrorCette 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

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.

shell

Dernière version des sources : pam_mir-ror.0.2.tar.gz

Laissez votre message après le bip...Biiiiip

Commentaires

Bravo beau boulot ça donne envie

Avec tout tes billet sur mir:ror tu va finir par me convaincre d’en acheter un si tu continue 😉
Sinon c’est une bonne idée d’utiliser les rfid pour se logué, on peut même le faire avec les nouveau passeports biométriques 🙂 (j’ai pas essayé j’ai ni le lecteur de rfid ni un passeport biométrique 🙁 ).

Merci pour ce module !

J’ai un peu ramé pour le compiler et le mettre en place (je débute sous Ubuntu), mais finalement ça tourne au poil !

Ca marche même avec kdm 😉

J’aimerais beaucoup vous interviewer pour http://www.filrfid.org, comment puis-je vous appeler ?

pour ravomavain,
avec le passeport biométrique ce n’est pas possible car l’UID du passeport est généré aléatoirement 🙂 a moins que tu ai un passeport belge qui lui est fixe :p … je bosse sur le passeport biométrique lol alors si tu as des questions la dessus, n’hésitez pas :p

apres, de ce que je sais, le mir:ror utilise la norme RFID ISO/IEC 14443. normalement c’est la même que les pass navigo, vélib , et beaucoup d’autre.

voila

Hum, mais en fait le RFID, c’est vraiment adapté pour l’authentification ?
Pasque j’imagine qu’il est possible de faire des puces RFID programmables (on spécifie l’ID qu’on veut), et il est probablement possible de lire une puce RFID à une distance relativement grande (~1m). Par conséquent les puces sont « copiables » assez facilement et discrètement et ne sont donc pas très secure.
Le RFID ne devrait-il donc pas être seulement utilisé pour l’identification ?

J’espère me tromper (pasque c’est alléchant comme système :p)…

c’est le probleme inhérent aux communications radio fréquence ! c’est pratique, mais niveau sécurité il faut bien penser le système.
je t’avoue que je me pose encore la question sur l’authentification en RFID… Après niveau identification c’est l’extase …
mais niveau authentification, qui plus est, forte, ça marche, mais au prix d’une organisation et d’une infrastructure assez lourde de la part de l’état.

Merci pour ce module. Une petite astuce, placer l’appel au module dans ‘/etc/pam.d/common-auth’ implique qu’il sera utilisé par tous les services (applications) utilisant PAM pour l’authentification.
Hors son utilisation avec ‘polkit’ (ex: polkit-gnome-authorization), pose problème. Pour éviter ce petit désagrément il peut être intéressant d’appeler le module uniquement pour les services qui vous intéressent (‘gdm’ et ‘login’ dans mon cas) en rajoutant l’appel au module juste avant la ligne ‘@include common-auth’ dans les fichiers correspondants (dans mon cas ‘/etc/pam.d/gdm’ et ‘/etc/pam.d/login’).

bonjour,

Ayant plusieurs périphériques usb de la forme /dev/hidraw*, j’ai regardé ce qu’il était possible de faire avec udev pour détecter et changer automatiquement les droits sur le mir:ror. Sous debian, udevadm donne très peu de renseignements sur le mir:ror, il semble donc impossible d’écrire une règle (pas moyen d’identifier le périphérique)

Quand on regarde le code source inclus dans la dernière version de mirware pour linux, cependant, il est intéressant de constater que la méthode de détection du mir:ror utilise ioctl et se base sur des champs « vendor » et « product ». Il doit donc être possible d’obtenir ces infos autrement.
Aurais tu des idées sur la question?

j’ai une autre question, est-il possible de modifier le module pam que tu as écrit pour faire en sorte que l’authentification ne nécessite pas d’entrer le login ? Par exemple lorsque la puce RFID est présentée, on pourrait boucler sur les fichiers .authtag à la racine du home de chaque utilisateur, et si on en trouve un qui correspond, on ouvre la session de cet utilisateur. Ce n’est pas très sûr, mais pour un ordi perso ce n’est pas très gênant.

bonjour!
je veux ecrire un module pam_jabber pour une application (exemple :ftp),
esq c’est possible de vous m’aider,
merci d’avance

[…] plus qu’à l’adapter à ses besoins. On pourra s’inspirer de cet autre post sur le blog JoPa.fr : Pam et Mir:ror : une authentification RFID sous Linux pour des idées. var dd_offset_from_content = 40; var dd_top_offset_from_content = 0; À propos […]

Laisser un commentaire

(requis)

(requis)