URL: https://linuxfr.org/users/asirinelli/journaux/solution-d-authentification-par-mot-de-passe-unique Title: Solution d'authentification par mot de passe unique Authors: Antoine Date: 2012年05月21日T00:12:00+02:00 License: CC By-SA Tags: authentification, sécurité, yubikey, sqlite, zeromq, otp et postgresql Score: 60 Il y a quelque temps, j'ai écrit un système d'authentification utilisant les clés Yubikeys. Cela permet de s'authentifier par SSH ou sur un serveur web en utilisant un jeton, en plus de son mot de passe. Je l'utilise quotidiennement depuis plusieurs mois. Voici donc le code (GPL v2+). # Yubikeys # Ce sont des périphériques USB de la taille d'une clef fournissant des mots de passe uniques (One Time Password) ou _jetons_. Elles se comportent comme un clavier et émettent une séquence de touches différente à chaque appui sur son bouton. L'intérêt par rapport aux autres solutions OTP matérielles est son faible coût (25 $) associé à des spécifications publiques. Les logiciels pour configurer les clefs sont sous licence BSD et les algorithmes de génération des jetons sont publiques (s'appuyant sur AES-128). Le fabricant, [yubico](http://www.yubico.com/), fournit des serveurs permettant au travers d'une API d'authentifier des jetons, mais libre à qui veut d'effectuer cette vérification localement. # Pourquoi réinventer la roue ? # Si les sources des serveurs sont aussi disponibles pourquoi vouloir tout recoder ? La raison principale est que l'implémentation officielle est un service web écrit en PHP, couplé à une base MySQL ou PostgreSQL. Je trouvais cela un peu lourd de devoir installer un serveur LAMP pour gérer l'authentification de sessions SSH. Et puis aussi je n'aime pas PHP... L'autre raison est que le serveur officiel requiert les clefs de présenter un identifiant unique avant le jeton. Je n'aimais pas cette approche et je préfère que mes clés ne délivrent que le jeton. # Un serveur # Le serveur est écrit en C, stocke les données dans une base SQLite et communique avec les clients grâce à la bibliothèque [ZeroMQ](http://www.zeromq.org/). Le client est très léger et tourne depuis de nombreux mois, sans plantage, ni fuite mémoire. # Un module PAM # Ce module en C permet d'ajouter une authentification par jetons pour tous les logiciels qui gèrent le système PAM. Par exemple, pour que sshd demande un jeton avant le mot de passe traditionnel, il suffit de rajouter une ligne dans `/etc/pam.d/sshd`. # Un module Apache # Grâce à ce module, Apache peut demander un jeton avant d'autoriser l'accès à une page. On peut choisir le temps durant lequel l'authentification est valide. # Et aussi... # De petits programmes en C et python permettent de gérer la base de données du serveur ou d'initialiser de nouvelles clefs. # Conclusions # Ce n'est pas mon métier d'écrire des programmes sûrs, je passe plutôt mes journées à compter des électrons. Vous êtes donc prévenus sur la qualité du code, mais je pense que cela peut toujours servir si quelqu'un a la même problématique que moi. Le code est disponible là : [yubikey_zmq](https://github.com/asirinelli/yubikey_zmq) Il y a tout ce qu'il faut pour générer un paquet Debian. La TODO list est assez longue, donc si quelqu'un est intéressé pour utiliser ce code, qu'il n'hésite pas à m'envoyer des patchs.