En général il y a deux façons de se connecter à une base de donnée :
- soit on fait cela à travers les « sockets UNIX »,
- soit on fait cela à travers les « sockets TCP/IP ».
Ici, on va regarder comment se connecter Ă une base de donnĂ©e MariaDB (MySQL) depuis une autre machine et cela nĂ©cessite dâutiliser les « sockets TCP/IP ».
Préalable pour cet article : « sockets UNIX » versus « sockets TCP/IP »
-
« sockets UNIX » versus « sockets TCP/IP »
Un socket UNIX, (AKA Unix Domain Socket), est un mĂ©canisme de communication inter-processus qui permet un Ă©change de donnĂ©es bidirectionnel entre des processus exĂ©cutĂ©s sur la mĂȘme machine.
Les sockets IP (en particulier les sockets TCP/IP) sont un mĂ©canisme permettant la communication entre processus sur le rĂ©seau. Dans certains cas, vous pouvez utiliser des sockets TCP/IP pour communiquer avec des processus exĂ©cutĂ©s sur le mĂȘme ordinateur (en utilisant lâinterface de bouclage).
Les sockets de domaine UNIX savent quâils sâexĂ©cutent sur le mĂȘme systĂšme, ils peuvent donc Ă©viter certaines vĂ©rifications et opĂ©rations (comme le routage) ; ce qui les rend plus rapides et plus lĂ©gers que les sockets IP.
Donc, si vous prĂ©voyez de communiquer avec des processus sur le mĂȘme hĂŽte, câest une meilleure option que les sockets IP.
Notez que les sockets de domaine UNIXÂ :
- sont soumises aux autorisations du systĂšme de fichiers, tandis que les sockets TCP ne peuvent ĂȘtre contrĂŽlĂ©s quâau niveau du filtre de paquets.
- ne peuvent pas ĂȘtre partagĂ©es via NFS, SAMBA, ou SSHFS (le fichier qui est utilisĂ© pour les Ă©changes est dâun type bien spĂ©cifique, considĂ©rez que ce nâest mĂȘme pas un fichier â pas de copie, pas de sauvegarde possible).
Préalable pour cet article : « MariaDB » versus « MySQL »
-
« MariaDB » versus « MySQL »
Dans le dĂ©veloppement de sites Web, une base de donnĂ©es joue un rĂŽle essentiel dans le stockage et la gestion des donnĂ©es, un rĂŽle parfois trop important dâailleurs, mais câest un autre sujet.
Lâune des bases de donnĂ©es les plus populaires est MySQL et qui temps Ă ĂȘtre remplacĂ©e par sa successeure MariaDB.
Malgré une structure similaire, les deux systÚmes de gestion de bases de données relationnelles présentent des caractéristiques et des éléments différents.
La principale différence entre MariaDB et MySQL est que MariaDB est complÚtement open-source et est globalement plus rapide que MySQL grùce à un plus grand nombre de moteurs de stockage et un pool de connexion plus important.
Notez que cependant, MySQL supporte le masquage des donnĂ©es et les colonnes dynamiques, ce qui nâest pas le cas de MariaDB.
Sur les fonctionnalités, les deux bases de données sont assez semblables.
- Sur Debian et ces dĂ©rivĂ©s le paquet MySQL utilise depuis plusieurs annĂ©es le moteur MariaDB, câest donc probablement le moteur de MariaDB que vous utilisez dĂ©jĂ . Les paquets MySQL semblent disparaĂźtre au profit de MariaDB, il y a donc une migration Ă prĂ©voir pour passer sur les paquets MariaDB natif et il faudra prendre lâhabitude dâutiliser les commandes MariaDB au lieu de celle de MySQL.
- MySQL, aujourdâhui, tant Ă ĂȘtre rĂ©servĂ© aux professionnels (notion de support et de personnalisation du code).
Notez que bien que le code de MariaDB soit complĂštement open-source, il reste principalement maintenu par Oracle. Lâoutillage Oracle pour MySQL nâest pas censĂ© fonctionner avec MariaDB, mais pour un usage limitĂ© (en amateur Ă©clairĂ©, disons) ça marche (encore).
Les désavantages de MariaDB :
- MariaDB nâest pas encore 100Â % compatible avec MySQL, mais les deux supportent le mĂȘme sous-langage SQL.
- Sa mise en cache nâest pas efficace pour traiter les trĂšs grosses transactions.
- Son support coûte cher, principalement du fait du manque de compétences.
- La version cluster de MariaDB nâest pas stable Ă ce jour.
Dans la suite de cet article, on prĂ©suppose que la base de donnĂ©e est dĂ©jĂ configurĂ©e pour utiliser TCP/IP et quâelle a dĂ©jĂ un utilisateur avec les droits appropriĂ©s Ă vos besoins, ou que vous avez laissĂ© la base de test.
En gros, on présuppose une installation assez standard, pas trop bricolée.
Tests depuis le serveur MariaDB
Depuis la machine oĂč se trouve la base de donnĂ©e.
Si vous nâavez pas supprimĂ© la base de test et pas protĂ©gĂ© votre base de donnĂ©e, vous pouvez lâutiliser pour tester votre configuration.
mariadb --host=localhost --protocol=tcp --port=3306 test
sinon, il faut que vous ayez un utilisateur qui existe déjà (comment le créer ne fait pas partie de ce billet) :
mariadb --host=localhost --protocol=tcp --port=3306 --user='votre_user' --password='votre_mot_de_passe'
Notez que localhost
indique que lâon utilise la boucle locale, la ligne prĂ©cĂ©dente est Ă©quivalente Ă Â :
mariadb --host='127.0.0.1' --protocol=tcp --port=3306 --user='votre_user' --password='votre_mot_de_passe'
Mais si vous utiliser lâadresse IP de votre base de donnĂ©e, vous devrez Ă©crire quelque chose comme :
mariadb --host='192.168.1.89' --protocol=tcp --port=3306 --user='votre_user'--password='votre_mot_de_passe'
Si lĂ vous avez une erreur de connexion, câest votre configuration se limite Ă la boucle locale.
Pour vous aider à localiser la configuration, vous pouvez utiliser quelque chose comme :
cd /etc/mysql ; sudo grep -R 'bind-address'
Avec les derniÚres versions de MariaDB, cela devrait se situer dans :
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Et vous devrez remplacer la ligne :
bind-address = 127.0.0.1
Par la ligne :
bind-address = 0.0.0.0
Pensez ensuite à reconfigurer le service et le redémarrer :
sudo systemctl daemon-reload
sudo systemctl restart mariadb.service
Et cette fois la ligne suivante devrait fonctionner :
mariadb --host='192.168.1.89' --protocol=tcp --port=3306 --user='votre_user'--password='votre_mot_de_passe'
On va maintenant pouvoir tester depuis une autre machine.
Tests depuis une autre machine
mariadb --host='192.168.1.89' --protocol=tcp --port=3306 --user='votre_user'--password='votre_mot_de_passe'
Si la connexion ne fonctionne pas, cette fois câest du cĂŽtĂ© de lâutilisateur quâil faut chercher.
On va rechercher un utilisateur qui a le droit dâaccĂ©der Ă la base de donnĂ©e.
Regardons la configuration des utilisateurs (à faire sur le serveur hébergeant MariaDB) :
sudo mariadb -e "SELECT User, Host FROM mysql.user;"
ou mieux encore (pour nâafficher que les utilisateurs qui ne sont pas limitĂ©s Ă un accĂšs local) :
sudo mariadb -e "SELECT User, Host FROM mysql.user WHERE Host <> 'localhost';"
Vous obtiendrez quelque chose comme :
+------------------------+------+
| User | Host |
+------------------------+------+
| kodi | % |
| sql_nc101_201909_admin | % |
+------------------------+------+
+----------------+-----------+
| User | Host |
+----------------+-----------+
| mariadb.sys | localhost |
| mysql | localhost |
| phpmyadmin | localhost |
| piwigo_db_user | localhost |
| root | localhost |
+----------------+-----------+
Si vous vous trouvez dans le second cas de figure, vous devrez modifier la configuration dâun des utilisateurs ou en crĂ©er un nouveau avec plus de droits.
Exposition de la base de donnée sur internet (derriÚre une box en mode routeur)
Je ne pense pas que ce soit une bonne idĂ©e dâexposer une base de donnĂ©e directement sur Internet, mais disons que si pour des raisons particuliĂšres vous souhaitez le faire, voici comment mettre cela en Ćuvre.
Préliminaires et cadrage :
- Il faut que votre box est une adresse IPv4,
- Il est prĂ©fĂ©rable que votre box vous propose une pile IP complĂštes (de plus souvent votre fournisseur dâaccĂšs internet ne vous donnera quâune demi-pile IP lorsque vous ĂȘtes en IPv4),
- Il faut que votre box soit en mode routeur (NAT) (et surtout pas en mode
bridge).
Vous devrait identifier lâadresse IP du serveur sur le rĂ©seau local de la base de donnĂ©e (cela a forcĂ©ment Ă©tĂ© fait si vous avez fait les tests ci-dessus).
Vous aurez besoin du port dâĂ©coute de la base de donnĂ©e (par dĂ©faut pour MariaDB câest le port 3306
)
Voici les informations que vous devrez remplir :
- Protocole :
tcp
- Réseau local :
- « Lan IP » = IP de destination = IP Locale : dans notre exemple câest
192.168.1.89
- « Lan Port » = Port de destination = Port local : dans notre cas câest
3306
- « Lan IP » = IP de destination = IP Locale : dans notre exemple câest
- Internet (Wan)Â :
- « Wan IP » = IP source : Comme nâimporte qui peut venir sur cette base de donnĂ©e, la rĂ©ponse est
Toutes
ou0.0.0.0
(ou quelque chose dans ce sens) - « Wan Port » = Port externe (dans certain cas vous aurez à préciser un range), vous devrez choisir un numéro de port, par exemple
13306
. Pour limiter les attaques, Ă©viter dâutiliser des ports classiques et rĂ©servĂ© Ă lâadministration. ConcrĂštement prenez un numĂ©ro supĂ©rieur Ă1024
et infĂ©rieur Ă65535
(attention dans le cas oĂč vous nâavez quâune demi-pile IP).
- « Wan IP » = IP source : Comme nâimporte qui peut venir sur cette base de donnĂ©e, la rĂ©ponse est
{
"ip_proto": "tcp",
"lan_ip": "192.168.1.89",
"lan_port": 3306,
"src_ip": "0.0.0.0",
"wan_port_end": 13306,
"wan_port_start": 13306
}
Retrouver le port dâune instance MariaDB
Pour une installation standard, vous pourrez trouver le port Ă lâaide de :
cd /etc/mysql ; sudo grep -R 'port'
Par défaut MariaDB et MySQL écoute sur le port 3306
.
 On parle de sockets UNIX avec MariaDB
Pour rechercher la configuration permettant de communiquer en utilisant les sockets UNIX, vous pouvez utiliser :
cd /etc/mysql ; sudo grep -R 'socket'
On recherche typiquement une ligne du type :
socket = /run/mysqld/mysqld.sock
Câest le fichier /run/mysqld/mysqld.sock
qui servira aux échanges entre la base de donnée et les clients.
Notez que ce fichier nâest pas un fichier standard :
stat /run/mysqld/mysqld.sock
File: /run/mysqld/mysqld.sock
Size: 0 Blocks: 0 IO Block: 4096 socket <===== Sur un fichier classique, on aurait 'regular file'
Device: 15h/21d Inode: 641 Links: 1
Access: (0777/srwxrwxrwx) Uid: ( 111/ mysql) Gid: ( 117/ mysql)
Access: 2023-03-10 12:11:29.321928350 +0100
Modify: 2023-02-27 22:42:47.923999980 +0100
Change: 2023-02-27 22:42:47.923999980 +0100
Birth: -
Liens
- Comparaisons MariaDB et MySQLÂ :
- En lien direct avec ce billet :
- Si vous souhaitez aller plus loin sur les « sockets UNIX » :
኿