The ZATAZ network :: ZATAZ.com :: ZATAZ.net


Documentation : Connexions et réplications sécurisées avec MySQL 4.x

Date de publication : 10.6.2005
Date de modification : 9.11.2005

Contributeur : Eric Romang

Société : ZATAZ / http://www.zataz.net

Eric Romang co-fondateur de ZATAZ, avec Damien Bancal, supervise la direction technique de ZATAZ.

Situé au Luxembourg, Eric Romang a eu l'occasion au cours de ses années d'expériences dans le domaine au sein de datacenter de développer une expertise dans la haute disponibilité d'infrastructure, la mise en place de cluster MySQL, de solutions de stockages, de sauvegardes et de sécurisation d'environnement Linux.


Sommaire

Introduction

MySQL 4.0.0 a introduit le support des connexions sécurisée (encryptées) entre les clients MySQL et le serveur MySQL, en utilisant le protocole SSL. Nous allons aborder les connexions et réplication de bases de données dans ce document.

Par défault, MySQL n'utilise pas les connexions sécurisés pour des raisons de rapiditées. Utiliser les connexions SSL va rendre le protocole client/serveur plus lent. Le cryptage des données utilise beaucoup de ressources CPU.

MySQL autorise des connexions cryptées par connexions. Il est possible d'utiliser des connexions non sécurisées ou sécurisées suivant les besoins.

Concept de base des connexions SSL

Afin de comprendre comment MySQL utilise SSL, il est nécessaire d'expliquer quelques concepts de base de SSL et de X509.

Par défault, MySQL utilise des connexions non cryptées entre le client et le serveur. Cela sous-entend que si un utilisateur du réseau local malveillant, ou un internaute malveillant, a accès au réseau, il lui est possible de capturer le traffic et de visualiser le traffic MySQL reçu et envoyé. Il sera possible à ces utilisateurs malveillant de changer le contenu des paquets en cours de transfert.

Si il existe un besoin de transmission d'informations par le réseau, de façon sécurisée, les connexionx cryptées sont nécessaires. Le cryptage des données rend la lecture des données en cours de transit illisibles.

SSL est un protocole qui utilise différents algorithmes d'encryptage pour s'assurer que les données reçues par le biais d'un réseau publique peuvent être considérées comme sûres. SSL incorpore aussi des algorithmes qui permettent de vérifier des identitées par le biais du standard X509.

X509 permet d'identifier quelqu'un sur Internet. En terme simple, il est nécessaire d'avoir une autorité de certification (CA) qui assigne des certificats électronique à qui en a besoin. Les certificats délivrés par la CA sont basés sur des algorithmes de cryptage assymétrique qui ont deux clés de cryptage (une clé publique et une clé privée). Le possesseur d'un certificat peut montrer le certificat à des tiers afin de prouver son identitée. Toutes données cryptées avec la clé publique peuvent être décryptées avec la clé privée correspodante, qui est détenu par le possesseur du certificat.

Requis

Pour utiliser des connexions SSL entre le serveur MySQL et les programmes clients, le système doit supporter OpenSSL et la version de MySQL doit être 4.0.0 ou plus. MySQL doit être compilé avec le support SSL et les tables GRANT doivent avoir les champs SSL de présent.

Les connexions clients/serveur en SSL et X509 peuvent être réalisées à partir de la version 4.0.0 de MySQL. Par contre les réplications MySQL entre clients et serveur ne sont disponibes qu'à partir de la versions 4.1.x de MySQL.

Afin de savoir si votre serveur MySQL supporte OpenSSL, lancer la commande suivante :

mysql> SHOW VARIABLES LIKE 'have_openssl';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl | YES |
+---------------+-------+

Si la variable est à YES, le support est alors actif.

Mettre en place des certificats X509 pour MySQL

Ci-dessous le descriptif de la mise en place de certicats SSL pour MySQL.

Création de l'autorité de certification sur le serveur maître MySQL :

mkdir -p /etc/ssl/mysql/private
mkdir /etc/ssl/mysql/newcerts/
cd /etc/ssl/mysql


Remplacer dans le fichier /etc/ssl/openssl.cnf ./demoCA par /etc/ssl/mysql

Création des fichiers nécessaires : database, serial

touch /etc/ssl/mysql/index.txt
echo "01" > /etc/ssl/mysql/serial


Nous pouvons maintenant créer l'autorité de certification :

openssl req -new -x509 -keyout private/cakey.pem -out cacert.pem -config ../openssl.cnf -days 365

Generating a 1024 bit RSA private key
........++++++
..........++++++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:


On saisit le mot de passe désiré pour l'autorité de certification.

Verifying - Enter PEM pass phrase:

On resaisi le mot de passe de l'autorité de certification.

Country Name (2 letter code) [AU]:

Entrer le code du pays dans lequel vous résidez.
Pour moi le Luxembourg, donc LU

State or Province Name (full name) [Some-State]:

Nom de l'Etat ou de la province ou vous résidez.
Pour moi Luxembourg :)

Locality Name (eg, city) []:

Nom de la ville dans laquelle vous résidez.
Toujours Luxembourg ;)

Organization Name (eg, company) [Internet Widgits Pty Ltd]:

Nom de l'organisation pour laquelle vous voulez créer cette clé privée.
Ici ZATAZ.net

Organizational Unit Name (eg, section) []:

Nom du département dans lequel vous travaillez.
ZATAZssl

Common Name (eg, YOUR name) []:

Nom FQDN de la machine
Ici mysql-master.zataz.loc

Email Address []:

Votre adresse email
Ici eromang@zataz.net

Création de la demande de certificat et de la clé privé serveur sur le serveur maître MySQL :

openssl req -new -keyout server-key.pem -out server-req.pem -days 3600 -config ../openssl.cnf

Generating a 1024 bit RSA private key
........++++++
..........++++++
writing new private key to 'server-key.pem'
Enter PEM pass phrase:


On saisit le mot de passe désiré pour la clé du serveur MySQL

Verifying - Enter PEM pass phrase:

On resaisi le mot de passe de la clé du serveur MySQL

Country Name (2 letter code) [AU]:

Entrer le code du pays dans lequel vous résidez.
Pour moi le Luxembourg, donc LU

State or Province Name (full name) [Some-State]:

Nom de l'Etat ou de la province ou vous résidez.
Pour moi Luxembourg :)

Locality Name (eg, city) []:

Nom de la ville dans laquelle vous résidez.
Toujours Luxembourg ;)

Organization Name (eg, company) [Internet Widgits Pty Ltd]:

Nom de l'organisation pour laquelle vous voulez créer cette clé privée.
Ici ZATAZ.net

Organizational Unit Name (eg, section) []:

Nom du département dans lequel vous travaillez.
ZATAZssl

Common Name (eg, YOUR name) []:

Nom FQDN de la machine
Ici mysql-master.zataz.loc

Email Address []:

Votre adresse email
Ici eromang@zataz.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:


Taper sur entré

An optional company name []:

Taper sur entré

On supprime le mot de passe de la clé privé pour le demarrage :

mysql-master mysql # openssl rsa -in server-key.pem -out server-key.pem
Enter pass phrase for server-key.pem:
writing RSA key

Signature par l'autorité de certification (CA) du certificat serveur sur le serveur maître MySQL :

openssl ca -policy policy_anything -out server-cert.pem -config ../openssl.cnf -infiles server-req.pem

Using configuration from ../openssl.cnf
Enter pass phrase for /etc/ssl/mysql/private/cakey.pem:


Saississez le mot de passe de la clé privé de l'autorité de certification

Certificate is to be certified until Jun 10 12:14:03 2006 GMT (365 days)
Sign the certificate? [y/n]:


Vérifier les informations fournies et si celle-ci sont sûres signé le certificat en tapant y

1 out of 1 certificate requests certified, commit? [y/n]

Taper y

Write out database with 1 new entries
Data Base Updated

Création de la demande de certificat client et de sa clé privé sur le serveur client :

mkdir -p /etc/ssl/mysql/private
mkdir /etc/ssl/mysql/newcerts/
cd /etc/ssl/mysql


openssl req -new -keyout client-key.pem -out client-req.pem -days 3600 -config ../openssl.cnf

Enter PEM pass phrase:


On saisit le mot de passe désiré pour la clé privé du client.

Verifying - Enter PEM pass phrase:

On resaisi le mot de passe désiré pour la clé privée du client

Country Name (2 letter code) [AU]:

Entrer le code du pays dans lequel vous résidez.
Pour moi le Luxembourg, donc LU

State or Province Name (full name) [Some-State]:

Nom de l'Etat ou de la province ou vous résidez.
Pour moi Luxembourg :)

Locality Name (eg, city) []:

Nom de la ville dans laquelle vous résidez.
Toujours Luxembourg ;)

Organization Name (eg, company) [Internet Widgits Pty Ltd]:

Nom de l'organisation pour laquelle vous voulez créer cette clé privée.
Ici ZATAZ.net

Organizational Unit Name (eg, section) []:

Nom du département dans lequel vous travaillez.
ZATAZssl

Common Name (eg, YOUR name) []:

Nom FQDN de la machine
Ici mysql-slave.zataz.loc

Email Address []:

Votre adresse email
Ici eromang@zataz.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:


Taper sur entré

An optional company name []:

Taper sur entré

On supprime le mot de passe de la cle prive du client :

mysql-master mysql # openssl rsa -in server-key.pem -out server-key.pem
Enter pass phrase for server-key.pem:
writing RSA key

Signature de la demande de certificat client par l'autorité de certification (CA) sur le serveur maître MySQL :

Tout d'abord on envoi la demande de certificat client sur le serveur maître MySQL.

scp client-req.pem root@192.168.1.61:/etc/ssl/mysql/

On signe avec l'autorité de certification (CA) la demande de certificat du client :

openssl ca -policy policy_anything -out client-cert.pem -config ../openssl.cnf -infiles client-req.pem

Enter pass phrase for /etc/ssl/mysql/private/cakey.pem:


Entrez le mot de passe de l'autorité de certification et vérifier si la demande de certificat est bonne.

Après vérification vous pouvez signer celui-ci.

Sign the certificate? [y/n]:

Taper y

On envoi le certificat signé et le certificat de l'autorité de certification (CA) sur le serveur client

scp client-cert.pem cacert.pem root@192.168.1.65:/etc/ssl/mysql


Connexion SSL, ou X509, entre le client et serveur MySQL


Sur le serveur maître MySQL on modifie la configuration du fichier /etc/mysql/my.cnf

[mysqld]
ssl-ca=/etc/ssl/mysql/cacert.pem
ssl-cert=/etc/ssl/mysql/server-cert.pem
ssl-key=/etc/ssl/mysql/server-key.pem


On donne les droits a un utilisateur de se connecter sur le serveur maître de façon distante

mysql > GRANT SELECT ON test.* TO 'client'@'192.168.1.65' IDENTIFIED BY 'test' REQUIRE SSL;

Sur la machine client on modifie le fichier /etc/mysql/my.cnf

[client]
ssl-ca=/etc/ssl/mysql/cacert.pem
ssl-cert=/etc/ssl/mysql/client-cert.pem
ssl-key=/etc/ssl/mysql/client-key.pem


Maintenant nous pouvons tester une connexion sécurisée SSL depuis le client vers le serveur maître

mysql -h 192.168.1.61 -u client -p test --ssl

Notre connexion sécurisé SSL fonctionne.

Il est aussi possible de tester l'authentification par certificat en changeant les droits GRANT sur le serveur maître MySQL

mysql > GRANT SELECT ON test.* TO 'client'@'192.168.1.65' IDENTIFIED BY 'test' REQUIRE X509;

Réplication MySQL sécurisée par SSL ou X509

Pour tous ce qui est en rapport avec une réplication MySQL simple nous vous renvoyons vers notre documentation "Réplication MySQL".

Sur le serveur maître MySQL, il nous faut créer un compte client qui a les droits à la réplication uniquement en SSL ou X509

mysql > GRANT REPLICATION SLAVE ON *.* TO repli@192.168.1.65 IDENTIFIED BY 'test' REQUIRE SSL;

Pour le X509, il vous suffit de mettre :

mysql > GRANT REPLICATION SLAVE ON *.* TO repli@192.168.1.65 IDENTIFIED BY 'test' REQUIRE X509;

Sur le serveur esclave, configurez une réplication MySQL classique, puis :

mysql > CHANGE MASTER TO MASTER_SSL=1, MASTER_SSL_CA='cacert.pem', MASTER_SSL_CAPATH='/etc/ssl/mysql/', MASTER_SSL_CERT='/etc/ssl/mysql/client-cert.pem', MASTER_SSL_KEY='/etc/ssl/mysql/client-key.pem';

Pour activer la réplication, il vous suffit de lancer la commande :

mysql > slave start;

Nous voici avec une réplication MySQL cryptée qui vous permettra de sécurisé vos flux d'informations entre deux serveurs de base de données.


contentRight


valider