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).


  1. 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