8 juin 2012
Réplication MySQL sécurisée avec stunnel
Testé sur Debian Squeeze et Debian Wheezy – MySQL 5.1 – stunnel 4.29 et 4.52
La réplication MySQL permet d’assurer la redondance des bases MySQL entre plusieurs serveurs, j’en avais déjà parlé ici. L’inconvénient avec cette réplication basique est qu’elle n’est pas sécurisée, les données sont transmises en clair entre les 2 machines. Sur le même réseau local c’est pas dramatique, mais entre 2 serveurs internet c’est plus embêtant. Nous allons voir ici comment crypter les échanges entre les 2 serveurs.
MySQL intègre nativement un jeu d’instructions permettant de gérer les communications SSL entre serveurs, mais sa mise en oeuvre est notoirement hasardeuse, et d’ailleurs je n’y suis pas arrivé 🙁
En revanche avec stunnel ça ne demande pas plus d’une demie heure à mettre en place.
Le principe
On part du principe que la réplication « en clair » fonctionne entre les 2 serveurs. Nous allons mettre en place 2 tunnels SSL entre les serveurs maître et esclave, pour assurer une communication bi-directionnelle, qui est nécessaire pour la réplication. Il faudra ensuite modifier la configuration MySQL de l’esclave pour prendre en compte le tunnel SSL.
Installation et configuration de stunnel
Sur les 2 machines:
aptitude install stunnel4 |
Modifier la ligne suivante dans /etc/default/stunnel4 :
ENABLED=1 |
Générer le certificat sur le serveur maître dans /etc/stunnel (je l’appelle maitre.pem pour l’exemple, mais le nom du host serait plus indiqué):
openssl req -new -x509 -days 3650 -nodes -config /etc/ssl/openssl.cnf -out maitre.pem -keyout maitre.pem |
Recopier ce certificat dans /etc/stunnel sur le serveur esclave.
Faire la même chose sur le serveur esclave, seul le nom du certificat change:
openssl req -new -x509 -days 3650 -nodes -config /etc/ssl/openssl.cnf -out esclave.pem -keyout esclave.pem |
Recopier ce certificat dans /etc/stunnel sur le serveur maitre.
Sur les 2 serveurs, ajuster les droits des certificats:
chmod 600 /etc/stunnel/*.pem |
Configurons stunnel sur le serveur maitre.
Désactiver la config d’exemple :
mv /etc/stunnel/stunnel.conf /etc/stunnel/stunnel.conf.off |
Créer le fichier /etc/stunnel/mysql_serv.conf suivant pour accepter les connections sur le port 3308 :
cert=/etc/stunnel/maitre.pem key=/etc/stunnel/maitre.pem CAfile = /etc/stunnel/maitre.pem verify=2 sslVersion = SSLv3 setuid = stunnel4 setgid = stunnel4 pid = /var/run/stunnel4/mysqlserv.pid debug = 5 output = /var/log/stunnel4/mysql.log [mysqlserv] accept = 3308 connect = 3306 client=no |
Démarrer stunnel et vérifier dans les logs que tout s’est bien passé.
/etc/init.d/stunnel4 start |
Sur le poste esclave, créer les 2 fichiers de config suivants :
/etc/stunnel/mysql_serv.conf (Seul le nom du certificat change par rapport à la config du poste maître)
cert=/etc/stunnel/esclave.pem key=/etc/stunnel/esclave.pem CAfile = /etc/stunnel/esclave.pem verify=2 sslVersion = SSLv3 setuid = stunnel4 setgid = stunnel4 pid = /var/run/stunnel4/mysqlserv.pid debug = 5 output = /var/log/stunnel4/mysql.log [mysqlserv] accept = 3308 connect = 3306 client=no |
/etc/stunnel/mysql_client.conf
cert=/etc/stunnel/maitre.pem sslVersion = SSLv3 setuid = stunnel4 setgid = stunnel4 pid = /var/run/stunnel4/mysqlclient.pid debug = 5 output = /var/log/stunnel4/mysql.log client=yes [mysqlclient] accept = 3307 connect = adresse_du_maitre:3308 |
Démarrer stunnel et vérifier dans la log que les 2 services sont actifs.
Depuis le poste esclave, on peut vérifier que le tunnel mysql fonctionne vers le serveur maitre:
mysql -h 127.0.0.1 --port=3307 -p |
Configuration de MySQL
Il ne reste plus qu’à configurer MySQL sur le poste esclave pour qu’il utilise le tunnel SSL :
mysql> stop slave; change master to master_host='127.0.0.1', master_port=3307; start slave; show slave status\G |
Liens
MySQL Master-Master Replication over a Secure Stunnel Connection (SSL)
Doug Bunger: MySQL Replication – Pt 3