Comment configurer SSL / TLS pour MySQL sur Ubuntu 18.04

introduction

MySQL est le système de gestion de base de données relationnelle open-source demost populardans le monde. Bien que les gestionnaires de paquets modernes aient réduit les difficultés liées à la mise en service de MySQL, il reste encore quelques configurations à effectuer après l’avoir installé. La sécurité est l’un des aspects les plus importants sur lesquels il faut passer du temps.

Par défaut, MySQL est configuré pour n'accepter que les connexions locales, ou celles provenant de la même machine sur laquelle MySQL est installé. Si vous devez accéder à votre base de données MySQL depuis un emplacement distant, il est important de le faire en toute sécurité. Dans ce guide, nous montrerons comment configurer MySQL sur Ubuntu 18.04 pour accepter les connexions distantes avec cryptage SSL / TLS.

Conditions préalables

Pour compléter ce guide, vous aurez besoin de:

  • Serveurs Ubuntu 18.04Two. Nous utiliserons l’un de ces serveurs en tant que serveur MySQL, tandis que nous utiliserons l’autre en tant que machine cliente. Créez un utilisateur non root avec les privilègessudo et activez un pare-feu avecufw sur chacun de ces serveurs. Suivez nosUbuntu 18.04 initial server setup guide pour mettre les deux serveurs dans l'état initial approprié.

  • Surone of the machines, installez et configurez le serveur MySQL. SuivezSteps 1 through 3 de nosMySQL installation guide for Ubuntu 18.04 pour ce faire. En suivant ce guide, assurez-vous de configurer votre utilisateur MySQLroot pour qu'il s'authentifie avec un mot de passe, comme décrit dansStep 3 du guide, car cela est nécessaire pour se connecter à MySQL en utilisant TCP plutôt que le local Socket Unix.

Veuillez noter que tout au long de ce guide, le serveur sur lequel vous avez installé MySQL sera appeléMySQL server et toutes les commandes devant être exécutées sur cette machine seront affichées avec un arrière-plan bleu, comme ceci:

De même, ce guide fera référence à l'autre serveur en tant queMySQL client et toutes les commandes qui doivent être exécutées sur cette machine seront affichées avec un arrière-plan rouge:

Gardez cela à l'esprit lorsque vous suivez ce tutoriel afin d'éviter toute confusion.

[[step-1 -—- checking-mysql-39-s-current-ssl-tls-status]] == Étape 1 - Vérification du statut SSL / TLS actuel de MySQL

Avant d'apporter des modifications à la configuration, vous pouvez vérifier l'état actuel de SSL / TLS sur l'instanceMySQL server.

Utilisez la commande suivante pour démarrer une session MySQL en tant qu'utilisateur MySQLroot. Cette commande inclut l'option-p, qui demande àmysql de vous demander un mot de passe pour vous connecter. Il inclut également l'option-h qui est utilisée pour spécifier l'hôte auquel se connecter. Dans ce cas, il pointe vers127.0.0.1, l'interface de bouclage IPv4 également connue sous le nom delocalhost. Cela forcera le client à se connecter avecTCP au lieu d'utiliser le fichier socket local. MySQL tente de se connecter via unUnix socket file par défaut. C’est généralement plus rapide et plus sûr, car ces connexions ne peuvent être établies que localement et n’ont pas à passer par toutes les vérifications et opérations de routage que les connexions TCP doivent effectuer. La connexion avec TCP nous permet toutefois de vérifier l’état de la connexion par SSL:

mysql -u root -p -h 127.0.0.1

Vous serez invité à entrer le mot de passe MySQLroot que vous avez choisi lors de l'installation et de la configuration de MySQL. Une fois entré, vous serez dirigé vers une session interactive MySQL.

Affiche l'état des variables SSL / TLS à l'aide de la commande suivante:

SHOW VARIABLES LIKE '%ssl%';
Output+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_crl       |          |
| ssl_crlpath   |          |
| ssl_key       |          |
+---------------+----------+
9 rows in set (0.01 sec)

Les variableshave_openssl ethave_ssl sont toutes deux marquées commeDISABLED. Cela signifie que la fonctionnalité SSL a été compilée sur le serveur, mais qu'elle n'est pas encore activée.

Vérifiez l'état de votre connexion actuelle pour le confirmer:

\s
Output--------------
mysql  Ver 14.14 Distrib 5.7.26, for Linux (x86_64) using  EditLine wrapper

Connection id:      9
Current database:
Current user:       root@localhost
SSL:         Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.26-0ubuntu0.18.04.1 (Ubuntu)
Protocol version:   10
Connection:      127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:       3306
Uptime:         40 min 11 sec

Threads: 1  Questions: 33  Slow queries: 0  Opens: 113  Flush tables: 1  Open tables: 106  Queries per second avg: 0.013
--------------

Comme indiqué ci-dessus, SSL n’est pas utilisé pour cette connexion, même si vous êtes connecté via TCP.

Fermez la session MySQL en cours lorsque vous avez terminé:

exit

Maintenant que vous avez confirmé que votre serveur MySQL n’utilise pas SSL, vous pouvez passer à l’étape suivante, où vous allez commencer le processus d’activation de SSL en générant des certificats et des clés. Ceux-ci permettront à votre serveur et à votre client de communiquer en toute sécurité.

[[step-2 -—- generation-ssl-tls-certificates-and-keys]] == Étape 2 - Génération de certificats et de clés SSL / TLS

Pour activer les connexions SSL à MySQL, vous devez d’abord générer le certificat et les fichiers de clé appropriés. Les versions 5.7 et supérieures de MySQL fournissent un utilitaire appelémysql_ssl_rsa_setup qui permet de simplifier ce processus. La version de MySQL que vous avez installée en suivant lesprerequisite MySQL tutorial inclut cet utilitaire, nous allons donc l'utiliser ici pour générer les fichiers nécessaires.

Le processus MySQL doit être capable de lire les fichiers générés, utilisez donc l'option--uid pour déclarermysql en tant qu'utilisateur système qui devrait posséder les fichiers générés:

sudo mysql_ssl_rsa_setup --uid=mysql

Cela produira une sortie semblable à celle-ci:

OutputGenerating a 2048 bit RSA private key
.+++
..........+++
writing new private key to 'ca-key.pem'
-----
Generating a 2048 bit RSA private key
........................................+++
............+++
writing new private key to 'server-key.pem'
-----
Generating a 2048 bit RSA private key
.................................+++
............................................................+++
writing new private key to 'client-key.pem'
-----

Ces nouveaux fichiers seront stockés dans le répertoire de données de MySQL, situé par défaut à/var/lib/mysql. Vérifiez les fichiers générés en tapant:

sudo find /var/lib/mysql -name '*.pem' -ls
Output   258930      4 -rw-r--r--   1 mysql    mysql        1107 May  3 16:43 /var/lib/mysql/client-cert.pem
   258919      4 -rw-r--r--   1 mysql    mysql         451 May  3 16:43 /var/lib/mysql/public_key.pem
   258925      4 -rw-------   1 mysql    mysql        1675 May  3 16:43 /var/lib/mysql/server-key.pem
   258927      4 -rw-r--r--   1 mysql    mysql        1107 May  3 16:43 /var/lib/mysql/server-cert.pem
   258922      4 -rw-------   1 mysql    mysql        1675 May  3 16:43 /var/lib/mysql/ca-key.pem
   258928      4 -rw-------   1 mysql    mysql        1675 May  3 16:43 /var/lib/mysql/client-key.pem
   258924      4 -rw-r--r--   1 mysql    mysql        1107 May  3 16:43 /var/lib/mysql/ca.pem
   258918      4 -rw-------   1 mysql    mysql        1679 May  3 16:43 /var/lib/mysql/private_key.pem

Ces fichiers sont les paires clé / certificat pour l'autorité de certification (en commençant par «ca»), le processus serveur MySQL (en commençant par «serveur») et pour les clients MySQL (en commençant par «client»). De plus, les fichiersprivate_key.pem etpublic_key.pem sont utilisés par MySQL pour transférer en toute sécurité les mots de passe lorsque vous n'utilisez pas SSL.

Maintenant que vous avez le certificat et les fichiers de clés nécessaires, continuez pour activer l'utilisation de SSL sur votre instance MySQL.

[[step-3 -—- enabled-ssl-connections-on-the-mysql-server]] == Étape 3 - Activation des connexions SSL sur le serveur MySQL

Les versions modernes de MySQL recherchent les fichiers de certificat appropriés dans le répertoire de données MySQL à chaque démarrage du serveur. De ce fait, vous n'avez pas besoin de modifier la configuration de MySQL pour activer SSL.

Activez plutôt SSL en redémarrant le service MySQL:

sudo systemctl restart mysql

Après le redémarrage, ouvrez une nouvelle session MySQL en utilisant la même commande que précédemment. Le client MySQL essaiera automatiquement de se connecter en utilisant SSL s'il est supporté par le serveur:

mysql -u root -p -h 127.0.0.1

Examinons à nouveau les mêmes informations que nous avions demandées la dernière fois. Vérifiez les valeurs des variables liées à SSL:

SHOW VARIABLES LIKE '%ssl%';
Output+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| have_openssl  | YES             |
| have_ssl      | YES             |
| ssl_ca        | ca.pem          |
| ssl_capath    |                 |
| ssl_cert      | server-cert.pem |
| ssl_cipher    |                 |
| ssl_crl       |                 |
| ssl_crlpath   |                 |
| ssl_key       | server-key.pem  |
+---------------+-----------------+
9 rows in set (0.00 sec)

Les variableshave_openssl ethave_ssl lisent désormaisYES au lieu deDISABLED. De plus, les variablesssl_ca,ssl_cert etssl_key ont été remplies avec les noms des fichiers respectifs que nous venons de générer.

Ensuite, vérifiez à nouveau les détails de la connexion:

\s
Output--------------
. . .
SSL:            Cipher in use is DHE-RSA-AES256-SHA
. . .
Connection:      127.0.0.1 via TCP/IP
. . .
--------------

Cette fois, le chiffrement SSL spécifique est affiché, indiquant que SSL est utilisé pour sécuriser la connexion.

Sortez vers le shell:

exit

Votre serveur est maintenant capable d'utiliser le cryptage, mais une configuration supplémentaire est requise pour permettre l'accès à distance et imposer l'utilisation de connexions sécurisées.

[[step-4 -—- configuring-secure-connections-for-remote-clients]] == Étape 4 - Configuration des connexions sécurisées pour les clients distants

Maintenant que vous avez activé SSL sur le serveur MySQL, vous pouvez commencer à configurer un accès distant sécurisé. Pour ce faire, vous allez configurer votre serveur MySQL de manière à ce que toute connexion distante soit établie via SSL, lier MySQL pour écouter sur une interface publique et ajuster les règles de pare-feu de votre système pour autoriser les connexions externes.

Actuellement, le serveur MySQL est configuré pour accepter les connexions SSL des clients. Cependant, il autorisera toujours les connexions non chiffrées si le client le demande. Nous pouvons changer cela en activant l'optionrequire_secure_transport. Cela nécessite que toutes les connexions soient établies avec SSL ou avec un socket Unix local. Etant donné que les sockets Unix ne sont accessibles que depuis le serveur lui-même, la seule option de connexion disponible pour les utilisateurs distants sera SSL.

Pour activer ce paramètre, ouvrez le fichier de configuration MySQL dans votre éditeur de texte préféré. Ici, nous utiliseronsnano:

sudo nano /etc/mysql/my.cnf

À l'intérieur, il y aura deux directives!includedir qui sont utilisées pour générer des fichiers de configuration supplémentaires. Vous devez ajouter votre propre configurationbeneathà ces lignes afin qu'elle remplace tous les paramètres en conflit trouvés dans ces fichiers de configuration supplémentaires.

Commencez par créer une section[mysqld] pour cibler le processus serveur MySQL. Sous cet en-tête de section, définissezrequire_secure_transport surON, ce qui forcera MySQL à n'autoriser que les connexions sécurisées:

/etc/mysql/my.cnf

. . .

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
# Require clients to connect either using SSL
# or through a local socket file
require_secure_transport = ON

Par défaut, MySQL est configuré pour n'écouter que les connexions provenant de127.0.0.1, l'adresse IP de bouclage qui représentelocalhost. Cela signifie que MySQL est configuré pour n'écouter que les connexions provenant de la machine sur laquelle le serveur MySQL est installé.

Afin de permettre à MySQL d'écouter les connexions externes, vous devez le configurer pour écouter les connexions sur une adresse IP deexternal. Pour ce faire, vous pouvez ajouter le paramètrebind-address et le pointer vers0.0.0.0, une adresse IP générique qui représente toutes les adresses IP. Cela obligera MySQL à écouter les connexions sur toutes les interfaces:

/etc/mysql/my.cnf

. . .

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
# Require clients to connect either using SSL
# or through a local socket file
require_secure_transport = ON
bind-address = 0.0.0.0

[.note] #Note: Vous pouvez également définirbind-address sur l'adresse IP publique de votreMySQL server’s. Cependant, vous devrez vous rappeler de mettre à jour votre fichiermy.cnf si jamais vous migrez votre base de données vers une autre machine.
#

Après avoir ajouté ces lignes, enregistrez et fermez le fichier. Si vous avez utilisénano pour éditer le fichier, vous pouvez le faire en appuyant surCTRL+X,Y, puisENTER.

Ensuite, redémarrez MySQL pour appliquer les nouveaux paramètres:

sudo systemctl restart mysql

Vérifiez que MySQL écoute sur0.0.0.0 au lieu de127.0.0.1 en tapant:

sudo netstat -plunt

Le résultat de cette commande ressemblera à ceci:

OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:3306      0.0.0.0:*               LISTEN      13317/mysqld
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1293/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1293/sshd

Les0.0.0.0 mis en évidence dans la sortie ci-dessus indiquent que MySQL écoute les connexions sur toutes les interfaces disponibles.

Ensuite, autorisez les connexions MySQL via le pare-feu de votre serveur. Ajoutez une exception à vos règlesufw en tapant:

sudo ufw allow mysql
OutputRule added
Rule added (v6)

Avec cela, les tentatives de connexion à distance peuvent maintenant atteindre votre serveur MySQL. Cependant, aucun utilisateur configuré ne peut actuellement se connecter depuis un ordinateur distant. Nous allons créer et configurer un utilisateur MySQL pouvant se connecter à partir de votre ordinateur client à l’étape suivante.

[[step-5 -—- Creating-a-dédié-mysql-user]] == Étape 5 - Création d'un utilisateur MySQL dédié

À ce stade, votre serveur MySQL rejettera toute tentative de connexion depuis un ordinateur client distant. En effet, les utilisateurs MySQL existants sont tous configurés pour se connecter localement à partir du serveur MySQL. Pour résoudre ce problème, vous allez créer un utilisateur dédié qui ne pourra se connecter qu'à partir de votre ordinateur client.

Pour créer un tel utilisateur, reconnectez-vous à MySQL en tant qu'utilisateurroot:

mysql -u root -p

À partir de l'invite, créez un nouvel utilisateur distant avec la commandeCREATE USER. Vous pouvez nommer cet utilisateur comme vous le souhaitez, mais dans ce guide, nous le nommonsmysql_user. Veillez à spécifier l'adresse IP de votre machine cliente dans la partie hôte de la spécification utilisateur pour restreindre les connexions à cette machine et pour remplacerpassword par un mot de passe sécurisé de votre choix. De plus, pour une certaine redondance au cas où l'optionrequire_secure_transport serait désactivée à l'avenir, spécifiez que cet utilisateur requiert SSL en incluant la clauseREQUIRE SSL, comme indiqué ici:

CREATE USER 'mysql_user'@'your_mysql_client_IP' IDENTIFIED BY 'password' REQUIRE SSL;

Ensuite, accordez aux nouveaux utilisateurs des autorisations sur les bases de données ou les tables auxquelles ils devraient avoir accès. Pour démontrer, créez une base de donnéesexample:

CREATE DATABASE example;

Puis, donnez à votre nouvel utilisateur l’accès à cette base de données et à toutes ses tables:

GRANT ALL ON example.* TO 'mysql_user'@'your_mysql_client_IP';

Ensuite, supprimez les privilèges pour appliquer ces paramètres immédiatement:

FLUSH PRIVILEGES;

Sortez ensuite du shell lorsque vous avez terminé:

exit

Votre serveur MySQL est maintenant configuré pour permettre les connexions de votre utilisateur distant. Pour tester que vous pouvez vous connecter à MySQL avec succès, vous devrez installer le packagemysql-client sur lesMySQL client.

Connectez-vous à votre ordinateur client avecssh

ssh sammy@your_mysql_client_ip

Puis mettez à jour l’index de paquet de la machine cliente:

sudo apt update

Et installezmysql-client avec la commande suivante:

sudo apt install mysql-client

Lorsque vous y êtes invité, confirmez l'installation en appuyant surENTER.

Une fois que APT a terminé l'installation du package, exécutez la commande suivante pour vérifier si vous pouvez vous connecter au serveur avec succès. Cette commande inclut l'option utilisateur-u pour spécifiermysql_user et l'option-h pour spécifier l'adresse IP deMySQL server’s:

mysql -u mysql_user -p -h your_mysql_server_IP

Après avoir soumis le mot de passe, vous serez connecté au serveur distant. Utilisez\s pour vérifier l'état du serveur et confirmer que votre connexion est sécurisée:

\s
Output--------------
. . .
SSL:         Cipher in use is DHE-RSA-AES256-SHA
. . .
Connection:      your_mysql_server_IP via TCP/IP
. . .
--------------

Sortez vers le shell:

exit

Vous avez confirmé que vous pouviez vous connecter à MySQL via SSL. Cependant, vous n’avez pas encore confirmé que le serveur MySQL rejetait les connexions non sécurisées. Pour tester cela, essayez de vous connecter à nouveau, mais cette fois, ajoutez--ssl-mode=disabled à la commande de connexion. Cela demandera àmysql-client de tenter une connexion non chiffrée:

mysql -u mysql_user -p -h mysql_server_IP --ssl-mode=disabled

Après avoir entré votre mot de passe lorsque vous y êtes invité, votre connexion sera refusée:

OutputERROR 1045 (28000): Access denied for user 'mysql_user'@'mysql_server_IP' (using password: YES)

Cela montre que les connexions SSL sont autorisées tandis que les connexions non chiffrées sont refusées.

À ce stade, votre serveur MySQL a été configuré pour accepter les connexions distantes sécurisées. Vous pouvez vous arrêter ici si cela répond à vos exigences en matière de sécurité, mais vous pouvez mettre en place certains éléments supplémentaires pour renforcer la sécurité et la confiance entre vos deux serveurs.

[[step-6 -—- optional-configuring-validation-for-mysql-connections]] == Étape 6 - (Facultatif) Configuration de la validation pour les connexions MySQL

Actuellement, votre serveur MySQL est configuré avec un certificat SSL signé par une autorité de certification générée localement. Le certificat et la paire de clés du serveur suffisent pour assurer le cryptage des connexions entrantes.

Cependant, vous n’exploitez pas encore pleinement la relation de confiance qu’une autorité de certification peut fournir. En distribuant le certificat CA aux clients - ainsi que le certificat client et la clé - les deux parties peuvent fournir la preuve que leurs certificats ont été signés par une autorité de certification mutuellement fiable. Cela peut aider à empêcher les connexions usurpées de serveurs malveillants.

Afin de mettre en œuvre cette sauvegarde supplémentaire facultative, nous allons transférer les fichiers SSL appropriés sur la machine client, créer un fichier de configuration client et modifier l'utilisateur MySQL distant afin d'exiger un certificat de confiance.

[.Remarque]##

Note: Le processus de transfert du certificat CA, du certificat client et de la clé client vers le client MySQL décrit dans les paragraphes suivants consiste à afficher le contenu de chaque fichier aveccat, à copier ces contenus dans votre presse-papiers et à les coller dans un nouveau fichier sur l'ordinateur client. Bien qu'il soit possible de copier ces fichiers directement avec un programme commescp ousftp, cela vous oblige également àset up SSH keys pour les deux serveurs afin de leur permettre de communiquer via SSH.

Notre objectif ici est de réduire au minimum le nombre de voies potentielles de connexion à votre serveur MySQL. Bien que ce processus soit légèrement plus laborieux que le transfert direct des fichiers, il est tout aussi sécurisé et ne vous oblige pas à ouvrir une connexion SSH entre les deux machines.

Commencez par créer un répertoire sur lesMySQL client dans le répertoire personnel de votre utilisateur non root. Appelez ce répertoireclient-ssl:

mkdir ~/client-ssl

Comme la clé de certificat est sensible, verrouillez l'accès à ce répertoire afin que seul l'utilisateur actuel puisse y accéder:

chmod 700 ~/client-ssl

Sur lesMySQL server, affichez le contenu du certificat CA en tapant:

sudo cat /var/lib/mysql/ca.pem
Output-----BEGIN CERTIFICATE-----

. . .

-----END CERTIFICATE-----

Copiez la totalité de la sortie, y compris les lignesBEGIN CERTIFICATE etEND CERTIFICATE, dans votre presse-papiers.

Sur lesMySQL client, créez un fichier avec le même nom dans le nouveau répertoire:

nano ~/client-ssl/ca.pem

A l'intérieur, collez le contenu du certificat copié à partir de votre presse-papiers. Enregistrez et fermez le fichier lorsque vous avez terminé.

Ensuite, affichez le certificat client sur lesMySQL server:

sudo cat /var/lib/mysql/client-cert.pem
Output-----BEGIN CERTIFICATE-----

. . .

-----END CERTIFICATE-----

Copiez le contenu du fichier dans votre presse-papiers. Encore une fois, n'oubliez pas d'inclure la première et la dernière ligne.

Ouvrez un fichier du même nom sur lesMySQL client dans le répertoireclient-ssl:

nano ~/client-ssl/client-cert.pem

Collez le contenu de votre presse-papiers. Enregistrez et fermez le fichier.

Enfin, affichez le contenu du fichier de clé client sur lesMySQL server:

sudo cat /var/lib/mysql/client-key.pem
Output-----BEGIN RSA PRIVATE KEY-----

. . .

-----END RSA PRIVATE KEY-----

Copiez le contenu affiché, y compris la première et la dernière ligne, dans votre presse-papiers.

Sur lesMySQL client, ouvrez un fichier du même nom dans le répertoireclient-ssl:

nano ~/client-ssl/client-key.pem

Collez le contenu de votre presse-papiers. Enregistrez et fermez le fichier.

La machine client dispose maintenant de toutes les informations d'identification requises pour accéder au serveur MySQL. Cependant, le serveur MySQL n'est toujours pas configuré pour exiger des certificats sécurisés pour les connexions client.

Pour changer cela, connectez-vous à nouveau au compte MySQLroot sur leMySQL server:

mysql -u root -p

À partir de là, modifiez les exigences de sécurité pour votre utilisateur distant. Au lieu de la clauseREQUIRE SSL, appliquez la clauseREQUIRE X509. Cela implique toute la sécurité fournie par la clauseREQUIRE SSL, mais nécessite en outre que le client qui se connecte présente un certificat signé par une autorité de certification en laquelle le serveur MySQL fait confiance.

Pour ajuster les exigences utilisateur, utilisez la commandeALTER USER:

ALTER USER 'mysql_user'@'mysql_client_IP' REQUIRE X509;

Ensuite, effacez les modifications pour vous assurer qu'elles sont appliquées immédiatement:

FLUSH PRIVILEGES;

Quittez le shell lorsque vous avez terminé:

exit

Ensuite, vérifiez si vous pouvez valider les deux parties lorsque vous vous connectez.

Sur lesMySQL client, essayez d'abord de vous connecter sans fournir les certificats clients:

mysql -u mysql_user -p -h mysql_server_IP
OutputERROR 1045 (28000): Access denied for user 'mysql_user'@'mysql_client_IP' (using password: YES)

Comme prévu, le serveur refuse la connexion lorsqu'aucun certificat client n'est présenté.

Maintenant, connectez-vous en utilisant les options--ssl-ca,--ssl-cert et--ssl-key pour pointer vers les fichiers appropriés dans le répertoire~/client-ssl:

mysql -u mysql_user -p -h mysql_server_IP --ssl-ca=~/client-ssl/ca.pem --ssl-cert=~/client-ssl/client-cert.pem --ssl-key=~/client-ssl/client-key.pem

Vous avez fourni au client les certificats et les clés appropriés pour que cette tentative aboutisse:

Reconnectez-vous pour retrouver l'accès à votre session shell:

exit

Maintenant que vous avez confirmé l’accès au serveur, implémentons une légère amélioration de la convivialité afin d’éviter de spécifier les fichiers de certificat à chaque fois que vous vous connectez.

Dans votre répertoire personnel sur la machineMySQL client, créez un fichier de configuration caché appelé~/.my.cnf:

nano ~/.my.cnf

En haut du fichier, créez une section appelée[client]. En dessous, ajoutez les optionsssl-ca,ssl-cert etssl-key et pointez-les vers les fichiers respectifs que vous avez copiés depuis le serveur. Il ressemblera à ceci:

~/.my.cnf

[client]
ssl-ca = ~/client-ssl/ca.pem
ssl-cert = ~/client-ssl/client-cert.pem
ssl-key = ~/client-ssl/client-key.pem

L'optionssl-ca indique au client de vérifier que le certificat présenté par le serveur MySQL est signé par l'autorité de certification que vous avez désignée. Cela permet au client d’avoir confiance qu’il se connecte à un serveur MySQL sécurisé. De même, les optionsssl-cert etssl-key pointent vers les fichiers nécessaires pour prouver au serveur MySQL qu'il dispose également d'un certificat qui a été signé par la même autorité de certification. Vous en aurez besoin si vous voulez que le serveur MySQL vérifie que le client a également été approuvé par l'autorité de certification.

Enregistrez et fermez le fichier lorsque vous avez terminé.

Maintenant, vous pouvez vous connecter au serveur MySQL sans ajouter les options--ssl-ca,--ssl-cert et--ssl-key sur la ligne de commande:

mysql -u remote_user -p -h mysql_server_ip

Votre client et votre serveur présenteront chacun des certificats lors de la négociation de la connexion. Chaque partie est configurée pour vérifier le certificat distant par rapport au certificat de l'autorité de certification qu'il possède localement.

Conclusion

Votre serveur MySQL est maintenant configuré pour exiger des connexions sécurisées de la part de clients distants. En outre, si vous avez suivi les étapes pour valider les connexions à l'aide de l'autorité de certification, les deux côtés ont établi un niveau de confiance selon lequel la partie distante est légitime.