MySQL/MariaDB : Se connecter à un serveur distant
MySQL, ou son fork MariaDB, sont des logiciels de gestion de base de données basés sur un système de connexion client/serveur. Ainsi lors de l'installation, il est nécessaire d'installer une application serveur, puis une application cliente pour s'y connecter, même si nous sommes sur la même machine. Sur un serveur web, c'est tout simple, PHP ou le langage que vous utilisez devient client de l'application serveur.
Ce gestion séparée apporte bien des avantages, et en particulier, cela permet de se connecter au serveur MySQL/MariaDB depuis un serveur distant, que ce soit avec l'application cliente ou via un serveur web. Cependant, pour cela il faut avoir correctement configurer l'application serveur.
Imaginons deux machines :
- DBSERVER : qui sera le serveur de base de données, et dont le nom d'hôte sera DBSERVER. DBSERVER possède une base de données DBDATA
- WEBSERVER : qui sera un serveur web, ayant besoin des données de DBDATA, et dont le nom d'hôte sera WEBSERVER
A vous de modifier le tutorial selon les noms de vos machines, qu'elles soient serveur ou simple poste client.
1/ Autoriser les connexions distantes
Par défaut, le logiciel serveur est réglé pour n'être accessible que depuis la machine locale. Pour permettre l'accès depuis un autre serveur, il est nécessaire de dévérouiller un réglage sur la machine DBSERVER.
Selon les versions, ce réglage peut changer d'emplacement, sur MySQL, il est majoritairement accessible dans le fichier
/etc/mysql/my.cnf
Sur MariaDB sur une Raspbian, le fichier à modifier est
/etc/mysql/mariadb.conf.d/50-server.cnf
Dans le fichier, il faut modifier la ligne
bind-address = 127.0.0.1
en
bind-address = 0.0.0.0
Cette action va permettre à MySQL d'écouter sur l'ensemble du réseau plutôt que sur l'adresse locale de la machine.
Et il ne faut pas oublier d'ouvrir le port 3306, utilisé par défaut par le logiciel pour écouter, sur votre firewall.
2/ Créer l'utilisateur MySQL
Maintenant que les connexions distantes sont acceptées, il faut pouvoir se connecter avec un compte valide sur le serveur pour accéder aux données. Pour cela, nous allons créer un utilisateur MySQL sur DBSERVER. Nous allons appeler cet utilisateur WebUser (avec un mot de passe).
Sur DBSERVER, utilisez le client local pour vous connecter au serveur, puis ajoutez l'utilisateur, sans oublier d'indiquer sa provenance WEBSERVER :
CREATE USER 'WebUser'@'WEBSERVER' IDENTIFIED BY 'mot_de_passe';
Il est aussi possible de permettre à WebUser de se connecter depuis n'importe où
CREATE USER 'WebUser'@'%' IDENTIFIED BY 'mot_de_passe';
Mais cela serait moins sécurisé. Pour ma part, je préfère indiquer l'hôte et être sur que lui, et uniquement lui est capable de se connecter.
WebUser est désormais capable de se connecter, il faut lui octroyer les permissions sur la base de données DBDATA. Ici, je vais donner l'ensemble des droits, mais vous pouvez les ajouter de manière granulaire pour définir uniquement les droits que vous souhaitez partager.
GRANT ALL PRIVILEGES ON 'DBDATA'.* TO 'WebUser'@'WEBSERVER';
FLUSH PRIVILEGES;
3/ Connection depuis le client.
Depuis WEBSERVER, vous pouvez désormais vous connecter via le client MySQL
mysql -u WebUser -h DBSERVER -p
mais aussi depuis PHP
$connection = new mysqli('DBSERVER', 'WebUser', 'mot_de_passe', 'DBDATA');
4/ Connection non fonctionnelle ?
Lors de l'application de cette configuration, il n'est arrivé que la connexion ne se fasse pas sur le serveur WEBSERVER, mais pire, qu'elle ne se fasse plus sur le serveur DBSERVER.
Dans les deux cas, il s'agit bien souvent d'un soucis d'identification des serveurs dans les utilisateurs MySQL.
Avant d'utiliser le wildcard "%" ouvrant globalement le serveur au monde entier au moindre soucis (récupération des identifiants via une faille du serveur web par exemple), il est nécessaire de trouver une solution plus sécurisée.
La première solution est de remplacer le nom du serveur par son adresse IP et de re-créer l'utilisateur dans MySQL sur DBSERVER.
La seconde est de faire un ping sur la machine souhaitant se connecter, il est possible qu'elle ait plusieurs noms et que vous n'utilisiez pas celui qui est enregistré dans l'entrée A du registre DNS du domaine courant. Ainsi vous disposez de son nom réel.