Sécurité phpMyAdmin : Le B.A.-BA
Faire le ménage
La première chose à faire après l'installation de phpMyAdmin est de supprimer le dossier contenant les fichiers utilisés lors de l'installation initiale de phpMyAdmin.
Ce dossier contient en effet certains fichiers sensibles qui font régulièrement l'objet de tentatives d'accès douteuses ; et dans la mesure où ils ne seront probablement plus jamais utilisés, il vaut mieux les supprimer :
# rm -rf /usr/share/phpmyadmin/setup
En complément de cette action, vous devez modifier la configuration d'Apache concernant phpMyadmin afin de commenter ou de supprimer les lignes concernant le dossier setup/ (elles ne sont plus utiles) :
# nano /etc/phpmyadmin/apache.conf
Dans ce fichier, commentez avec un # en début de ligne, ou supprimez les lignes suivantes :
#...
# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
<IfModule mod_authn_file.c>
AuthType Basic
AuthName "phpMyAdmin Setup"
AuthUserFile /etc/phpmyadmin/htpasswd.setup
</IfModule>
Require valid-user
</Directory>
#...
<Directory /usr/share/phpmyadmin/setup/lib>
Order Deny,Allow
Deny from All
</Directory>
#...
Vous pouvez également supprimer le fichier /etc/phpmyadmin/htpasswd.setup qui est devenu inutile :
# rm /etc/phpmyadmin/htpasswd.setup
Rechargez enfin la configuration d'Apache afin que les modifications soient prises en compte :
# /etc/init.d/apache2 reload
Cacher phpMyAdmin
L'accès à l'interface Web de phpMyAdmin se fait par défaut via une URL du type : http//www.monsite.com/phpmyadmin/. C'est pratique, standard et facilement mémorisable, mais ça donne aussi l'opportunité à tous les script kiddies de la planète de saccager votre travail en utilisant des failles de phpMyAdmin.
Voyons comment nous pouvons brouiller les pistes...
Modifier l'URL de base
Une parade simple et peu coûteuse est de modifier l'alias de base de phpMyAdmin. Cette modification s'effectue dans le fichier de configuration Apache 2 dédié :
# nano /etc/phpmyadmin/apache.conf
Dans ce fichier, il suffit simplement de remplacer la directive :
#...
Alias /phpmyadmin /usr/share/phpmyadmin
#...
par quelque chose du genre :
#...
Alias /mon_phpmyadmin /usr/share/phpmyadmin
#...
Il faut ensuite recharger la configuration d'Apache afin que les modifications soient prises en compte :
# /etc/init.d/apache2 reload
PhpMyAdmin devrait maintenant être disponible sur une URL du type : http//www.monsite.com/mon_phpmyadmin/
Créer un sous domaine
Une autre solution pour "cacher" phpMyAdmin des yeux du reste du monde est d'utiliser un sous-domaine, l'idée étant encore une fois de modifier l'URL d'accès par défaut à phpMyAdmin.
Prérequis
Pour mettre en oeuvre cette solution vous devez préalablement :
- disposer d'un nom de domaine,
- avoir accès à la configuration des zones DNS de ce domaine,
- ajouter un enregistrement CNAME à votre zone DNS afin de créer une nouvelle adresse du genre : phpmyadmin.mondomaine.com
Modification de la configuration de base
Concernant la configuration d'Apache, il faut dans un premier temps éditer le fichier de configuration Apache pour phpMyAdmin afin d'y commenter l'ensemble des directives relatives à phpMyAdmin :
# nano /etc/phpmyadmin/apache.conf
Dans ce fichier, commenter avec un # en début de ligne, ou supprimez les lignes suivantes :
#...
Alias /phpmyadmin /usr/share/phpmyadmin
<Directory /usr/share/phpmyadmin>
Options FollowSymLinks
DirectoryIndex index.php
<IfModule mod_php5.c>
AddType application/x-httpd-php .php
php_flag magic_quotes_gpc Off
php_flag track_vars On
php_flag register_globals Off
php_admin_flag allow_url_fopen Off
php_value include_path .
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmi$
</IfModule>
</Directory>
#...
# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/libraries>
Order Deny,Allow
Deny from All
</Directory>
#...
Remarque : à ce stade, si vous avez bien suivi et si vous avez déjà modifié votre fichier de configuration phpMyAdmin-Apache de base afin d'y supprimer/commenter les directives concernant le dossier setup/, ce fichier de configuration se retrouve soit entièrement vide, soit entièrement commenté.
Ajout du nouveau VirtualHost
Rien de plus simple, il suffit de créer un fichier de configuration Apache :
# nano /etc/apache2/sites-available/phpmyadmin.mondomaine.com
et d'y inscrire les directives suivantes (remplacez les {...} par vos valeurs personnalisée):
<VirtualHost *:80>
ServerAdmin {administrateur@mondomaine.com}
ServerName {phpmyadmin.mondomaine.com}
LogLevel warn
DirectoryIndex index.php
</VirtualHost>
<Directory /usr/share/phpmyadmin>
Options FollowSymLinks
<IfModule mod_php5.c>
AddType application/x-httpd-php .php
php_flag magic_quotes_gpc Off
php_flag track_vars On
php_flag register_globals Off
php_admin_flag allow_url_fopen Off
php_value include_path .
php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmi$
</IfModule>
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
Order Deny,Allow
Deny from All
</Directory>
Une fois le fichier sauvegardé, il faut qu'Apache recharge sa configuration :
# apache2ctl configtest
# a2ensite mysql.mon-domaine.com
# /etc/init.d/apache2 reload
Note : la première commande vérifie la syntaxe des fichiers de configuration Apache, la seconde active le site demandé (création du lien symbolique dans /etc/apache2/sites-enabled/), et la troisième force Apache à recharger sa configuration.
Interdire la connexion root
Selon votre version de PHPMyAdmin, il se peut que par défaut l'utilisateur root soit autorisé à se connecter à l'interface, ce qui n'est pas une très bonne idée. Nous allons donc procéder à quelques ajustements afin de corriger ceci.
Restreindre l'accès root
La directive de configuration qui permet d'interdire l'accès de root à phpMyAdmin est AllowRoot. Elle doit être déclarée dans le bloc d'instructions de la condition if(!empty($dbname)) du fichier de configuration /etc/phpmyadmin/config.inc.php :
# nano /etc/phpmyadmin/config.inc.php
//...
/* Configure according to dbconfig-common if enabled */
if (!empty($dbname)) {
//...
/* Optional: Advanced phpMyAdmin features */
//...
$cfg['Servers'][$i]['AllowRoot'] = FALSE;
//...
/* Advance to next server for rest of config */
$i++;
}
//...
Voilà, à partir de maintenant root ne peut plus se connecter à votre instance de phpMyAdmin.
Renommer le root MySQL
Une des premières choses à faire lorsqu'on installe une instance de MySQL, c'est de renommer le compte de l'utilisateur root afin de s'immuniser contre certains type d'attaques.