pam_usb est un projet visant à créer un module PAM d'authentification basé sur des paires de clés sur un peripherique USB, ou autre d'ailleurs (il est possible d'utiliser par exemple une disquette ou un CDROM). Le site web du projet est http://www.pamusb.org/ [EN]. Cela permet d'avoir à faible coût un moyen d'authentification physique sécurisé.
Ce tutoriel est très largement inspiré des deux pages de documentation officielle présente sur le site du projet, dans la langue de Molière toutefois. N'hesitez pas a me soumettre toute correction technique, orhtographique ou grammaticale.
Il vous faudra d'abord récupérer les sources de ce module dans la section téléchargement du projet sur SourceForge.net [EN]. A a date d'écriture de ce tutoriel, le fichier à télécharger est pam_usb-0.3.1.tar.gz, à savoir la version 0.3.1 du module. Déplacez le dans /usr/local/src, et décompressez le :
23:10 root@iguzki /usr/local/src# tar xvfz pam_usb-0.3.1.tar.gz
Puis déplacez vous dans le répertoire des sources, compilez le module, et installez le :.
23:10 root@iguzki /usr/local/src# cd pam_usb-0.3.1 23:10 root@iguzki /usr/local/src/pam_usb-0.3.1# make 23:10 root@iguzki /usr/local/src/pam_usb-0.3.1# make install
Voilà, vous n'avez plus qu'à générer une paire de clé, et à configurer PAM.
On va ensuite configurer la méthode d'authentification désirée. Pour cela, nous allons modifier le fichier désiré, dans le répertoire /etc/pam.d/. Au choix, vous pourrez modifier le fichier login pour votre authentification sur une console locale, ou bien xdm pour une authentification par le gestionnaire graphique de connexion.
Trois méthodes sont disponibles, à vous de choisir, elle sont relativement explicites je pense :
auth required pam_unix.soCe qui est réalisé en rajoutant un dièse au début de cette ligne, pour obtenir cette nouvelle ligne :
#auth required pam_unix.soOn va alors rajouter la ligne suivante, qui rend obligatoire un appel réussi du module pam_usb :
auth required pam_usb.so
auth sufficient pam_usb.so auth required pam_unix.so
auth required pam_usb.so auth required pam_unix.so
Le module pam_unix.so peut avoir différents noms selon votre distribution GNU/Linux, pour plus d'information sur PAM, référez vous à la documentation officielle de PAM [EN], ou bien à la documentation de votre distribution favorite.
Attention, les methodes "alternative et unique" posent evidemment de gros problemes de securite en cas de perte de votre cle USB, disquette ou CDROM.
Pour configurer le module, il est possible de rajouter des options a la fin de la ligne contenant pam_usb.so, dans le fichier de configuration utilise dans le repertoire /etc/pam.d/. Voila une liste des options prises en compte :
| Nom | Type | Description | Valeur par defaut |
| mntpoint | chaine de caracteres | Point de montage temporaire, pour verification des cles privees. XXXXXX (une serie de 6 X) sera remplacee par une valeur temporaire. | /tmp/pam_usbXXXXXX |
| proc_basename | chaine de caracteres | Le nom et l'emplacement du peripherique dans le procfs. En general, la valeur par defaut est juste, pas besoin de modifier cela. | /proc/scsi/usb-storage-%d/%d |
| pwfile | chaine de caracteres | Le chemin ou pam_usb va chercher les cles publiques (sous mountpoint/) et privees (sous ~utilisateur/). La valeur par defaut correspond a celle utilisee lors de la generation. | /.auth/ |
| pubkey | chaine de caracteres | Le nom du fichier contenant la cle publique. La valeur par defaut correspond a celle utilisee lors de la generation. | id_pub |
| snfile | chaine de caracteres | Le fichier contenant les numeros de serie autorises. S'il est inexistant, alors n'importe quel numero de serie sera autorise. | /etc/pam_usb/serials.conf |
| fs | chaine de caracteres | Liste des systemes de fichiers utilises pour monter le peripherique, separes par des virgules. | ext2,vfat |
| utmp | chaine de caracteres | Emplacement du fichier utmp. | /var/run/utmp |
| mount_opts | chaine de caracteres | Options de montage du peripherique (bind, sync, ro, ...), separes par une virgule. man mount vous permettra de voir une liste tres fournie des options disponibles. | |
| log_file | chaine de caracteres | Fichier de journalisation utilise par pam_usb, pour stocker les sorties. Si aucun n'est specifie, alors les sorties ont lieu sur la sortie standard, ce qui provoque des connexions verbeuses en console. | |
| local_consoles | chaine de caracteres | Liste des consoles separees par des virgules auquelles il est possible de se connecter, quand allow_remote est positionne a faux. | /dev/vc/,/dev/tty,: |
| direct_open | booleen | Tentative d'ouverture de la cle privee en utilisant O_DIRECT, ce qui permet d'outrepasser le cache disque. Ne fonctionne correctement qu'avec les peripheriques supportant ce mode d'acces. | |
| local_hosts | chaine de caracteres | Liste des hotes autorises a se connecter quand allow_remote est positionne a faux, les hotes doivent etre separes par une virgule. | : |
| force_device | chaine de caracteres | Il est possible de forcer un peripherique avec cette option, il faut utiliser le nom et l'emplacement du peripherique, /dev/sda1 par exemple. Si l'ouverture de ce periferique echoue, alors pam_usb tente en auto-detection. Cette option permet egalement d'utiliser d'autres peripheriques qu'une cle USB, une disquette (/dev/fd0 par exemple), un CDROM (/dev/cdrom par exemple). | |
| allow_remote | booleen | Positionne a faux, pam_usb va permettre seulement aux hotes local_hosts et local_consoles de se connecter. | faux |
| check_device | booleen | Si cette option est positionnee a faux, alors pam_usb ne va pas verifier si le peripherique est attache, ni si le numero de serie est autorise. | vrai |
| check_if_mounted | booleen | Si positionne a vrai, alors pam_usb va verifier si le peripherique est deja monte et si c'est le cas, il va utiliser le point de montage actuel au lieu de mntpoint (les auteurs du projet deconseillent l'utilisation de cette option, mais je ne comprend personnellement pas pourquoi). | faux |
| keep_mounted | booleen | Si le peripherique est deja monte, alors pam_usb ne va pas demonter celui-ci apres ses verifications. Utile utilise en combinaison avec check_if_mounted. | faux |
| sign_times | entier | Nombre de fois que pam_usb va effectuer le challenge de verification. | 3 |
| debug | booleen | Activation du mode de deboggage. Attention, en cas d'utilisation de cette option, mieux vaut specifier log_file. | faux |
Les option booleennes peuvent etre placees a vrai juste en les specifiant, et a faux en les faisant preceder avec un point d'exclamation.
Les options prenant des valeurs entieres ou des chaines de caractere s'utilise en specifiant le nom de l'option suivi d'un signe egal et de la valeur desiree.
Voila par exemple la ligne specifiee dans /etc/pam.d/login sur mon portable professionnel par exemple :
auth sufficient pam_usb.so !check_device check_if_mounted fs=reiserfs,ext3 log_file=/var/log/pam_usb.log keep_mounted debug force_device=/dev/sda1
Une petite explication s'impose a propos de cet exemple. Une validation par pam_usb est suffisant pour se connecter au systeme, donc mode d'authetification alternatif, pas de verification du numero de serie, verification du montage du peripherique et utilisation du point de montage si c'est le cas, systemes de fichiers autorises reiserfs puis ext3. Journalisation des sorties de pam_usb dans le fichier /var/log/pam_usb.log, pas de demontage si le peripherique est deja monte, activation du mode verbeux, forcement du peripherique /dev/sda1 (ma cle USB, reconnue comme premier peripherique SCSI par le module USB_MASS_STORAGE, et sur lequel la premiere partition contient mes cles privees).
On va pouvoir alors générer une clé publique, destiné à être placée sur la machine sur laquelle on veut s'authentifier, et une clé privée correspondante destinée à être placée sur la clé USB. On va utiliser l'utilitaire usbadm pour réaliser cette génération.
Si on ne l'a jamais fait auparavent, on va créer un point de montage pour celle-ci, et la monter (on va stocker la clé privée sur la première partition de la clé, celle-ci étant reconnue comme /dev/sda1) :
23:10 root@iguzki ~# mkdir /mnt/usb 23:10 root@iguzki ~# mount /dev/sda1 /mnt/usb
La syntaxe de l'utilitaire est la suivante : usbadm keygen <point de montage> <utilisateur> <bits>. On va créer une paire de clé pour l'utilisateur root, de 2048 bits :
23:10 root@iguzki ~# usbadm keygen /mnt/usb root 2048 [!] Directory /root/.auth/ not found, creating one... [!] Directory /mnt/usb/.auth/ not found, creating one... [!] Generating 2048 DSA key pair for root@host [!] Extracting private key... [+] Private key extracted. [+] Private key successfully written. [!] Writing public key... [+] Public key successfully written.
Ca y est, vous pouvez vous logguer en tant que super-utilisateur sur cette machine, en vous contentant de brancher votre clé USB, et en indiquant root comme identifiant, si vous avez choisi la méthode unique ou alternative.
Repetez l'appel a cette commande pour generer d'autres paires de cle, par exemple pour un autre utilisateur sur la meme machine, ce qui permettra a deux utilisateurs differents de se logguer par ce biais avec la meme cle USB.