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

No votes yet.
Please wait...

Laisser une réponse