Sur un serveur web utilisant MySQL ou MariaDB, PhpMyadmin est l’application web la plus simple et pratique pour gérer les bases de données. Son principal problème est justement d’être tellement populaire qu’il devient une cible de choix pour les tentatives de piratage. Une solution pour éviter de l’exposer à "tous les vents" de l’internet consiste à restreindre son accès aux utilisateurs ayant une connexion SSH sur le serveur (connexion SSH en mode clé publique/clé privée uniquement bien sûr...).
Pour cela on va utiliser un tunnel SSH qui va transmettre via SSH une connexion locale (sur le port 9050 à titre d’exemple) vers le port 80 du serveur. Ce tunnel permet donc de solliciter le serveur web comme si la requête était faite en local. Une fois le fonctionnement du tunnel vérifié, il suffira de restreindre l’accès au phpmyadmin aux connexion locales, en modifiant la configuration de son vhost apache, pour qu’il ne soit plus possible d’utiliser PhpMyadmin sans passer par le tunnel.
Ce tutoriel suppose :
- que vous avez un serveur web avec Apache + MySQL/MariaDB opérationnel. Ici on traitera la cas d’un Linux Debian 10 "de base".
- que PhpMyadmin est installé de façon standard (via les paquets deb par exemple) et disponible sur l’URL https://mon-domaine.tld/phpmyadmin
- que vous disposez d’un accès SSH sur le serveur web avec le sudo.
On prendra ici comme exemple un compte toto avec une connexion "classique" (port 22, clé privée id_rsa sous Linux/MacOS ou clé id_rsa.ppk sous Windows + Putty) : la connexion sous Linux/MacOS se fait donc avec la commande :- ssh -i ~/.ssh/id_rsa toto@mon-domaine.tld
ou avec Putty :
1. Ouvrir le tunnel SSH :
Pour établir le tunnel on ouvre la connexion en précisant que l’on va faire une redirection du port 9050 de notre machine vers le port 80 du serveur sur son adresse IP locale c’est à dire 127.0.0.1 ou localhost.
Avec un terminal Linux/MacOS (bash ou Zsh) cela donne :
- ssh -L 9050:127.0.0.1:80 -i ~/.ssh/id_rsa toto@mon-domaine.tld
Avec Putty on configure le tunnel dans le sous-menu Connection > SSH > Tunnels :
NB : bien évidemment il faut que la connexion SSH reste ouverte tout le temps où l’on utilise le tunnel...
2. Se connecter via le tunnel :
Une fois la connexion établie on peut alors utiliser le tunnel via son navigateur en se rendant sur l’URL locale http://localhost:9050/phpmyadmin
En principe on doit arriver sur le PhpMyadmin du serveur distant :
3. Interdire les accès "externes" au PhpMyadmin :
Une fois que l’on est certain que le tunnel fonctionne, il ne reste qu’a interdire les accès autres que depuis la machine locale (i.e. via le tunnel) au PhpMyadmin. Pour cela on va ajouter une option de configuration d’apache pour le dossier qui héberge l’application PhpMyadmin :
- dans /etc/apache/conf-available on crée un nouveau fichier phpmyadmin-secure.conf dans lequel on met une directive Directory de la forme :
- <Directory /var/www/mon-domaine.tld/html/phpmyadmin>
- Require local
- </Directory>
pour un phpmyadmin installé dans /var/www/mon-domaine.tld/html/phpmyadmin (à adapter en fonction de la configuration du serveur bien sûr...)
- on active cette option de configuration avec la commande apache :
- a2enconf phpmyadmin-secure
- ...et pour éviter les mauvaises surprises on teste que tout est OK :
- apachectl configtest
- si le retour est OK, on peut recharger la configuration d’apache pour faire prendre en compte cette modification :
- systemctl reload apache2.service
A partir de là, la connexion "directe" via https://mon-domaine.tld/phpmyadmin doit retourner Forbidden (et si on veut améliorer la dissimulation du PhpMyadmin sur cette machine on peut même envisager une Rewrite Rule qui renvoie phpmyadmin en 404)