Mise en place d’un système d’authentification forte via OTP sous Linux

Authentification forte?

Il existe trois facteurs d’authentification à un système informatique :
-Ce que l’on sait, par exemple un mot de passe ou une phrase secrète
-Ce que l’on est, par exemple via le biais d’un lecteur biométrique
-Ce que l’on a : par exemple à l’aide d’un lecteur de carte à puce.

Chacune de ses méthodes a ses inconvénients : la carte à puce peut être volée ou le mot de passe peut être trouvé par exemple par le biais d’un keylogguer.
Ma motivation était d’empêcher le sniffing de mot de passe par le réseau ou d’un entourage curieux pouvant observer mon clavier afin de voir mon mot de passe.
Grace à l’authentification forte, ces risques sont réduits en utilisant deux facteurs conjointement. Le but de cet article est d’utiliser à la fois ce facteur «ce que l’on sait» et le facteur «ce que l’on a».

Pour cela, autant utiliser un objet que l’on a toujours sur nous, tel notre téléphone mobile qui va pouvoir assumer la partie «ce que l’on a».
Grace à un logiciel adéquat, notre téléphone  va générer un mot de passe à usage unique et qui a une durée de vie de quelques minutes. Ainsi, un mot de passe sniffé ou vu sera invalidé dès son utilisation, et les attaques de brute force ont très peu de chances d’aboutir en raison de la volatilité du mot de passe.

Le mot de passe est généré en faisant un hash du temps unix, d’une clef secrète (appelée semence ou seed) partagée par le serveur et le téléphone, ainsi que d’un code PIN entré par l’utilisateur sur son téléphone pour générer chaque mot de passe jetable, et connu du serveur également. Ainsi, même en cas de vol du téléphone, il faudra quand même connaitre le code PIN pour générer un mot de passe fonctionnel.

Installation du générateur de mot de passe sous Apple iPhone.

De nombreuses applications gratuites et performantes sont disponibles sur le marché. Pour en avoir essayé plusieurs, je vous conseille iOTP pour son efficacité et sa simplicité. Il est téléchargeable gratuitement sur l’App Store.

Lors du premier lancement de l’application, il vous faut créer un compte en allant dans l’onglet Accounts puis en touchant la croix en haut à droite.

Ensuite, il faut donner un nom au compte et toucher «Generate Secret». L’application vous donne alors une clef hexadécimale qu’il vous faut absolument noter : on devra ensuite la renseigner au serveur. Il vous est possible de vous l’envoyer par email, en prenant soin de l’effacer ensuite.

Une fois la configuration sauvée, vous pouvez générer un semblant de mot de passe en entrant un code PIN au hasard. Remarquez qu’un mot de passe différant est généré toutes les 20 secondes, il va falloir apprendre à taper vite.

Il est bien sur possible d’utiliser un générateur sur d’autres types de mobile, des clients spécifiques sont évidemment disponibles pour les personnes s’étant orientées vers des plateformes plus libres, tel Google Android ou simplement pour des téléphones supportant Java.
Ceci était la partie simple, il va maintenant falloir mettre les mains dans le cambouis et s’attaquer à la configuration du versant serveur.

Mise en place du serveur.

La suite de ce tutorial est faite sur Linux Ubuntu 9.10 version serveur, mais est facilement reproductible sur d’autres distributions voire sur des systèmes de type BSD.

Téléchargement de otpverify.sh

Ce script permet de vérifier la validité d’un mot de passe jetable en lui fournissant le PIN et la semence. Il vous faut le copier dans le repertoire /usr/local/bin et le rendre exécutable. Pour cela entrez les commandes suivantes:

cd /usr/local/bin
sudo wget http://motp.sourceforge.net/otpverify.sh
sudo chmod +x otpverify.sh

Le script fonctionne avec l’interpréteur de commande ksh, vous devriez peut-être l’installer en entrant la commande suivante:

sudo apt-get install ksh

Vous pouvez à présent tester le script en entrant la commande suivante:

 sudo otpverify.sh Utilisateur MotdePasse Semence PIN Décalage

Où Utilisateur est un nom d’utilisateur choisit arbitrairement, MotdePasse est le mot de passe livré par votre générateur, Semence est la semence générée par votre téléphone lors de son initialisation, PIN est un pin choisit arbitrairement pour les tests et décalage est le décalage horaire entre les deux appareils, qui est de zéro si le serveur et le téléphone sont dans le même fuseau horaire.
Le script a besoin des droits d’écriture dans le dossier /var/motp c’est pour cela qu’on doit le lancer en root.

Soit ici par exemple:

sudo otpverify.sh test 64b63d 17dcfe83efc531b6 9999 0

Si tout s’est bien passé, alors le script devrait retourner un simple «ACCEPT»
Si «FAIL» est retourné, c’est que les horloges ne sont pas bien synchronisées, il faut donc mettre l’heure à jour en s’aidant par exemple d’un serveur de temps public.

Installation du serveur d’authentification.

Le script va venir s’interfacer avec un serveur d’authentification radius pour une grande flexibilité et afin de permettre d’utiliser l’authentification forte avec un grand nombre de logiciels sur le marché.
Le serveur radius retenu ici est XTRadius mais la procédure est très proche pour d’autres serveur radius du marché.

Pour installer le serveur radius, utilisez apt-get comme à l’accoutumée. Il est également possible de le télécharger et de le compiler depuis le site officiel.

Des fichiers de configurations tout prêts pour XTradius sont disponibles sur le site de motp, il suffit de les installer en entrant les commandes suivantes :

cd /etc/raddb
sudo wget http://motp.sourceforge.net/dictionary.motp
sudo wget http://motp.sourceforge.net/execparams
sudo mv execparams.1 execparams

Il faut également rajouter la référance au nouveau dictionnaire dans le fichier des dictionnaires : il suffit de rajouter «$INCLUDE dictionnary.motp» au fichier dictionary

sudo nano dictionary

Vous devez maintenant renseigner les utilisateurs, ainsi que leur PIN et leur semence dans le fichier users selon le modèle suivant:

Il suffit de mettre le nom d’utilisateur, son secret, de choisir son code PIN et de mettre l’offset en cas de décalage horaire.

A présent, démarrez le serveur radius en mode verbose à l’aide de la commande suivante :

sudo radiusd -sxxy

On peut à présent tester le serveur radius à l’aide de l’utilitaire radtest à lancer dans un autre terminal. Si tout s’est bien passé, le serveur doit répondre «ACCEPT»

Et le serveur devrait afficher les opérations suivantes :

Si le serveur renvoie un «FAIL», il est possible que vous avez atteint le maximum de tentatives de login, il vous faut supprimer le contenu du repertoire /var/motp/users

A noter : le testing123 est la clef de cryptage qui correspond au client d’ip 127.0.0.1
Il n’est pas nécéssaire de la changer car ici le client et le serveur étant sur la même machine, les communications passent en loopback et donc par un réseau de confiance. Si  vous souhaitez quand même changer cette clef ou accéder au serveur radius depuis une autre machine, les informations se trouvent dans le fichier clients du repertoire /etc/raddb.
Le serveur radius est à présent bien configuré, on peut passer à l’étape suivante : configurer PAM pour que l’authentification,  ssh ici, passe par le serveur radius.

Configurer PAM pour fonctionner avec radius.

PAM (Pluggable authentication modules) est, comme son nom le laisse entendre, un système de gestion de l’authentification d’un grand nombre d’OS open source, pouvant être utilisé par de nombreux services. Faire le lien entre PAM et radius nous permettra d’utiliser l’OTP pour l’authentification, aussi bien pour FTP que SSH.

Le module à installer est sobrement appelé pam_radius_auth.
Il est possible de télécharger le module sur internet, mais par chance il est également disponible dans les dépots d’ubuntu.

Pour l’installer, il faut utiliser le sempiternel apt-get :

sudo apt-get install libpam-radius-auth

Il y a un brin de configuration à faire, ca se passe dans /etc/pam_radius_auth.conf où il vous faudra écrire le secret du serveur radius, c’est à dire testing123 par défaut.

Ensuite, il vous faudra configurer le fichier de configuration pour le service que vous voulez utiliser avec OTP. Ces fichiers se situent dans /etc/pam.d/
Ici, nous allons modifier sshd qui gère SSH. Il faut commenter la ligne

@include common-auth

en rajoutant un # devant. Puis, il faut ajouter la ligne

auth required pam_radius_auth.so

au dessus ou au dessous de la ligne précédement commentée.
Ensuite, il vous suffit d’enregistrer le fichier.

Pour être sur que ssh utilise PAM, il faut modifier /etc/ssh/sshd_config qui n’est d’autre que le fichier de configuration du service ssh en changeant la directive «ChallengeResponseAuthentication» pour la passer à yes.

Ensuite, redémarrez le serveur ssh et le serveur radius.

Cet article a été publié dans Linux, Sécurité, Technique avec les mots-clefs , . Bookmarker le permalien. Laisser un commentaire ou faire un trackback : URL de trackback.

Un commentaire

  1. Fifi
    Publié le 11 mai 2016 à 17 h 53 min | Permalien

    Bonjour mrc bcp pour ce tutoriel, si vous pouvez m’aider concernant l’algorithme de hachage. J veux construire une app fonctionne comme cette article le décrit si vs pouvez bien sur merci j’attends votre réponse.

Laisser un commentaire

Votre e-mail ne sera jamais publié ni communiqué. Les champs obligatoires sont indiqués par *

*
*

Vous pouvez utiliser ces balises et attributs HTML <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>