Avant de commencer, il y a un dossier de configuration présent dans le dossier de phpMyAdmin que vous pouvez supprimer sans crainte si votre installation fonctionne correctement. Il
s’agit de /usr/share/phpmyadmin/setup :
sudo rm -rf /usr/share/phpmyadmin/setup
Nous pouvons maintenant passer à la suite 🙂
Vous pouvez protègé l’acces simplement via des restrictions IP ou FQDN à votre phpmyadmin. Rendez-vous dans le fichier de conf qui se trouve ici : /etc/phpmyadmin/apache.conf . A partir de là vous pouvez insérer le code suivant :
<RequireAll>
Require all granted
Require not ip 10.252.46.165
</RequireAll>
Vous pouvez changer les valeur de Require en fonction de vos besoins voir ICI.
Pour ma part, j’ai autoriser toutes les IP privées et les VPN en bloquant certaine IP (dont celle de mon reverse) ce qui donne :
<RequireAll>
require ip 192.168.0.0/16
require ip 10.0.0.0/8
require not ip 192.168.1.200
</RequireAll>
Modifier l’url d’accès de phpMyAdmin
Petit bonus, je vous montrerai aussi comment forcer l’utilisation de HTTPS afin d’éviter d’échanger nos login / mots de passe en clair.
MODIFIER L’ADRESSE PAR DÉFAUT
La première chose à faire dans cette étape, est de désactiver l’accès via l’url par défaut. Il faut en fait ouvrir le fichier /etc/phpmyadmin/apache.conf et commenter la ligne suivante :
Alias /phpmyadmin /usr/share/phpmyadmin
devient :
#Alias /phpmyadmin /usr/share/phpmyadmin
CRÉATION DU NOUVEL ACCÈS
Je tourne sous Apache2, nous allons donc créer un nouveau virtual host afin d’avoir accès à la page de connexion. Je vous propose d’utiliser le sous-domaine mysql.mon-domaine.com. Ça reste facile à retenir et difficilement détectable pour un bot qui chercherait à nous attaquer.
Il suffit de créer le fichier /etc/apache2/sites-available/mysql.mon-domaine.com suivant :
Rien de plus compliqué ! Vous pouvez maintenant vérifier la configuration, activer le site et recharger Apache :
sudo apache2ctl configtest sudo a2ensite mysql.mon-domaine.com sudo service apache2 reload
Vous pouvez maintenant accéder à phpMyAdmin uniquement via mysql.mon-domaine.com !
FORCER L’UTILISATION DE HTTPS
- En mode auto-signé
Maintenant que nous avons une belle url, il serait intéressant de forcer l’utilisation de SSL afin de chiffrer notre connexion, évitant ainsi l’envoi de mot de passe en clair. Comme je suppose que nous partons de zéro, nous allons générer une clé vérifiée par un certificat auto-signé.
Nous allons utiliser le moddule SSL d’Apache, et le paquet OpenSSL pour la génération du certificat. Vérifiez que tout ceci soit correctement installé :
sudo a2enmod ssl sudo service apache2 restart sudo apt-get install openssl
Générons notre certificat :
cd /tmp openssl genrsa -des3 -out server.key 2048 openssl req -new -key server.key -out server.csr cp server.key server.key.org openssl rsa -in server.key.org -out server.key openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt mkdir /etc/apache2/certificate cp server.crt server.key /etc/apache2/certificate
Remarquez que nous les plaçons notre clé et notre certificat dans /etc/apache2/certificate, mais vous pouvez très bien le placer ailleurs. De plus, j’ai utilisé server.key, server.csr… pour des raisons de simplicité, mais vous pouvez les nommer comme vous voulez… (mysql.mon-domaine.com.key par exemple).
Je ne détaille pas toutes les commandes mais si vous avez des questions les commentaires sont là pour ça !
Nous allons maintenant modifier le vhost préalablement créé afin de forcer l’utilisation de HTTPS. Mais d’abord, vérifions qu’Apache écoute bien le port 443 (qui correspond à HTTPS). Votre fichier /etc/apache2/ports.conf doit ressembler à ça :
NameVirtualHost *:80 NameVirtualHost *:443 Listen 80 <IfModule ssl_module> Listen 443 </IfModule>
Et votre vhost, modifié comme suit :
<VirtualHost *:80> # Configuration de l'addresse ServerAdmin admin@mon-domaine.com ServerName mysql.mon-domaine.com DocumentRoot /usr/share/phpmyadmin/ # Redirection vers HTTPS RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R=301] </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> # Configuration de l'addresse ServerAdmin admin@mon-domaine.com ServerName mysql.mon-domaine.com DocumentRoot /usr/share/phpmyadmin/ # Personnalisation des logs TransferLog /var/log/apache2/phpmyadmin-access.log ErrorLog /var/log/apache2/phpmyadmin-error.log # Utilisation de la clé et du certificat SSLEngine on SSLCertificateFile /etc/apache2/certificate/server.crt SSLCertificateKeyFile /etc/apache2/certificate/server.key SSLProxyEngine on </VirtualHost> </IfModule>
Là encore si vous avez des questions n’hésitez pas
Un petit rechargement d’Apache et tout devrait être bon !
sudo service apache2 reload
Maintenant, si vous accédez à http://mysql.mon-domaine.com, vous serez redirigé vers https://mysql.mon-domaine.com. Comme nous avons utilisé un certificat auto-signé et que votre navigateur ne connaît pas votre autorité (vous…), vous aurez un message de ce type :
Mais non pas de panique, il suffit simplement d’ajouter une exception. Nous n’allons pas dépenser de l’argent pour faire signer notre certificat par une autorité connue. Comme c’est phpMyAdmin, ça reste du privé, et l’essentiel ici est d’avoir du chiffrement.
Vous voilà maintenant avec un phpMyAdmin un peu plus sécurisé que par défaut, et surtout mieux caché du regard des bots qui recherchent sans cesse une cible à attaquer, ou brute forcer.
- Avec let’s Encrypt
Vous trouverez sur cette page tous ce que vous aurez besoin pour générer vos certificats SSL et les remplacer comme ci-dessus dans votre vhost.