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.
Ajouter un commentaire