Depuis longtemps, une partie de mon serveur web, servi par un apache 2.2, était protégée par une authentification de type basique dont la base d'utilisateurs se trouvent dans une table mysql. Lors de l'upgrade du serveur en Ubuntu 13.10, apache est passé de la version 2.2 à la version 2.4.
Et soudain, c'est le drame. De grands changements on eu lieu du côté des modules d'authentification en général et celui gérant les bases mysql comme base d'utilisateurs en particulier.
Création de la table d'utilisateur
Avant toute chose, il faut une table d'utilisateurs. Pour l'exercice, nous allons créer une base apache_auth
, créer un utilisateur mysql username
et son mot de passe password
pouvant lire le contenu des tables de cette base.
Puis créer la table utilisateurs
.
mysql> CREATE DATABASE apache_auth CHARACTER SET UTF8;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT SELECT ON apache_auth.* TO 'username'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> use apache_auth;
Database changed
mysql> 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;
Query OK, 0 rows affected (0.00 sec)
mysql> desc utilisateurs;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| login | varchar(255) | NO | PRI | NULL | |
| pass | varchar(255) | NO | | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql>
On peut ensuite y mettre un utilisateur pour apache dont le login est joe
et le mot de passe est jwja
.1 Les commandes de hachage mysql n'étant pas forcément bien compatible avec apache, on utilise htpasswd pour hacher le mot de passe.
$ mysql -u root -p -e "INSERT INTO utilisateurs (login, pass) VALUES (\"joe\",\"$(htpasswd -nb joe jwja |cut -d ':' -f 2)\")" apache_auth
Enter password:
$
et même vérifier le tout
$ mysql -u root -p -e "SELECT * FROM apache_auth.utilisateurs;"
Enter password:
+-------+---------------------------------------+
| login | pass |
+-------+---------------------------------------+
| joe | $apr1$7jO4MTja$pd2pAH6WkYfcyrzPhgLcX/ |
+-------+---------------------------------------+
$
et voilà, nous sommes prêts
Configuration avec apache 2.2 et le mod_auth_mysql
Sous Ubuntu 13.04 (en apache 2.2 donc), voici quelle était ma configuration :
Dans la directive <Directory>
d'apache, simplement un
AllowOverride AuthConfig
Puis dans le .htaccess du répertoire, ceci :
AuthType Basic
AuthName "mon super espace protégé"
AuthBasicAuthoritative off
AuthMySQLAuthoritative on
AuthMYSQLEnable on
AuthMySQLHost localhost
AuthMySQLUser username
AuthMySQLPassword password
AuthMySQLDB apache_auth
AuthMySQLUserTable utilisateurs
AuthMySQLNameField login
AuthMySQLPasswordField pass
AuthMySQLPwEncryption md5
Require valid-user
<LIMIT GET POST PUT>
require valid-user
</LIMIT>
Bien sûr, un petit coup de a2enmod auth_mysql
était nécessaire.
That's all.
Configuration avec apache 2.4 et le mod_authn_dbd
Là, ça se corse.
Dans le <VirtualHost>
il faut définir les paramètres du driver sql :
DBDriver mysql
DBDParams "socket=/var/run/mysqld/mysqld.sock dbname=apache_auth user=username pass=password"
DBDMin 4
DBDKeep 8
DBDMax 20
DBDExptime 300
Puis dans le <Directory>
ajouter :
AuthName "mon super espace protégé"
AuthType Basic
AuthBasicProvider dbd
# Requete SQL pour l'authentification
AuthDBDUserPWQuery "SELECT pass FROM utilisateurs WHERE login = %s"
Require valid-user
Je n'ai pas creusé davantage pour déporter les directives dans le .htaccess, mais la définition du driver mysql ne me semble pas pouvoir se déporter facilement de cette manière (disons que je n'ai pas trouvé du premier coup et que je n'avais pas le temps de débugguer).
-
Joe utilise un mot de passe faible créé à partir de l'initiale du prénom des 4 frères, les 3 autres étant William, Jack et Averell. Dans la vraie vie, le mot de passe ressemblerait plus à ceci :
d3F@j5(éF(c54)+F'Dfc23
↩
Comments
comments powered by Disqus