Comment rendre MySQL accessible depuis l’extérieur ? …

… Et si possible avec une gestion des accès utilisateurs cohérente. Voici une question qui revient souvent et pour laquelle certains webmasters sont un peu perdus. En effet, pour des raisons de sécurité évidente, MySQL n’autorise pas par défaut les connexions distantes. Ce billet s’adresse donc aux personnes ayant plusieurs serveurs/VMs à disposition et souhaitant rendre MySQL contactable à distance sur le 3306. Le but est donc d’avoir un serveur MySQL central que plusieurs autres machines pourront contacter. Les raisons sont nombreuses et variées: centralisation des bases, mise à disposition d’une machine au hardware correctement dimensionné, utilisation de sessions DB pour du SSO, authentification unifiée, etc…

Bien, donc partons du principe que vous avez développé www.example.com. Vous avez aussi historiquement une dizaine de sites, example1.com, example2.com, example3.com et ainsi de suite. Vous souhaitez pouvoir gérer les accès aux répertoires /admin/ par le biais d’un login unifié par MySQL; Comprendre: déployer le même htaccess partout qui permet d’utiliser une base de donnée afin de vérifier si tel utilisateur dispose d’un accès à tel site ou pas.  Une gestion d’ACL unifiée en quelque sorte. Au delà du fait que vous allez avoir besoin de mod_auth_mysql, il vous faut un serveur MySQL vers lequel l’ensemble des configurations htaccess/vhost/nginx iront taper pour savoir si les utilisateurs peuvent se loger ou non. Autre exemple, example.com prend de l’ampleur, les requêtes SQL (ou pas) sont déjà optimisées (INDEXES, table de consolidation, écriture sur le FS pour les statistiques à fort I/O, redis, memcache & co) mais elles mettent cependant le serveur sur les rotules tellement il y a de visiteurs sur le site. L’idée est de dédier un serveur MySQL pour la plateforme, avec des configurations en réplication master-slave & co.

Donc, comment permettons nous à MySQL d’écouter à distance ? C’est en réalité assez simple, mais comme ce n’est pas si évident que cela de retrouver sur google comment faire dans une seul document, j’avais fais cette note qui tente de condenser l’information pour certains de nos stagiaires. Je la publie sans relecture ici.

La première chose à faire est d’aller modifier votre /etc/mysql/my.cnf afin de commenter la ligne suivante:

Vous devez ensuite, comme d’habitude, redémarrer mysql:

Le serveur n’écoute désormais plus localement. Il est bindé sur toutes les interfaces réseaux (VPN mais aussi IP publique si votre machine annonce sur Internet). Vous pouvez désormais créer vos utilisateurs. Ce n’est pas parce que 10 serveurs (frontaux d’un cluster ?) peuvent avoir besoin de contacter notre serveur MySQL que l’utilisateur crée doit avoir les droits %. Il convient de gérer précisément les autorisations de chaque utilisateur, et ce, même si la solution de facilité souvent employée par les webmasters est de mettre en droit « % » (le % est une wildcard qui permet à l’utilisateur MySQL de se connecter depuis n’importe quelle IP).

Donc pour résumer, ce qu’il ne faut pas faire:

Dans ce use-case, vous créez un utilisateur qui peut se connecter de n’importe où. Si les flux réseaux sortant d’example.com utilisent toujours la même IP de sortie (pour contacter MySQL au hasard), par exemple 80.80.80.80, voici ce qu’il convient de faire:

Si vous venez à finalement héberger un site sur le serveur MySQL (là ça devient n’importe quoi), et que vous n’avez pas besoin de contacter à distance pour l’utilisateur MySQL, vous pouvez enlever le bind afin que le serveur n’écoute plus sur la network stack (sauf si d’autres utilisateurs s’y connectent) et prévoir les ACL directement pour localhost. Et si d’aventure, vous n’avez pas envie de granter les accès immédiatement:

Il n’est pas impossible que votre machine rejette les flux entrants à l’aide d’iptables/netfilter , vous devez donc autoriser les serveurs distants à vous contacter:

N.B: Rendre vos bases de données accessibles depuis l’extérieur n’est pas synonyme de faiblesse de sécurité si les choses sont bien faites (et si vous mettez à jour dans les délais). Pour rester à jour vous pouvez utiliser apticron ou unattended-upgrades, sans utiliser le déploiement des paquets, mais en mode alerte ça fait le job.

Partagez cet article !

    13 thoughts on “Comment rendre MySQL accessible depuis l’extérieur ? …

    1. Cyril dit :

      Merci pour le tuto. Ca m’a sauvé la vie ^^

    2. Gaspard dit :

      Bonjour,

      Merci pour votre tuto, très clair et compréhensible, seulement, il y a encore un point que je n’arrive pas à saisir : il s’agit de chaque utilisateur.

      Où doit-on les créer ? Sur le serveur distant? Le serveur local?

      Merci pour votre réponse!

    3. John JEAN dit :

      Bonjour,

      Sur votre serveur distant, enfin votre serveur MySQL :-)

      John

    4. Laurent dit :

      Bonjour,

      J’ai actuellement un problème de avec deux bases SQL.
      J’ai une base SQL d’OCS Inventory sous WIndows server 2003 (je ne l’ai pas installé moi, pas taper :)) et un serveur GLP I(avec base SQL) sous Debian.

      J’ai suivi votre manipulation jusqu’à l’utilisateur, seulement je suis bloqué au niveau des iptables…Savez-vous comment effectuer cette manipulation sous WIndows?

      En tout cas bravo pour votre tuto, très compréhensible!

    5. misbash dit :

      Salut ,
      je ne trouve pas le fichier my.cnf , j’ai seulement my.init mais je ne trouve toujours pas bind-address pour la mettre en commentaire , de l’aide svp .
      Merci d’avance.

    6. Antoine dit :

      Merci pour ton aide avec ce tuto !

      Petit retour d’expérience perso :
      avant de passer à la modification des IPTABLES, vérifier que vous donnez la bonne adresse IP de l’ordinateur qui doit accéder à la base de données, c’est tout bête mais cela peut faire la différence ^^

    7. John JEAN dit :

      john@pentest:~$ locate my.cnf
      /etc/mysql/my.cnf

    8. John JEAN dit :

      Bonjour,

      Que souhaitez vous faire exactement avec iptables ?

    9. Salem dit :

      merci :)))

    10. Maxime dit :

      Merci beaucoup pour ce tuto clair et compréhensif

    11. flo dit :

      Bonjour Mr John,

      Voila ma problématique,

      J’utilise un logiciel de commerce pour faire des inventaires,gestion de stocks, etc, qui sont enregistrés dans une table Mysql.

      Plusieurs PC on ce logiciel de commerce installé et donc ces pc sont susceptibles de modifier les paramètres.

      Est t’il possible d’installer wampserver en local en fin de partager la base des données Mysql entre plusieurs PC?.

      Merci d’avance,

      Flo

    12. John JEAN dit :

      C’est possible, mais je vous conseille d’opter pour un déploiement physique ou virtualisé d’une machine sous Debian et d’un vrai serveur MySQL plutôt que quelque chose de packagé comme WAMP qui va embarquer Apache et PHP inutilement et ouvrir le 80 sur votre machine Windows. Il faut aussi vous assurer que toutes les installations et les instances de votre logiciel pointent vers la même base de données pour ne pas avoir des données dispersées et ennuyeuses à rattraper à cause des id incrémentaux sur chaque install. Enfin, assurez vous d’avoir un locking lorsqu’un inventaire ou un produit est en édition, afin que plusieurs personnes ne modifient pas le projet en même temps. Sauvegarde, redondance, etc…
      Bon courage,
      John

    13. wiltord dit :

      bonjour svp j’arrive pas a trouver /etc/mysql/my.cnf sous window. a l’aide

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *