Quelles méthodes pour protéger un accès PHPMyAdmin ?

closeCet article a été publié il y a 5 ans 4 mois 15 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Après avoir répondu à Korben et vu que j’ai pas le choix de rester collé dans un fauteuil à cause d’un pied cassé, je me suis dit que vous filer quelques pistes pour éviter les problèmes de sécurité avec PHPMyAdmin serait une bonne chose (et réutilisable pour d’autres besoins). Et non, le désinstaller ne fait pas nécessairement partie des solutions 🙂

Pour rappel, PHPMyAdmin est une interface d’administration pour serveurs MySQL/MariaDB écrite en PHP. Évidemment de par sa nature c’est un composant critique qu’il convient de protéger pour éviter de se faire pomper/corrompre ses données et/ou son site. En effet, ce n’est qu’une interface, et donc les utilisateurs sont ceux configurés au niveau du serveur de base de données. Toujours de par sa nature et aussi son âge, il a un historique fourni en matière de sécurité, la rançon du succès pourrait-on dire.

Les méthodes de protection sont nombreuses et sont parfois complémentaires, il n’est pas nécessaire de tout implémenter (surtout quand c’est redondant, on y viendra).

HTTPS obviously

Oui c’est une évidence pour beaucoup, mais dites vous que certaines boutiques en ligne continuent de vous faire naviguer sur leur site en HTTP (y compris la partie utilisateur), seul le paiement est en HTTPS, parce que souvent réalisé par un tiers. Ce point change car ces tiers imposent maintenant HTTPS pour les allers/retours, des outils de suivi comme Google Shopping l’imposent désormais, bref, si c’est pas encore déjà fait, que ça vous parait pas vital pour votre site, ça l’est pour phpmyadmin. Et si vous ne savez pas quel est l’intérêt, j’en ai parlé y’a pas si longtemps.

Une URL/URI non prévisible

N’importe quel administrateur système vous dira qu’il a déjà vu dans ses journaux de serveur web des tentatives d’accéder à des adresses comme /pma, /phpmyadmin, et d’autres variantes avec ou sans majuscules. Pour une bonne et simple raison, sur pas mal de tutos on rencontre ce genre d’installation. Également, sur certains outils d’hébergement web integrés, /phpmyadmin est un alias qui permet d’accéder à la base de données de l’abonnement. Utiliser une URI non prévisible évite donc aux scanners de découvrir facilement où se trouve l’outil.

Attention, si vous utilisez un sous-domaine spécifique, même en HTTPS avec SNI il passe en clair 😉

Des utilisateurs BDD restreints

Comme je l’ai dit, l’accès à la base se fait via les utilisateurs configurés sur le serveur bdd. En refouillant la doc de PHPMyAdmin (que je conseille évidemment), je n’ai pas trouvé de directive de restrictions d’utilisateurs, par contre, il est possible d’interdire la connexion à certaines bases de données. Avec un utilisateur associé qui n’a accès qu’à une base, et qu’on empêche la connexion à cette base, l’utilisateur ne sera pas autorisé à se connecter.

Au niveau de la configuration de PHPMyAdmin (config.inc.php), ça revient à configurer la variable $cfg[‘Servers’][$i][‘only_db’] qui contient la liste des bases autorisées (les autres étant interdites, ouais ça parait évident dit comme ça, mais sait-on jamais).

Ah et puis si vous ne comptez utiliser PHPMyAdmin que pour certaines opérations bien précises, il est possible de limiter les permissions de l’utilisateur, pensez-y 😉

HTTP Basic Auth

Le fameux « mot de passe htaccess » comme je l’entend trop souvent, qui n’a aucun sens si on utilise pas Apache comme serveur web de toute façon, demande de valider un couple utilisateur/mot de passe spécifique avant d’accéder à l’application (et son formulaire de connexion à la base de données). Ca fait deux identifiants à retenir, mais bon, ça fait déjà bien chier les brute force, alors autant ne pas se priver.

Pour la mies en place sur votre serveur web favori, je vous laisse chercher « http basic auth » sur votre moteur de recherche favori.

Filtrage IP

Moins facilement « bruteforçable » que le mot de passe, limiter l’accès à l’interface d’administration en fonction de l’adresse IP de la connexion de l’utilisateur est aussi simple à mettre en place que le mot de passe, mais demande par contre que l’utilisateur en question utilise toujours la même adresse IP ou une plage d’adresse connue et le plus restreinte possible.

Je dis ça car au taf où l’on nous a déjà demandé de faire du filtrage IP pour certains clients, on a déjà rencontré des utlisateurs de Zscaler, dont un des services est de « randomiser » l’adresse IP de sortie web de l’utilisateur, dans des plages salement larges (/22, /21), plages partagées entre plusieurs clients, en gros c’est très chiant.

Si vous voulez coupler le filtrage IP au mot de passe, j’ai déjà écrit un truc là-dessus à une époque, vous pouvez donc vous baser dessus c’est encore d’actualité.

X509 Client Certificate

Arme ultime, en plus du certificat X509 du serveur pour la connexion HTTPS, vous pouvez demander à votre serveur web de paramétrer la vérification d’un certificat client. Djerfy l’a mis en place et détaillé pour l’accès à l’administration de son WordPress, c’est évidemment adaptable pour votre installation de PHPMyAdmin.

Avec ça, si on a pas l’ordinateur qui dispose du certificat, c’est foutu. Alors certes ça n’empêche pas la possibilité de se faire dérober ledit certificat, mais c’est assez puissant, surtout une fois installé l’utilisateur n’a plus à s’en soucier (jusqu’à l’expiration du certificat, vous êtes seul juge de sa durée de vie quand vous le générez).

Pas de PHPMyAdmin ?

Allez, troll de fin, pour ne pas avoir un problème avec le logiciel, le mieux est encore de ne pas l’installer. Blague récurrente dans le domaine de la sécurité informatique, qui va jusqu’à « pour ne pas avoir de problème avec son ordinateur, le mieux c’est de ne pas l’allumer ». Pour être un peu plus sérieux, si vous êtes amenés à manipuler souvent vos bases de données, et c’est ce que j’ai fini par faire au boulot, travailler directement avec le client ligne de commande de mysql peut vous apprendre pas mal de choses et peut s’avérer souvent plus rapide.

Mais ça vient avec ses propres contraintes, idéalement on évite de se connecter à distance car par défaut le client mysql se connecte sans chiffrement de la connexion, ce qui n’est pas recommandé de nos jours. Soit on met en place du « SSL », ce qui est lourd et chiant, soit on passe par un tunnel SSH, ce qui est moins lourd et plus facile. Ou alors on se connecte au serveur en SSH, et on lance le client « local » du serveur.

Sinon, certains logiciels comme MySQLWorkbench, ou DBeaver (horreur en Java découverte via Twitter), permettent de lancer ce même tunnel SSH pour ensuite initier la connexion. Bien évidemment tout ça n’est valable que si vous avez accès à SSH, ce qui dans le cadre de services PaaS (mysql ou mariadb en tant que service), n’est pas possible.


Voilà avec tout ça, si vous avez encore un souci de sécurité avec votre installation de PHPMyAdmin, c’est que vous l’avez cherché 😛 Maintenant je suis curieux de savoir ce que j’ai pu manquer, ce que vous avez mis en place pour verrouiller vos accès, vous savez quoi faire pour m’en dire plus (un indice : on peut poster des commentaires sur mon blog :D)

12 Commentaires
Le plus ancien
Le plus récent
Commentaires en ligne
Afficher tous les commentaires
BarbossHack
BarbossHack
14/12/2018 18:58

T’a parlé de tunnel ssh, bah justement c’est ce que j’utilise plus ou moins ! En fait j’ai une instance de phpmyadmin locale sur mon desktop, que je fait passer par mon tunnel ssh, du coup rien d’installé sur mon serveur, et j’utilise phpmyadmin, tout le monde est content 😛

Bon article 🙂

Beankylla
Beankylla
14/12/2018 22:13

Petite question :
Pourquoi est ce qu’un htaccess N’a pas de sens si on n’utilise pas apache ?
J’en ai sur nginx et il me semble que ça marche.

Thomas
21/12/2018 08:58
Répondre à  Seboss666

Je pense que c’est une confusion entre htaccess et htpasswd, car on peut effectivement utiliser l’outil htpasswd pour générer le fichier d’authentification d’Nginx (qui s’appelle également htpasswd), alors que cet outil fait est inclus dans le paquet apache2-utils.
https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/

Tetsumaki
15/12/2018 01:41

Pour ma part, j’utilise l’authentification basique (auth_basic dans nginx) avec Adminer qui a l’avantage d’être léger (1 fichier php), de gérer mysql/pgsql/sqlite mais pas que. J’ai aussi un phpmyadmin que j’utilise rarement (voir jamais) car il propose plus d’options qu’Adminer concernant mysql. Sinon, j’aime utiliser simplement le terminal avec les commandes mysql et postgres, ça permet de ne pas dépendre d’une interface qui nous assiste et empêche la progression technique. Bien penser à vérifier les logs d’accès aussi afin de détecter les tentatives d’accès et brute force (on peut limiter les connexions via nginx) et un petit fail2ban ça peut… Lire la suite »

Adminrezo
15/12/2018 12:27

Phpmyadmin permet aussi l’authentification à 2 facteurs. Ça peut être un bon complément :
https://docs.phpmyadmin.net/en/latest/two_factor.html

gbetous
gbetous
15/12/2018 13:35

Je suis en train de me dire que l’arme de sécurité ultime c’est le VPN. Je suis en train de me convertir au « VPN everywhere ». Par exemple phpmyadmin : il suffit de le limiter aux adresses de réseau local. Je suis à distance ? Pas de soucis, VPN et me voici dans le réseau local.

Un avis ?

Mirabellette
17/12/2018 17:08
Répondre à  gbetous

Très bonne idée, c’est une règle de sécurité de base de réduire l’accès aux ressources aux seules personnes qui en ont la nécessité.

La restriction d’un accès aux seules personnes connectées au réseau, réseau qui nécessite de s’authentifier au préalable, est un excellent moyen pour faire cela 🙂

LRDbrg
LRDbrg
15/12/2018 14:34

Il y à cette outil qui est pas mal aussi
https://www.heidisql.com

yannsolo57
yannsolo57
06/01/2019 11:20

Bonjour, et merci pour cet article.
Je ne comprends pas ce que tu entends par SNI dans ta phrase: « Attention, si vous utilisez un sous-domaine spécifique, même en HTTPS avec SNI il passe en clair « 

yannsolo57
yannsolo57
06/01/2019 16:45
Répondre à  Seboss666

Réponse claire et rapide. Merci.