vendredi 14 octobre 2016

Accéder à son serveur mysql distant en java

Tout n'est pas cousu d'avance

Quand on veut accéder depuis une application écrite en java à un serveur mysql situé sur un autre ordinateur, il va falloir faire attention à quelques détails indispensables :

  • vérifier le pare feu de chaque machine !
  • autoriser la connexion du serveur java sur le serveur mysql dans /etc/hosts.allow
  • autoriser vos utilisateurs à se connecter sur le serveur mysql depuis la machine java dans la table mysql.user
  • si vous utilisez ssh pour cette connexion, configurez correctement votre serveur de clés d'authentification

Je ne décrirai pas le dernier point car c'est (encore) hors de ma compétence. Mais je vais détailler les autres points. Tout est à réaliser avec les droits root !

pare-feu

configuration du pare-feu sur le serveur java
iptables -A INPUT -s 192.168.0.42/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
iptables save

connexion tcp/ip

Éventuellement, il faudra modifier /etc/hosts.allow sur le serveur mysql en ajoutant une ligne comme :

ligne à ajouter dans /etc/hosts.allow
mysqld: ALL : ACCEPT

Ensuite il faut modifier /etc/mysql/my.cnf sur le serveur mysql pour autoriser la connexion depuis une autre machine. Pour cela il faut mettre en commentaire la directive skip-networking, mais dans un serveur récent, elle n'est plus utilisée. À la place on a bind-address = 127.0.0.1 et en fait on va créer ou modifier bind-address pour y mettre l'adresse du serveur java (ici, 192.168.0.42), ou bien 0.0.0.0 si on veut autoriser tous les serveurs :

modification de bind-address dans /etc/mysql/my.cnf
bind-address = 192.168.0.42

utilisateurs mysql

Créez ou modifiez votre utilisateur avec "%" dans le champ Host de la table user de la base de données nommée mysql . On peut réduire la portée en mettant 192.168.0.% à la place de % par exemple, ou encore avec l'adresse IP du seul serveur depuis lequel la connexion est autorisée.

Attention avec phpmyadmin

Si vous avez mis une portée de Host comme 192.168.0.% par exemple, alors vous ne pourrez plus vous connecter avec cet utilisateur avec phpmyadmin. Si ça vous ennuie, il faudra créer un autre profil de l'utilisateur avec localhost comme valorisation du champ Host et le doter des mêmes privilèges. Le code ci-après montre comment créer les deux pour un utilisateur connext.

commandes sql pour avoir la connexion distante restreinte et la connexion mysql
flush privileges;
create user 'connext'@'localhost' identified by 'password';
create user 'connext'@'192.168.0.%' identified by 'password';
grant create, drop, delete, insert, select, update, alter, index on *.* to 'connext'@'localhost';
grant create, drop, delete, insert, select, update, alter, index on *.* to 'connext'@'192.168.0.%';
flush privileges;

Avec une portée comme %, vous pouvez aussi vous connecter via phpmyadmin car % inclut localhost.