Openstuff Wiki : OTP

HomePage :: Categories :: PageIndex :: RecentChanges :: RecentlyCommented :: Login/Register

Mise en pratique d'OTP


L'idée de cet article est de découvrir rapidement un exemple d'utilisation d'OTP. Après en avoir rappelé les principes, nous installerons un client et un serveur. Pour terminer, nous développerons un petit script Perl permettant de voir un exemple d'utilisation concret.

1. Principe


One Time Password (OTP) est un système qui permet d'utiliser des mots de passe différents à chaque nouvelle connexion. Voici comment cela fonctionne:

Ceci implique donc un secret partagé entre le serveur et le client. L'avantage de ce système et qu'il est insensible au rejeu: si une personne intercepte le résultat, il ne pourra pas l'utiliser, ce dernier étant valide qu'une seule fois. Par contre, il est toujours possible pour l'attaquant de brute forcer le mot de passe si celui-ci intercepte à la fois le challenge et le résultat.

Pour terminer, on estime OTP comme étant un système à deux facteurs d'authentification (two-factor authentication). Il se base sur quelque chose que l'on connait (le password) et quelque chose que l'on possède (le logiciel ou le composant physique).

Pour plus d'information sur OTP, se référer à http://www.deer-run.com/~hal/ns2000/otp.pdf

2. Installation des outils


Nous allons considérer deux entités: la partie cliente (votre poste de bureautique) et la partie serveur (la machine finale). L'installation sous Linux Debian se fait de la façon suivante:

Serveur:
# apt-get install opie-server


Client:
$ sudo apt-get install opie-client 


3. Initialisation des mots de passe


Une fois la partie logicielle installée, il va falloir la paramétrer en définissant un utilisateur avec un mot de passe partagé:

Sur le serveur:
# opiepasswd jstankiewicz -n 99
Updating jstankiewicz:
You need the response from an OTP generator.
New secret pass phrase:
	    otp-md5 99 te6984
	    Response: 

L'option -n définis le nombre de login autorisés avant que le secret ne doive être réinitialisé.

Ici, nous allons aller sur le client et rentrer le challenge proposé:
opiekey 99 te6984
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: 
AHEM ATOM SALE ARC LAP WIFE


Nous collons la réponse sur le serveur:
	    Response: AHEM ATOM SALE ARC LAP WIFE

ID jstankiewicz OTP key is 99 te6984
AHEM ATOM SALE ARC LAP WIFE


Ceci a permis de créer l'utilisateur jstankiewicz et de définir son mot de passe associé. Le fichier opiekeys sur le serveur contient justement les informations sur les utilisateurs permettant d'authentifier ceux-ci:
# cat /etc/opiekeys 
jstankiewicz 0099 te6984           4989df57818233f7  Dec 05,2007 13:29:33

Voici l'explication des différents champs:

Pour information, la commande opieinfo permet d'extraire le numéro de séquence ainsi que la graine pour le futur challenge:
# opieinfo jstankiewicz
98 te6984


4. Développement d'un outil d'authentification en Perl


Nous allons coder un script perl qui permet de s'authentifier. Celui est un exemple brut qui pourrait par exemple être utilisé pour un service Web. Pour cela nous allons utiliser le module Perl
Authen::OPIE. Celui n'est malheureusement pas packagé sous Debian, donc c'est parti pour une installation à la main.

4.1 Installation du module Perl Authen::OPIE


Récupération du tar.gz et compilation:
# apt-get install libopie-dev
# wget "http://search.cpan.org/CPAN/authors/id/E/EE/EESTABROO/Authen-OPIE-1.00.tar.gz"
# tar zxvf Authen-OPIE-1.00.tar.gz
Authen-OPIE-1.00/
Authen-OPIE-1.00/OPIE.xs
Authen-OPIE-1.00/Makefile.PL
Authen-OPIE-1.00/Changes
Authen-OPIE-1.00/OPIE.pm
Authen-OPIE-1.00/MANIFEST
Authen-OPIE-1.00/test.pl
# cd Authen-OPIE-1.00/
# perl Makefile.PL 
Writing Makefile for Authen::OPIE
# make
[...]
# make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl
1..1
OPIE must be set up on your box in order for this test to work
You must be root in order to use the OPIE module (as root is the only one with permissions on the opiekey file)
ok 1
Login to test: jstankiewicz
I challenge you [jstankiewicz]: otp-md5 98 te6984 ext
your response? NAT WAIL BRIM WING WIFE CAP
ok 3: response was verified (you passed)
# make install
[...]


Ici pour le make test nous utilisons l'utilisateur précédemment créé, et fournissons le résultat du challenge en utilisant le client:
$ opiekey 98 te6984
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: 
NAT WAIL BRIM WING WIFE CAP


4.2 Création du script réalisant l'authentification


Voici le script:
#!/usr/bin/perl -w

use strict;
use Authen::OPIE qw(opie_challenge opie_verify);

# Get user name
print "user:";
my $user= <STDIN>;
chomp($user);

# Create a challenge
my $opiechalstr = opie_challenge($user);
die "Unknown OPIE user: $user\n" if (not defined $opiechalstr);

my @opiechalarr=split(/ /, $opiechalstr);
die "Unknown challenge type: $opiechalstr\n" if ($opiechalarr[0] ne "otp-md5");

print "sequence: ",$opiechalarr[1],"\n";
print "seed: ",$opiechalarr[2],"\n";

# Verify the challenge
print "response:";
my $response = <STDIN>;
chomp($response);

print "Empty response" if (not defined $response or $response eq "");
my $verifyval = opie_verify($user,$response);

if (not defined $verifyval or $verifyval != 0) {
        die "Authentication FAILED\n";
}
else {
        print "Authentication SUCCEEDED\n";
}

exit 0;


L'utilisation est simple, voici ce qu'il se passe une fois lancé:

user:jstankiewic
Unknown OPIE user: jstankiewic


user:jstankiewicz
sequence: 97
seed: te6984
response:ROAR JEAN MUFF LYON HIDE BARK
Authentication SUCCEEDED


user:jstankiewicz
sequence: 96
seed: te6984
response:ROAR JEAN MUFF LYON HIDE BARK
Authentication FAILED


Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0958 seconds