From a0a1923dcfd9ad664c30de43946276aceda4736b Mon Sep 17 00:00:00 2001 From: emorino Date: Wed, 26 Jan 2022 15:57:10 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20doc=20cr=C3=A9ation=20certificat=20+=20?= =?UTF-8?q?configuration=20instance=20mysql=20pour=20SSL=20/=20TLS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtoMySQL.md | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/HowtoMySQL.md b/HowtoMySQL.md index 92604e8c..b2f21108 100644 --- a/HowtoMySQL.md +++ b/HowtoMySQL.md @@ -1786,6 +1786,108 @@ Il est possible de filtrer le type d'événements avec la variable `server_audit La rotation des logs est automatique, mais personnalisable. +## Activé la connexion via SSL/TLS à la base de données + +### Principe de fonctionnement + +On génère une CA (clé privée et certificat) pour pouvoir signé une certificat serveur et client. + +On ajoute le certificat serveur dans la configuration du serveur MySQL. + +Le certificat client sert a se connecter au instances MySQL en SSL, soit avec PhpMyAdmin soit avec mysql-client, ou autres. + +On par du principe qu'on l'on créer les clés / certificats dans _/etc/mysql/ssl_ + +### Création de la CA + +On créé la CA comme ceci : + +~~~ +# openssl genrsa 4096 > mysql-ca-key.pem +# openssl req -new -x509 -nodes -days 365000 -key mysql-ca-key.pem -out mysql-ca-cert.pem +~~~ + +### Création du certificat SSL serveur + +On créé le certificat serveur comme ceci, ne général on mets comme Common Name le hostname du serveur : + +~~~ +# openssl req -newkey rsa:2048 -days 365 -nodes -keyout mysql-server-key.pem -out mysql-server-req.pem +# openssl rsa -in mysql-server-key.pem -out mysql-server-key.pem +# openssl x509 -req -in mysql-server-req.pem -days 365 -CA mysql-ca-cert.pem -CAkey mysql-ca-key.pem -set_serial 01 -out mysql-server-cert.pem +~~~ + +### Création du certificat SSL client + +On créé le certificat client comme ceci, le Common Name est identique à celui du serveur : + +~~~ +# openssl req -newkey rsa:2048 -days 365 -nodes -keyout mysql-client-key.pem -out mysql-client-req.pem +# openssl rsa -in mysql-client-key.pem -out mysql-client-key.pem +# openssl x509 -req -in mysql-client-req.pem -days 365 -CA mysql-ca-cert.pem -CAkey mysql-ca-key.pem -set_serial 01 -out mysql-client-cert.pem +~~~ + +On vérifie la correspondance des certificats entre le certificat serveur et client comme ceci : + +~~~ +# openssl verify -CAfile mysql-ca-cert.pem mysql-server-cert.pem mysql-client-cert.pem +mysql-server-cert.pem: OK +mysql-client-cert.pem: OK +~~~ + +### Installation du certificat SSL serveur sur une instance MySQL + +Il faut possitionner les bons droits sur les certificats comme ceci : + +~~~ +# chown -Rv mysql:root /etc/mysql/ssl/ +~~~ + +Puis on mets cette configuration dans _/etc/mysql/mariadb.conf.d/zzz-evolinux-custom.cnf_ + +~~~ +# SSL +ssl = on +ssl-ca = /etc/mysql/ssl/mysql-ca-cert.pem +ssl-cert = /etc/mysql/ssl/mysql-server-cert.pem +ssl-key = /etc/mysql/ssl/mysql-server-key.pem +ssl-cipher = AES256-SHA +~~~ + +Un redémarrage de mysql / mariadb est necessaire : + +~~~ +# systemctl restart mysql.service +~~~ + +On peux vérifié que c'est bien pris en compte sur l'instance : + +~~~ +mysql> show variables like '%ssl%'; ++--------------------+--------------------------------------+ +| Variable_name | Value | ++--------------------+--------------------------------------+ +| have_openssl | YES | +| have_ssl | YES | +| mysqlx_ssl_ca | | +| mysqlx_ssl_capath | | +| mysqlx_ssl_cert | | +| mysqlx_ssl_cipher | | +| mysqlx_ssl_crl | | +| mysqlx_ssl_crlpath | | +| mysqlx_ssl_key | | +| ssl_ca | /etc/mysql/ssl/mysql-ca-cert.pem | +| ssl_capath | | +| ssl_cert | /etc/mysql/ssl/mysql-server-cert.pem | +| ssl_cipher | AES256-SHA | +| ssl_crl | | +| ssl_crlpath | | +| ssl_fips_mode | OFF | +| ssl_key | /etc/mysql/ssl/mysql-server-key.pem | ++--------------------+--------------------------------------+ +17 rows in set (0.00 sec) +~~~ + ## Optimisation avancée Voir [/HowtoMySQL/Optimize]().