Documentation : Connexions et réplications sécurisées avec MySQL 4.x
Date de publication : 10.6.2005
Date de modification : 9.11.2005
|
|
Sommaire
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 :
|
Création de la demande de certificat et de la clé privé serveur sur le serveur maître MySQL :
|
Signature par l'autorité de certification (CA) du certificat serveur sur le serveur maître MySQL :
|
Création de la demande de certificat client et de sa clé privé sur le serveur client :
|
Signature de la demande de certificat client par l'autorité de certification (CA) sur le serveur maître 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.
Contributeur : Eric Romang