MySQL : Différence entre versions

De Wiki NCad
Aller à : navigation, rechercher
(Validation)
(Attribution de privilèges sur une base de données)
 
(23 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
== Installation ==
+
= Topologie =
  
{{ Box Console | objet=libhtml-template-perl mysql-server-5.5 mysql-server-core-5.5 }}
+
* Voici un schéma de la maquette qui sera utilisée pour illustrer cette documentation.
  
* À la question '''Nouveau mot de passe du superutilisateur MySQL''', renseigner le mot de passe du compte '''root''' pour '''MySQL''' ''(indépendant du compte root UNIX)''
+
[[Image:MySQL_Maquette|center]]
  
* Éditer le fichier '''/etc/mysql/my.cnf''' puis rechercher la ligne '''bind-address''' et indiquer l'adresse IP local de la machine où est installé '''MySQL'''.
+
= Installation =
  
bind-address                = 10.0.0.47
+
* Depuis '''Ubuntu''', le serveur '''MySQL''' s'installe depuis les paquets '''mysql-server''' et '''mysql-common'''.
  
* Redémarrer le service '''mysql''' pour appliquer les changements :
+
{{ Box Console | objet=sudo apt-get install mysql-server mysql-common }}
 +
 
 +
* Pendant le processus d'installation, vous serez invité à renseigner le mot de passe du compte '''root''' pour le serveur.
 +
 
 +
* Par défaut, le serveur écoute uniquement en local. Si vous souhaitez accéder au serveur depuis une autre machine, vous devez éditer le fichier de configuration '''/etc/mysql/my.cnf''' puis rechercher la ligne '''bind-address''' et indiquer l'adresse IP local du serveur ''(dans notre cas 10.0.0.44)''.
 +
 
 +
bind-address                = 10.0.0.44
 +
 
 +
{{ Box Attention | objet=Si votre serveur est équipé d'un pare-feu, vous devez ouvrir le port tcp 3306. }}
 +
 
 +
* Redémarrez le service '''mysql''' pour appliquer les changements :
  
 
{{ Box Console | objet=service mysql restart }}
 
{{ Box Console | objet=service mysql restart }}
Ligne 32 : Ligne 42 :
 
<br />
 
<br />
 
{{ Box Remarque | objet=Le compte root n'est accessible qu'en local uniquement. }}
 
{{ Box Remarque | objet=Le compte root n'est accessible qu'en local uniquement. }}
 +
 +
= Commandes de base =
 +
 +
== Création d'un utilisateur ==
  
 
* On va créer l'utilisateur '''cacheln''' avec le mot de passe '''cacheln''' pouvant se connecter au compte depuis '''n'importe quelle machine''' ''(%)'' :
 
* On va créer l'utilisateur '''cacheln''' avec le mot de passe '''cacheln''' pouvant se connecter au compte depuis '''n'importe quelle machine''' ''(%)'' :
Ligne 37 : Ligne 51 :
 
{{ Box Console | objet=CREATE USER 'cacheln'@'%' IDENTIFIED BY 'cacheln';<br />
 
{{ Box Console | objet=CREATE USER 'cacheln'@'%' IDENTIFIED BY 'cacheln';<br />
 
GRANT USAGE ON * . * TO 'cacheln'@'%' IDENTIFIED BY 'cacheln' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; }}
 
GRANT USAGE ON * . * TO 'cacheln'@'%' IDENTIFIED BY 'cacheln' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; }}
 +
 +
== Création d'une base de données ==
  
 
* On créer la base de données '''cacheln''' :
 
* On créer la base de données '''cacheln''' :
Ligne 42 : Ligne 58 :
 
{{ Box Console | objet=CREATE DATABASE IF NOT EXISTS `cacheln`; }}
 
{{ Box Console | objet=CREATE DATABASE IF NOT EXISTS `cacheln`; }}
  
* On attribut tous les privilège à l'utilisateur '''cacheln''' sur la base de données '''cacheln''' :
+
== Attribution de privilèges sur une base de données ==
  
{{ Box Console | objet=GRANT ALL PRIVILEGES ON `cacheln` . * TO 'cacheln'@'%'; }}
+
* On attribut tous les privilège à l'utilisateur '''cacheln''' sur la base de données '''cacheln''' :
  
== SSL ==
+
{{ Box Console | objet=GRANT ALL PRIVILEGES ON `cacheln` . * TO 'cacheln'@'%';
 +
GRANT ALL PRIVILEGES ON `cacheln` . * TO 'cacheln'@'%' WITH GRANT OPTIONS; }}
  
* Vérifier votre version de '''Openssl''' avant de poursuivre :
+
= Connexion SSL =
  
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">openssl version</span><br />
+
Si le serveur '''MySQL''' reçoit des connexions depuis des machines extérieures, il est conseillé de mettre en place un accès chiffré de type '''SSL''' afin de garantir '''l'intégrité''' et la '''confidentialité''' des échanges.
OpenSSL 1.0.1c 10 May 2012 }}
+
  
La version '''1.0.1c''' n'est pas supporté par '''MySQL'''. Il sera nécessaire d'installer une version antérieure pour poursuivre.
+
== Autorité de certification ==
  
=== Autorité de certification ===
+
=== Création de la clé privée ===
 
+
==== Création de la clé privée ====
+
  
 
* On se place dans le dossier '''/etc/ssl/private''' qui contient les clés et certificats privées :
 
* On se place dans le dossier '''/etc/ssl/private''' qui contient les clés et certificats privées :
Ligne 65 : Ligne 79 :
 
* On génère la clé privée :
 
* On génère la clé privée :
  
{{ Box Console | objet=sudo openssl genrsa -out ca.key 2048 -des3 }}
+
{{ Box Console | objet=sudo openssl genrsa -out ca.key 1024 -des3 }}
  
 
Cette clé va nous permettre de signer nos propres certificats.
 
Cette clé va nous permettre de signer nos propres certificats.
  
==== Création du certificat auto-signé ====
+
=== Création du certificat auto-signé ===
  
* On lance la création de certificat auto-signé :
+
* On lance la création du certificat auto-signé :
  
 
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">openssl req -new -x509 -nodes -days 365 -key ca.key -out ca.crt</span><br />
 
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">openssl req -new -x509 -nodes -days 365 -key ca.key -out ca.crt</span><br />
Ligne 89 : Ligne 103 :
 
Email Address []:<span style="font-family:sans-serif;color:blue">tech@ncad.fr</span> }}
 
Email Address []:<span style="font-family:sans-serif;color:blue">tech@ncad.fr</span> }}
  
=== Certificat serveur ===
+
== Certificat serveur ==
  
 
* On génère la clé privée :
 
* On génère la clé privée :
  
{{ Box Console | objet=sudo openssl genrsa -out mysql.key 2048 }}
+
{{ Box Console | objet=sudo openssl genrsa -out mysql.key 1024 }}
  
 
* On génère un fichier de demande de signature de certificat :
 
* On génère un fichier de demande de signature de certificat :
Ligne 110 : Ligne 124 :
 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:<span style="font-family:sans-serif;color:blue">NCad Network</span><br />
 
Organization Name (eg, company) [Internet Widgits Pty Ltd]:<span style="font-family:sans-serif;color:blue">NCad Network</span><br />
 
Organizational Unit Name (eg, section) []:<span style="font-family:sans-serif;color:blue">Intranet Goulouxiou</span><br />
 
Organizational Unit Name (eg, section) []:<span style="font-family:sans-serif;color:blue">Intranet Goulouxiou</span><br />
Common Name (e.g. server FQDN or YOUR name) []:<span style="font-family:sans-serif;color:blue">10.0.0.47</span><br />
+
Common Name (e.g. server FQDN or YOUR name) []:<span style="font-family:sans-serif;color:blue">10.0.0.44</span><br />
 
Email Address []:<span style="font-family:sans-serif;color:blue">tech@ncad.fr</span><br />
 
Email Address []:<span style="font-family:sans-serif;color:blue">tech@ncad.fr</span><br />
 
<br />
 
<br />
Ligne 121 : Ligne 135 :
  
 
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">openssl x509 -req -in mysql.csr -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -out mysql.crt</span><br />
 
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">openssl x509 -req -in mysql.csr -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -out mysql.crt</span><br />
 +
Signature ok<br />
 +
subject=/C=FR/ST=Paris/L=Paris/O=NCad Network/OU=Intranet <br />Goulouxiou/CN=10.0.0.44/emailAddress=tech@ncad.fr<br />
 +
Getting CA Private Key }}
 +
 +
== Certificat client ==
 +
 +
{{ Box Information | objet=On va générer un certificat pour que la machine cliente 10.0.0.47 puisse se connecter au serveur MySQL en utilisant le chiffrement SSL. }}
 +
 +
* On génère la clé privée :
 +
 +
{{ Box Console | objet=sudo openssl genrsa -out client.key 1024 }}
 +
 +
* On génère un fichier de demande de signature de certificat :
 +
 +
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">sudo openssl req -new -key client.key -out client.csr</span><br />
 +
<font color=grey>You are about to be asked to enter information that will be incorporated<br />
 +
into your certificate request.<br />
 +
What you are about to enter is what is called a Distinguished Name or a DN.<br />
 +
There are quite a few fields but you can leave some blank<br />
 +
For some fields there will be a default value,<br />
 +
If you enter '.', the field will be left blank.<br />
 +
- - - - -<br /></font>
 +
Country Name (2 letter code) [AU]:<span style="font-family:sans-serif;color:blue">FR</span><br />
 +
State or Province Name (full name) [Some-State]:<span style="font-family:sans-serif;color:blue">Paris</span><br />
 +
Locality Name (eg, city) []:<span style="font-family:sans-serif;color:blue">Paris</span><br />
 +
Organization Name (eg, company) [Internet Widgits Pty Ltd]:<span style="font-family:sans-serif;color:blue">NCad Network</span><br />
 +
Organizational Unit Name (eg, section) []:<span style="font-family:sans-serif;color:blue">Intranet Goulouxiou</span><br />
 +
Common Name (e.g. server FQDN or YOUR name) []:<span style="font-family:sans-serif;color:blue">10.0.0.47</span><br />
 +
Email Address []:<span style="font-family:sans-serif;color:blue">tech@ncad.fr</span><br />
 +
<br />
 +
Please enter the following 'extra' attributes<br />
 +
to be sent with your certificate request<br />
 +
A challenge password []:<span style="font-family:sans-serif;color:blue">N'importe quoi.</span><br />
 +
An optional company name []:<span style="font-family:sans-serif;color:blue">NCad Network</span> }}
 +
 +
* On signe notre certificat à l'aide du certificat auto-signé de notre autorité de certification ''(précédemment créée)'' :
 +
 +
{{ Box Console | objet=<span style="font-family:sans-serif;color:blue">openssl x509 -req -in client.csr -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt</span><br />
 
Signature ok<br />
 
Signature ok<br />
 
subject=/C=FR/ST=Paris/L=Paris/O=NCad Network/OU=Intranet <br />Goulouxiou/CN=10.0.0.47/emailAddress=tech@ncad.fr<br />
 
subject=/C=FR/ST=Paris/L=Paris/O=NCad Network/OU=Intranet <br />Goulouxiou/CN=10.0.0.47/emailAddress=tech@ncad.fr<br />
 
Getting CA Private Key }}
 
Getting CA Private Key }}
  
=== Configuration du serveur MySQL ===
+
* Les fichiers '''client.crt''', '''client.key''' et '''ca.pem''' devront être copiés sur la machine cliente '''10.0.0.47''' dans notre cas.
 +
 
 +
{{ Box Remarque | objet=On aurez pu tout aussi bien générer le certificat directement depuis le machine cliente. Dans ce cas, nous aurions eu seulement besoin de copier le fichier ca.pem pour signer le certificat nouvellement généré. }}
 +
 
 +
== Configuration du serveur MySQL ==
  
 
* On déplace les certificats crées dans '''/etc/ssl/private''' vers '''/etc/mysql/ssl'''
 
* On déplace les certificats crées dans '''/etc/ssl/private''' vers '''/etc/mysql/ssl'''
Ligne 161 : Ligne 217 :
 
{{ Box Console | objet=service mysql restart }}
 
{{ Box Console | objet=service mysql restart }}
  
=== Validation ===
+
== Validation ==
  
mysql -u root --ssl-ca=/etc/mysql/ssl/ca.pem --ssl-cert=/etc/mysql/ssl/client.crt --ssl-key=/etc/mysql/ssl/client.key -p
+
=== Connexion sans chiffrement ===
 +
 
 +
* Voici une capture de trame entre une connexion '''MySQL''' du '''client''' à l'adresse '''10.0.0.47''' au '''serveur''' MySQL à l'adresse '''10.0.0.44''' :
 +
 
 +
[[Image:MySQL_Clear.png|thumb|center|550px]]
 +
 
 +
<p style="font-family:cursive; text-align:center">Nous remarquons les divers échanges '''Request''' et '''Response''' entre le client et le serveur.</p>
 +
 
 +
=== Etat du module SSL ===
 +
 
 +
* On se connecte normalement au '''serveur MySQL''' :
 +
 
 +
{{ Box Console | objet=mysql -h 10.0.0.44 -u cacheln -p}}
 +
 
 +
* Une fois le prompt prêt on saisit la commande '''show variables like "%ssl%";''' :
 +
 
 +
{{ Box Console | objet=mysql> show variables like "%ssl%"; }}
 +
 
 +
* Et qui doit retourner :
  
mysql> show variables like "%ssl%";
 
 
  +---------------+--------------------------+
 
  +---------------+--------------------------+
 
  | Variable_name | Value                    |
 
  | Variable_name | Value                    |
 
  +---------------+--------------------------+
 
  +---------------+--------------------------+
  | have_openssl  | YES                      |
+
  | have_openssl  | <font color=green>YES</font>                     |
  | have_ssl      | YES                      |
+
  | have_ssl      | <font color=green>YES</font>                     |
 
  | ssl_ca        | /etc/mysq/ssl/ca.crt    |
 
  | ssl_ca        | /etc/mysq/ssl/ca.crt    |
 
  | ssl_capath    |                          |
 
  | ssl_capath    |                          |
Ligne 179 : Ligne 252 :
 
  7 rows in set (0.02 sec)
 
  7 rows in set (0.02 sec)
  
mysql> show status like 'Ssl_cipher';
+
Les lignes '''have_openssl''' et '''have_ssl''' indique que le chiffrement au niveau du serveur est '''opérationnel'''.
 +
 
 +
=== Connexion avec chiffrement ===
 +
 
 +
* Depuis notre '''machine client''' en '''10.0.0.47''', nous allons nous connecter au '''serveur MySQL''' en '''10.0.0.44''' :
 +
 
 +
{{ Box Console | objet=mysql -h 10.0.0.44 -u cacheln -p --ssl-ca=/etc/mysql/ssl/ca.pem --ssl-cert=/etc/mysql/ssl/client.crt --ssl-key=/etc/mysql/ssl/client.key }}
 +
 
 +
* Une fois le prompt prêt on saisit la commande '''show variables like "%ssl%";''' :
 +
 
 +
{{ Box Console | objet= mysql> show status like 'Ssl_cipher'; }}
 +
 
 +
* Et qui doit retourner :
 +
 
 
  +---------------+--------------------+
 
  +---------------+--------------------+
 
  | Variable_name | Value              |
 
  | Variable_name | Value              |
 
  +---------------+--------------------+
 
  +---------------+--------------------+
  | Ssl_cipher    | DHE-RSA-AES256-SHA |
+
  | Ssl_cipher    | <font color=green>DHE-RSA-AES256-SHA</font> |
 
  +---------------+--------------------+
 
  +---------------+--------------------+
 
  1 row in set (0.01 sec)
 
  1 row in set (0.01 sec)
 +
 +
La ligne '''Ssl_cipher''' nous indique le mode de chiffrement employé. Si ce dernier n'était pas utilisé pour la connexion en cours, la valeur aurait été nulle.
 +
 +
* Maintenant, voici une capture de trame entre une connexion '''MySQL''' du '''client''' à l'adresse '''10.0.0.47''' au '''serveur MySQL''' à l'adresse '''10.0.0.44''' :
 +
 +
[[Image:MySQL_SSL.png|thumb|center|550px]]
 +
 +
<p style="font-family:cursive; text-align:center">Nous remarquons que les échanges '''Request''' et '''Response''' entre le client et le serveur ne sont plus visibles. La totalité des échanges sont chiffrés.</p>

Version actuelle en date du 8 avril 2021 à 09:38

Topologie

  • Voici un schéma de la maquette qui sera utilisée pour illustrer cette documentation.

Installation

  • Depuis Ubuntu, le serveur MySQL s'installe depuis les paquets mysql-server et mysql-common.
ICON Terminal.png

sudo apt-get install mysql-server mysql-common

  • Pendant le processus d'installation, vous serez invité à renseigner le mot de passe du compte root pour le serveur.
  • Par défaut, le serveur écoute uniquement en local. Si vous souhaitez accéder au serveur depuis une autre machine, vous devez éditer le fichier de configuration /etc/mysql/my.cnf puis rechercher la ligne bind-address et indiquer l'adresse IP local du serveur (dans notre cas 10.0.0.44).
bind-address                 = 10.0.0.44
ICON boxWarning.png

Si votre serveur est équipé d'un pare-feu, vous devez ouvrir le port tcp 3306.

  • Redémarrez le service mysql pour appliquer les changements :
ICON Terminal.png

service mysql restart

  • Première connexion au serveur avec le compte root :
ICON Terminal.png

mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 42
Server version: 5.5.35-0ubuntu0.12.04.2 (Ubuntu)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


ICON Light.png
Le compte root n'est accessible qu'en local uniquement.

Commandes de base

Création d'un utilisateur

  • On va créer l'utilisateur cacheln avec le mot de passe cacheln pouvant se connecter au compte depuis n'importe quelle machine (%) :
ICON Terminal.png

CREATE USER 'cacheln'@'%' IDENTIFIED BY 'cacheln';
GRANT USAGE ON * . * TO 'cacheln'@'%' IDENTIFIED BY 'cacheln' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

Création d'une base de données

  • On créer la base de données cacheln :
ICON Terminal.png

CREATE DATABASE IF NOT EXISTS `cacheln`;

Attribution de privilèges sur une base de données

  • On attribut tous les privilège à l'utilisateur cacheln sur la base de données cacheln :
ICON Terminal.png

GRANT ALL PRIVILEGES ON `cacheln` . * TO 'cacheln'@'%'; GRANT ALL PRIVILEGES ON `cacheln` . * TO 'cacheln'@'%' WITH GRANT OPTIONS;

Connexion SSL

Si le serveur MySQL reçoit des connexions depuis des machines extérieures, il est conseillé de mettre en place un accès chiffré de type SSL afin de garantir l'intégrité et la confidentialité des échanges.

Autorité de certification

Création de la clé privée

  • On se place dans le dossier /etc/ssl/private qui contient les clés et certificats privées :
ICON Terminal.png

cd /etc/ssl/private

  • On génère la clé privée :
ICON Terminal.png

sudo openssl genrsa -out ca.key 1024 -des3

Cette clé va nous permettre de signer nos propres certificats.

Création du certificat auto-signé

  • On lance la création du certificat auto-signé :
ICON Terminal.png

openssl req -new -x509 -nodes -days 365 -key ca.key -out ca.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
- - - --
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NCad Network
Organizational Unit Name (eg, section) []:Autorité de certification
Common Name (e.g. server FQDN or YOUR name) []:Murdoc Certificats pour GLX
Email Address []:tech@ncad.fr

Certificat serveur

  • On génère la clé privée :
ICON Terminal.png

sudo openssl genrsa -out mysql.key 1024

  • On génère un fichier de demande de signature de certificat :
ICON Terminal.png

sudo openssl req -new -key mysql.key -out mysql.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
- - - - -
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NCad Network
Organizational Unit Name (eg, section) []:Intranet Goulouxiou
Common Name (e.g. server FQDN or YOUR name) []:10.0.0.44
Email Address []:tech@ncad.fr

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:N'importe quoi.
An optional company name []:NCad Network

  • On signe notre certificat à l'aide du certificat auto-signé de notre autorité de certification (précédemment créée) :
ICON Terminal.png

openssl x509 -req -in mysql.csr -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -out mysql.crt
Signature ok
subject=/C=FR/ST=Paris/L=Paris/O=NCad Network/OU=Intranet
Goulouxiou/CN=10.0.0.44/emailAddress=tech@ncad.fr
Getting CA Private Key

Certificat client

ICON Information.png

On va générer un certificat pour que la machine cliente 10.0.0.47 puisse se connecter au serveur MySQL en utilisant le chiffrement SSL.

  • On génère la clé privée :
ICON Terminal.png

sudo openssl genrsa -out client.key 1024

  • On génère un fichier de demande de signature de certificat :
ICON Terminal.png

sudo openssl req -new -key client.key -out client.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
- - - - -
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Paris
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:NCad Network
Organizational Unit Name (eg, section) []:Intranet Goulouxiou
Common Name (e.g. server FQDN or YOUR name) []:10.0.0.47
Email Address []:tech@ncad.fr

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:N'importe quoi.
An optional company name []:NCad Network

  • On signe notre certificat à l'aide du certificat auto-signé de notre autorité de certification (précédemment créée) :
ICON Terminal.png

openssl x509 -req -in client.csr -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
Signature ok
subject=/C=FR/ST=Paris/L=Paris/O=NCad Network/OU=Intranet
Goulouxiou/CN=10.0.0.47/emailAddress=tech@ncad.fr
Getting CA Private Key

  • Les fichiers client.crt, client.key et ca.pem devront être copiés sur la machine cliente 10.0.0.47 dans notre cas.
ICON Light.png
On aurez pu tout aussi bien générer le certificat directement depuis le machine cliente. Dans ce cas, nous aurions eu seulement besoin de copier le fichier ca.pem pour signer le certificat nouvellement généré.

Configuration du serveur MySQL

  • On déplace les certificats crées dans /etc/ssl/private vers /etc/mysql/ssl
ICON Terminal.png

sudo mkdir -p /etc/mysql/ssl
cp /etc/ssl/private/ca.* /etc/mysql/ssl
cp /etc/ssl/private/mysql.* /etc/mysql/ssl

  • On applique les permissions et droits mysql sur les certificats :
ICON Terminal.png

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

  • On édite le fichier /etc/apparmor.d/usr.sbin.mysqld et on remplace :
/etc/mysql/*.pem r,
  • Par :
/etc/mysql/ssl/*.pem r,
/etc/mysql/ssl/*.crt r,
/etc/mysql/ssl/*.key r,
  • On redémarre le service apparmor pour appliquer les modifications :
ICON Terminal.png

service apparmor restart

  • On édite le fichier de configuration /etc/mysql/my.cnf et on y dé-commente et adapte les lignes suivantes dans la section [mysqld] :
ssl-ca=/etc/mysq/ssl/ca.crt
ssl-cert=/etc/mysql/ssl/mysql.crt
ssl-key=/etc/mysql/ssl/mysql.key
  • On redémarre le service mysql pour appliquer les modifications :
ICON Terminal.png

service mysql restart

Validation

Connexion sans chiffrement

  • Voici une capture de trame entre une connexion MySQL du client à l'adresse 10.0.0.47 au serveur MySQL à l'adresse 10.0.0.44 :
MySQL Clear.png

Nous remarquons les divers échanges Request et Response entre le client et le serveur.

Etat du module SSL

  • On se connecte normalement au serveur MySQL :
ICON Terminal.png

mysql -h 10.0.0.44 -u cacheln -p

  • Une fois le prompt prêt on saisit la commande show variables like "%ssl%"; :
ICON Terminal.png

mysql> show variables like "%ssl%";

  • Et qui doit retourner :
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| have_openssl  | YES                      |
| have_ssl      | YES                      |
| ssl_ca        | /etc/mysq/ssl/ca.crt     |
| ssl_capath    |                          |
| ssl_cert      | /etc/mysql/ssl/mysql.crt |
| ssl_cipher    |                          |
| ssl_key       | /etc/mysql/ssl/mysql.key |
+---------------+--------------------------+
7 rows in set (0.02 sec)

Les lignes have_openssl et have_ssl indique que le chiffrement au niveau du serveur est opérationnel.

Connexion avec chiffrement

  • Depuis notre machine client en 10.0.0.47, nous allons nous connecter au serveur MySQL en 10.0.0.44 :
ICON Terminal.png

mysql -h 10.0.0.44 -u cacheln -p --ssl-ca=/etc/mysql/ssl/ca.pem --ssl-cert=/etc/mysql/ssl/client.crt --ssl-key=/etc/mysql/ssl/client.key

  • Une fois le prompt prêt on saisit la commande show variables like "%ssl%"; :
ICON Terminal.png

mysql> show status like 'Ssl_cipher';

  • Et qui doit retourner :
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| Ssl_cipher    | DHE-RSA-AES256-SHA |
+---------------+--------------------+
1 row in set (0.01 sec)

La ligne Ssl_cipher nous indique le mode de chiffrement employé. Si ce dernier n'était pas utilisé pour la connexion en cours, la valeur aurait été nulle.

  • Maintenant, voici une capture de trame entre une connexion MySQL du client à l'adresse 10.0.0.47 au serveur MySQL à l'adresse 10.0.0.44 :
MySQL SSL.png

Nous remarquons que les échanges Request et Response entre le client et le serveur ne sont plus visibles. La totalité des échanges sont chiffrés.