Authentification Apache avec une table MySQL d’utilisateurs

Debian 6.0.1 Squeeze – Apache 2.2.16 – MySQL Server 5.1.49

Objectif : Réaliser l’authentification basique Apache pour un Webdav avec une base d’utilisateurs en MySQL, et le mot de passe stocké avec un cryptage non réversible dans la base. J’ai un peu galéré dans cette affaire, les infos qu’on trouve ne sont pas forcément d’actualité, voici donc un petit topo.

On commence par installer le paquet qui va bien pour qu’Apache puisse causer gentiment à MySQL via dbd :

aptitude install libaprutil1-dbd-mysql

Ensuite on active le module d’authentification dbd :

a2enmod authn_dbd
apache2ctl restart

Création de la base sous MySQL. Pour faire simple la table utilisateurs ne comprend que 2 champs, login et pass:

CREATE DATABASE mabase CHARACTER SET UTF8;
CREATE TABLE IF NOT EXISTS `utilisateurs` ( 
      `login` varchar(255) NOT NULL,  
      `pass` varchar(255) NOT NULL,  
      UNIQUE KEY `login` (`login`)) 
      ENGINE=MyISAM DEFAULT CHARSET=utf8;

Toujours sous MySQL on crée un utilisateur « apache » avec des droits limités à la table :

CREATE USER 'apache'@'localhost' IDENTIFIED BY  'secret';
GRANT SELECT ON  `mabase`.`utilisateurs` TO  'apache'@'localhost';

Ensuite on remplit la table MySQL et c’est là qu’il faut faire les bons choix pour le cryptage du mot de passe et ne pas se gourer. Apache reconnait 4 formats de mots de passe : PLAIN TEXT, CRYPT, SHA1 et MD5.
PLAIN TEXT est clairement à éviter, SHA1 et MD5 sont les plus robustes. Entre les deux SHA1 serait potentiellement le meilleur sauf que l’implémentation Apache est à priori faiblarde (pas de « grain de sel ») donc j’ai retenu MD5, mais ça reste un choix qu’on peut discuter le soir au coin du feu.

En tout cas, et quel que soit le cryptage choisi, la première chose à ne pas faire c’est d’utiliser les fonctions de cryptage de MySQL (password, MD5, SHA1), c’est complètement incompatible avec l’authentification Apache. Une fois qu’on a compris ça on a fait un grand pas!

On va donc générer en bash le hash MD5 du mot de passe avec l’utilitaire htpasswd fourni par Apache et l’enregistrer dans la base (la fonction htpasswd a surement été portée dans votre langage préféré).

Le cryptage est en MD5 par défaut, les options -n et -b permettent respectivement de rediriger le résultat vers la sortie standard et d’utiliser le mode batch :

mysql -u admin -p -e "INSERT INTO utilisateurs (login, pass) VALUES ( \
     "\""robert"\"", \
     "\""$(htpasswd -nb robert secret |cut -d ':' -f 2)"\"")" mabase

On met ensuite à jour le Virtual Host pour qu’Apache puisse aller chercher les infos d’identification dans la base :

<VirtualHost *:80>
	ServerName webdav.mondomaine.org
	DocumentRoot /var/www/webdav
	...
	DBDriver mysql
	DBDParams "socket=/var/run/mysqld/mysqld.sock dbname=mabase user=apache pass=secret"
	DBDMin  4
	DBDKeep 8
	DBDMax  20
	DBDExptime 300
	...
	<Directory /var/www/webdav>
		...
		AuthName "Webdav"
		AuthType Basic
		AuthBasicProvider dbd
		# Requete SQL pour l'authentification
		AuthDBDUserPWQuery "SELECT pass FROM utilisateurs WHERE login = %s" 
		Require valid-user
	</Directory>
	...
</VirtualHost>

et on redémarre Apache :

apache2ctl restart

Liens

Authentification, autorisation et contrôle d’accès
PHP : Comparaison MD5 / SHA-1

No votes yet.
Please wait...

Laisser une réponse