5/25/2011

HOW TO : Intégrer une authentification forte par OTP dans PhpMyAdmin

Ce billet vise à expliquer comment personnaliser la phase d’authentification de PhpMyAdmin. Pour cela, il décrit brièvement les modes d’authentification actuels disponibles ainsi que comment intégrer sa propre solution. Ceci est illustré par l’implémentation d’une authentification par OTP via la classe PHP de M. André Liechti.

Rappel sur les modes d’authentification existants

PhpMyAdmin met à disposition quatre modes d’authentification : config, cookie, http, signon. Le mode choisi est transmis via la ligne :

$cfg['Servers'][$i]['auth_type']=’modechoisi’;

du fichier config.inc.php

Ensuite, pour réaliser l’authentification correspondante, le fichier nommé modechoisi.auth.lib.php sera chargé.
Vous trouverez ci-après un bref récapitulatif des différents modes d’authentification fournis par PhpMyAdmin.

- Le mode config


Il consiste à entrer le login et mot de passe pour se connecter à la base de données en clair dans le fichier config.inc.php. Autrement dit, il faut éditer le fichier de la façon suivante :

$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = 'root_password';

Ce mode permet de se passer d’authentification puisque les informations sont disponibles dans le fichier config.inc.php. D’un point de vue sécurité, ce mode est déconseillé sauf si vous faites intervenir une solide couche de sécurité annexe. A titre d’exemple, on peut citer le module d’authentification forte OpenID. Pour d'avantage d’information sur l’intégration de la solution OpenID : http://wiki.openid.net/w/page/12995176/Libraries.

- Le mode cookie

Il consiste en l’affichage d’une mire de login sur le navigateur de l’utilisateur. Celle–ci demande le login/password de l’utilisateur enregistré dans la base de données. Les données sont chiffrées dans un cookie par l’algorithme Blowfish. La clé de chiffrement est fournie par l’utilisateur par la ligne :
$cfg[‘blowfish_secret’]=’your_blowfish_secret’;
Il s’agit du mode le plus sécurisé fourni par PhpMyAdmin.

- Le mode http

Il est semblable au mode cookie dans le sens ou une authentification par login/mdp est demandée. Par contre, les données sont demandées à l’utilisateur par l’intermédiaire d’un pop-up.

- Le mode Signon

Ce mode permet de faire du SSO. Il récupère les identifiants utilisés lors de l’authentification effectuée par une autre application. Un exemple classique est l’utilisation jumelée MySQL-LDAP.

Créer votre propre mode d’authentification forte


- Pré-requis


Dans un premier temps, vous devez récupérer une version de votre mode d’authentification exploitable par PhpMyAdmin, classiquement du php/javascript ou encore développer à la main votre propre mode d’authentification.

- Structure


Dans un deuxième temps, vous devez créer un fichier nommé votre_mode_dauthentification.auth.lib.php (situé dans le répertoire libraries/auth de PhpMyAdmin) dans lequel figureront les fonctions nécessaires à la connexion avec la base de données.

PMA_auth() : elle gère l’affichage du formulaire d’authentification.
PMA_auth_check() : elle gère les options d’authentifications avancées.
PMA_auth_set_user() : elle envoie les données entrées par l’utilisateur après vérification de la bonne forme de celles-ci.
PMA_auth_fails() : elle gère le message d’affichage lors de l’échec de l’authentification.


Pour la bonne continuité du processus, ces fonctions étant booléennes, elles doivent au minimum contenir l’instruction return true;

- Contenu


Dans un troisième temps, vous allez déterminer quel mode déjà existant se rapproche le plus de votre projet. Concrètement, posez-vous des questions du type :
-Vais-je demander des informations à l’utilisateur ? (mode http ou cookie)
-Délayais-je l’authentification à un module annexe ? (mode config/signon suivant la nature du module)
Etc
Dans le cadre d’une authentification forte, il y a de grandes chances que ce soit le mode cookie que vous adoptiez, de ce fait, nous allons nous pencher sur cet exemple.

Exemple : Authentification forte par One Time Password


- Pré-requis OTP


Pour réaliser cette authentification forte, nous avons utilisé la classe Open Source motp de André Liechti (téléchargement et informations complémentaires sur le site : http://developer.sysco.ch/multiotp/) ainsi que le mode d’authentification cookie.
Pour plus de convivialité, nous avons ajouté un champ à la mire de login, afin d’obtenir trois champs : Username/PinCode/TokenCode.

Résultat

Si vous ajoutez un champ comme ci-dessus, rendez-vous dans le fichier common.inc.php à la ligne concernant le tableau $allow_list et ajoutez le nom de votre champs.
Dans notre cas, cela donnera :
$allow_list = array(
/* needed for direct access, see FAQ 1.34
* also, server needed for cookie login screen (multi-server)
*/
'server', 'db', 'table', 'target',
/* to change the language on login screen or main page */
'lang',
/* Session ID */
'phpMyAdmin',
/* Cookie preferences */
'pma_lang', 'pma_charset', 'pma_collation_connection',
/* Possible login form */
'pma_servername', 'pma_username', 'pma_password', ‘pma_otp’,
);

Si le champ n’est pas ajouté comme si dessus, le contenu de la variable sera effacée et donc inutilisable.

Ensuite, nous allons apposer notre condition : le PinCode et le TokenCode entrés par l’utilisateur doivent correspondre avec les données (PinCode + Seed du token) enregistrées. Pour cela, nous appelons une fonction booléenne, contenue dans la classe motp utilisée, qui vérifiera cela pour nous. L’endroit de vérification de notre condition est juste après la vérification que le mot de passe n’est pas vide (correspondant à notre deuxième champs : le PinCode).

if (! empty($_REQUEST['pma_username'])) {
// The user just logged in
$GLOBALS['PHP_AUTH_USER'] = $_REQUEST['pma_username'];
// we combine both OTP + PIN code for the token verification
$GLOBALS['PHP_AUTH_PW']= empty($_REQUEST['pma_password']) ? '' :
$_REQUEST['pma _password'];
$fooOtp= empty($_REQUEST['pma_otp']) ? '' : $_REQUEST['pma_otp'];

// OTP CHECK
require_once('./libraries/multiotp.class.php');
$multiotp= new Multiotp();
$multiotp->SetUser($GLOBALS['PHP_AUTH_USER']);
$multiotp->SetEncryptionKey ('DefaultCli EncryptionKey');
$multiotp->SetUsersFolder('./libraries/users/');
$multiotp->SetLogFolder('./libraries/log/');
$multiotp->EnableVerboseLog();
$otpCheckResult=$multiotp->CheckToken($GLOBALS ['PHP_AUTH_PW'].''
.$fooOtp);

if($otpCheckResult== 0)
return true;
else
die("auth failed.");
}

Le code source de PhpMyAdmin étant désormais modifié, il convient de créer un compte MySQL basic de type Username/Password qui correspondra au Username/Pincode de notre exemple avec les droits que vous souhaitez lui octroyer.
Toujours dans notre exemple, nous importons les utilisateurs associés au mode d’authentification forte motp (cf. HOW TO motp).

Dès lors, vous pouvez tester votre magnifique authentification forte de PhpMyAdmin, enjoy ;) .

Anne Gosselin / MARET Consulting

Anexe:

HOW TO : Utiliser la classe MOTP.php


Ce tutorial explique comment utiliser la classe MOTP.php de M. André Liechti. En effet, après avoir téléchargé les différents fichiers disponibles sur le site : http://developer.sysco.ch/multiotp/, et s’être procuré un token (Hardware ou Software), voici la marche à suivre pour pouvoir l’utiliser. Il faut tout d’abord importer le "seed", créer son utilisateur et synchroniser le token afin de pouvoir s’authentifier fortement avec.


1 Importer le seed à partir d’un fichier .xml


multiotp –log –debug –import-xml filename.xml


2 Créer un utilisateur

2.1 par rapport au token-id

multiotp –debug –create –token-id –prefix-pin username tokenid pincode

2.2 par rapport au seed

multiotp -log -create -prefix-pin username OTPtype seed pincode D I

OTPType : HOTP, TOTP,…
D: nombre de digit (par défaut et habituellement 6)
I : Pour motp, TOTP : intervalle de temps séparant deux tokencodes (en secondes).
Pour HOTP : position du prochain évènement attendu.

3 Synchronisation du token (nécessaire après l’enregistrement de l’utilisateur)

multiotp –log –resync username pincode+tokencoden°1 pincode+tokencoden°2

4 Test de l'Authentification forte par OTP

multiotp -debug username pincode+tokencode

Aucun commentaire: