Sécuriser PhpMyAdmin sur Debian

Tout à commencé un jour où je m'ennuyais tellement que je me suis mis à lire les fichiers de logs de mes sites. J'ai été très surpris quand j'ai vu des centaines de lignes d'erreur essayant d'accéder à http://urldusite/phpmyadmin entre autre avec differentes orthographes et provenant de la même IPsur une plage de quelques minutes. Si un robot peut trouver l'adresse de PhpMyAdmin, il peut aussi lancer une attaque par force brut pour trouver le login et le mot de pass ou exploiter une faille dans l'appli s'il y en a une. J'ai donc entrepris de sécuriser un peu plus mon PhpMyAdmin et c'est le sujet de cet article, appliqué sur une configuration LAMP avec Debian Lenny.

1. SSL et alternative SSH

Bien entendu la première chose à faire est d'utiliser un certificat SSL, ceci évitera que le login et le mot de passe transitent en clair sur le réseau. Pour ma part je n'ai pas envie de payer un certificat SSL juste pour PhpMyAdmin, j'utilise donc un tunnel SSH entre mon serveur et mon navigateur. Les échanges entre le serveur et le navigateur étant crypté par le tunnel pas de soucis. Mais attention, cette solution n'est valable que si elle est toujours utilisée.

2. Controler l'url d'accès

Je déconseille vivement de faire un lien vers PhpMyAdmin dans /var/www comme le conseil beaucoup de tutoriel. Personnellement j'ai créé un sous domaine sur un de mes sites pour accéder à PhpMyAdmin. Bien sûr le sous domaine ne s'appelle pas phpmyadmin, ce serait trop simple pour les robots, il ne reste plus qu'à configurer un vhost.
L'erreur à ne pas commettre et de s'arreter là. Par défault PhpMyAdmin est accessible depuis l'url du premier vhost définit dans Apache via un alias créer dans la conf de PhpMyAdmin, il faut donc le désactiver.

Editons le fichier

 
> vim /etc/phpmyadmin/apache.conf

et désactivons l'alias en le commentant.

 
#Alias /phpmyadmin  /usr/share/phpmyadmin

 

Voilà maintenant PhpMyAdmin n'est accessible que via une url que vous connaissez et qui devrait être difficile à découvrir.
On pourrait s'arreter là, mais maintenant qu'on est lancé...

3. Setup de PhpMyAdmin et mot de passe.

Comme tous les outils 'pré-fabriqués', PhpMyAdmin est livré avec un module de configuration qui est accessible depuis l'url http://monsite/phpmyadmin/setup.  Dans la configuration apache livrée par défaut, ce dossier est protégé avec une authentification par htpassword sauf que le seul compte créé ne définit pas de mot de passe. L'idée est de remplacer le compte par un nouveau avec mot de passe et d'utiliser la config de base dans notre vhost.

Création d'un nouveau fichier htpassword avec login et mot de passe.

 
> htpasswd -c htpasswd.setup username

Bien sur il faut remplacer username par le nom d'utilisateur et spécifier un mot de passe à l'invité. Attention à l'option -c de la commande qui créer un nouveau fichier et donc écrase l'ancien.

En regardant dans le fichier /etc/phpmyadmin/apache.conf on peut voir une restriction d'accès sur le dossier setup. On va copier ces lignes de codes dans notre vhost et les appliquer au dossier phpmyadmin complet. Du coup il faudra taper 2 mot de passe, celui de l'authentification apache et celui de mysql pour accéder à 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_value include_path .
        </IfModule>
 
       <IfModule mod_authn_file.c>
                AuthType Basic
                AuthName "phpMyAdmin Setup"
                AuthUserFile /etc/phpmyadmin/htpasswd.setup
       </IfModule>
                Require valid-user
 
</Directory>
 

Si besoin il faut mettre à jour le chemin dans la balise Directory.

Parce qu'un copier/coller de plus ne coûte pas plus cher, nous allons aussi ajouter à notre vhost la suite de la config du fichier apache.conf de PhpMyAdmin

 
# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/libraries>
    Order Deny,Allow
    Deny from All
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
    Order Deny,Allow
    Deny from All
</Directory>
 

Les choses semblent un peu plus sécurisés, mais il faut taper 2 login / mot de pass ce qui est un peu contraignant et si une attaque par brute force (par exemple) marche sur le premier pourquoi ne marcherait elle pas sur le second? Sans  transition appliquons nous au dernier point:

4. Bannisement automatique

Chaque tentative infructueuse de connexion via l'authentification apache est logée. Avec cette info il est possible de bannir automatiquement les IP qui échouent trop souvent. Pour cela nous allons utilisé l'excellent logiciel fail2ban. Je vous conseille de l'installer si ce n'est pas déjà fait et au minimum de configurer la partir ssh

 
> aptitude install fail2ban

Fail2ban est livré avec plusieurs filtres en standard et celui qui nous interesse est le filtre apache-auth qui parse les fichiers de logs apache à la recherche d'echec d'authentification. Dans le vhost que j'utilise pour PhpMyAdmin j'ai volontairement configuré un fichier de logs séparé ce qui permet d'isoler les erreurs.
Ajoutez la configuration suivante au fichier /etc/fail2ban/jail.conf

 
[apache-phpmyadmin]
enabled = true
port    = http,https
filter  = apache-auth
logpath = /home/phpmyadmin/logs/error.log
maxretry = 3
 

Il ne reste plus qu'à redémarrer fail2ban:

 
> /etc/init.d/fail2ban restart

 

Et voilà, vous pouvez désactiver le mode parano. Vous avez désormais une instance de PhpMyAdmin que les robots vont mettre du temps à trouver et si vous êtes allés jusqu'au bout, votre accès est sécurisé par du SSL et un login/mot de pass sur lequel tourne fail2ban. Il n'y a pas de risque 0, mais plutôt que se casser les dents sur quelques choses de sécurisé je pense que les hackers (enfin la plus part) se tourneront vers un serveur plus accessible. Si vous le souhaitez on peut aller encore plus loin dans la config de PhpMyAdmin depuis son dossier setup comme interdire le login à root.

Il n'y aucun commentaire