Réplication Mysql sur SSL

Dernièrement j’utilisais un tunnel openvpn pour faire passer le flux de réplication des serveurs Mysql ou Mariadb. C’était simple et facile vu qu’il y avait déjà un tunnel en place. Le problème, c’est le délai de propagation si le serveur Openvpn est lent, et cela ajoute point faible à la réplication car cela dépend d’un autre serveur. Je n’avais jamais vraiment creuser la partie SSL de Mysql mais finalement cela se révèle assez simple ! Voici comment faire !

On considère SERVEUR_A , notre serveur Mysql maître et SERVEUR_B, notre serveur esclave. Aller, c’est parti ! (je ne reviens pas ici sur la mise en place de la réplication simple présente dans l’article Réplication Mysql)

## sur SERVEUR_A
mkdir /etc/mysql/ssl
cd /etc/mysql/ssl

#créer le certificat du serveur
openssl req -x509 -newkey rsa:2048 -keyout master-private.pem -out master-public.pem -nodes -days 3650
openssl rsa -in master-private.pem -out master-private.pem
cp master-public.pem ca-cert.pem

#créer le certificat du client
openssl req -x509 -newkey rsa:2048 -keyout slave-private.pem -out slave-public.pem -nodes -days 3650
openssl rsa -in slave-private.pem -out slave-private.pem
cat slave-public.pem >> ca-cert.pem

chown mysql:mysql /etc/mysql/ssl -R

#ajouter les lignes ci-dessous dans /etc/mysql/my.cnf
ssl
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/master-public.pem
ssl-key=/etc/mysql/ssl/master-private.pem

#redémarre mysql
service mysql restart

#vous pouvez vérifier que SSL fonctionne
mysql --defaults-file=/etc/mysql/debian.cnf
SHOW VARIABLES LIKE '%ssl%';


## sur SERVEUR_B
mkdir /etc/mysql/ssl
scp root@SERVEUR_A:/etc/mysql/ssl/ca-cert.pem /etc/mysql/ssl/ca-cert.pem

#on indique à MYSQL de se connecter en SSL
mysql --defaults-file=/etc/mysql/debian.cnf
stop slave;
change master to MASTER_HOST='SERVEUR_A', MASTER_USER='replication', MASTER_PASSWORD='replication_password', MASTER_SSL=1, MASTER_SSL_CA='/etc/mysql/ssl/ca-cert.pem', MASTER_LOG_FILE='mysql-bin.000055', MASTER_LOG_POS=555555;
start slave;

#on verifie le SSL
show slave status\G;

Et voilà, la connexion entre le serveur maître et esclave fonctionne en SSL. Si vous voulez forcer la connexion uniquement en SSL, vous pouvez changer les droits de l’utilisateur réplication sur SERVEUR_A, en indique SSL_TYPE=’ANY’. Cela désactivera la possibilité de se connecter sans certificats.

Cela fonctionne également pour les réplications en cascade. Ne pas oublier sur les serveurs esclaves qui deviennent maître d’ajouter la directive log_slave_updates=true dans le fichier /etc/mysql/my.cnf

Bien entendu, tout cela fonctionne également sous Mariadb, il suffit d’adapter les chemins vers les fichiers de configuration.

31 janv. 2019
Réplication Mysql sur SSL

Commentaires