MySQL est un système de base de données relationnelle open source qui fonctionne sur de nombreux systèmes d'exploitation, notamment Windows, Linux, MacOS et FreeBSD. C'est probablement le SGBDR OpenSource le plus populaire et un composant central des piles LAMP et LEMP. Il existe de nombreuses applications qui dépendent de MySQL comme Wordpress, Joomla, TYPO3, phpBB et bien d'autres.
Dans ce tutoriel, je vais vous montrer étape par étape comment configurer MySQL en toute sécurité pour les connexions à distance. Lorsque vous devez accéder à MySQL à distance, il est soit nécessaire d'utiliser un VPN car MySQL ne crypte pas les données transférées, soit vous pouvez configurer MySQL pour utiliser SSL, comme je vais vous le montrer dans ce tutoriel. Dans cette configuration, seuls les utilisateurs disposant des fichiers de certificat SSL corrects sont autorisés à se connecter au serveur MySQL et le trafic est crypté. Nous allons installer la dernière version de MySQL, puis configurer SSL pour la connexion à distance. Pour le système de base, j'utiliserai un serveur CentOS 7.
Ce que nous allons faire :
- Installez MySQL.
- Configurez le mot de passe racine MySQL.
- Générer de nouveaux fichiers de certificat SSL auto-signés.
- Activer SSL pour MySQL.
- Activer la connexion à distance.
- Test.
Prérequis
- Serveur CentOS 7
- Privilèges root
Étape 1 - Installer MySQL
Dans ce tutoriel, nous utiliserons MySQL 5.7, la dernière version à ce jour. Il est installé à partir du référentiel MySQL, nous devons donc d'abord ajouter un nouveau référentiel CentOS au système.
Ajoutez le nouveau référentiel pour MySQL avec la commande yum ci-dessous.
yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
Il vous sera demandé d'installer un nouveau package, tapez 'y ' et appuyez sur 'Entrée ' pour confirmer.
Vous pouvez maintenant installer la dernière version 5.7 de MySQL sur le serveur comme ceci :
yum -y install mysql-community-server
Une fois l'installation terminée, démarrez le service MySQL et activez-le pour qu'il s'exécute automatiquement au démarrage avec la commande systemctl.
systemctl démarrer mysqld
systemctl activer mysqld
Assurez-vous que MySQL est en cours d'exécution en vérifiant le port utilisé par MySQL (3306). Vérifiez-le avec la commande netstat ci-dessous.
netstat -plntu
MySQL a été installé sur CentOS 7 à partir du référentiel MySQL.
Étape 2 - Configurer le mot de passe racine MySQL
Par défaut, MySQL 5.7 génère un mot de passe root par défaut pour vous lors du premier démarrage du service. Le mot de passe est stocké dans le fichier journal MySQL '/var/log/mysqld.log'.
Pour voir le mot de passe root MySQL par défaut, vous pouvez utiliser la commande grep ci-dessous.
grep 'temporaire' /var/log/mysqld.log
Vous verrez un résultat similaire à celui ci-dessous, mon mot de passe par défaut est 'wxtX8Te&Uh1K '.
Un mot de passe temporaire est généré pour [email protected] :wxtX8Te&Uh1K
Connectez-vous au shell MySQL avec le mot de passe par défaut et remplacez le mot de passe par votre propre mot de passe.
mysql -u root -p
TAPER LE MOT DE PASSE PAR DÉFAUT
Remplacez maintenant le mot de passe par défaut par votre propre mot de passe. Dans ce tutoriel, j'utiliserai '[email protected] ' comme nouveau mot de passe root MySQL. Exécutez les requêtes MySQL ci-dessous.
ALTER USER 'root'@'localhost' IDENTIFIED BY '[email protected]' ;
vider les privilèges ;
quitter ;
Vous pouvez maintenant vous reconnecter avec le nouveau mot de passe "[email protected]".
mysql -u root -p
TAPEZ LE NOUVEAU MOT DE PASSE '[email protected]'
Étape 3 - Générer de nouveaux fichiers de certificats auto-signés
Par défaut, MySQL 5.7 a ses propres fichiers de certificat SSL dans le répertoire '/var/lib/mysql'. Mais dans ce tutoriel, je vais vous montrer comment générer vos propres fichiers de certificat SSL avec OpenSSL, puis les configurer avec MySQL.
Dans cette étape, nous allons générer de nouveaux fichiers de certificats auto-signés. Nous avons besoin de 3 certificats :certificat CA, certificat et clé de serveur, certificat et clé client . Nous les créerons avec OpenSSL.
Créez un nouveau répertoire pour les fichiers de certificat SSL '/etc/certs/' et accédez à ce répertoire.
mkdir -p /etc/certs
cd /etc/certs
Générer un nouveau fichier ca.pem de certificat CA.
openssl genrsa 2048> ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
Ensuite, nous devons créer les certificats côté serveur. Créez de nouveaux fichiers de certificat de serveur server-cert.pem et server-key.pem. Générez de nouveaux fichiers de certificat, supprimez la phrase secrète et signez-les avec le certificat CA.
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Générez maintenant des fichiers de certificat pour le client. Le serveur MySQL n'acceptera que la connexion à distance du client qui possède ces fichiers de certificat. Générez de nouveaux fichiers de certificat client, supprimez la phrase secrète et signez-les à l'aide du certificat CA.
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Remarque :
Les informations du certificat CA doivent être différentes des informations client et serveur.
Tous les certificats dont nous avons besoin pour cette configuration ont été générés. Nous pouvons maintenant vérifier les fichiers de certificat avec la commande ci-dessous.
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
Assurez-vous qu'il n'y a pas d'erreur, les résultats sont comme ci-dessous.
Tous les fichiers de certificat ont été vérifiés. Remplacez le propriétaire du répertoire certs par l'utilisateur 'mysql' et modifiez les autorisations de tous les fichiers clés.
chown -R mysql:mysql /etc/certs/
chmod 600 client-key.pem server-key.pem ca-key.pem
Étape 4 - Activer SSL pour MySQL
Dans cette étape, nous allons activer SSL pour MySQL. Avant de commencer à configurer et à activer SSL sur MySQL, nous devons sauvegarder les fichiers de certificat par défaut dans le nouveau répertoire de sauvegarde.
Créer un nouveau répertoire de sauvegarde 'mysql-certs ' pour tous les certificats.
mkdir -p ~/mysql-certs/
Allez dans le répertoire '/var/lib/mysql' et déplacez tous les certificats par défaut dans le répertoire de sauvegarde.
cd /var/lib/mysql/
mv ca.pem ca-key.pem ~/mysql-certs/
mv server-key.pem server-cert.pem ~/mysql-certs /
mv client-key.pem client-cert.pem ~/mysql-certs/
mv private_key.pem public_key.pem ~/mysql-certs/
Redémarrez maintenant le service MySQL.
systemctl redémarre mysqld
Ensuite, vérifiez SSL à partir du shell MySQL. Connectez-vous à mysql avec le nouveau mot de passe :
mysql -u root -p
TAPEZ LE NOUVEAU MOT DE PASSE '[email protected]'
Exécutez la requête ci-dessous afin que nous puissions voir le statut SSL pour MySQL.
AFFICHER LES VARIABLES GLOBALES COMME '%ssl%' ;
STATUT ;
Vous verrez que le statut SSL est 'DISABLED ', et l'utilisateur root a été connecté sans SSL .
Ensuite, nous allons activer la connexion SSL pour MySQL. Nous devons éditer le fichier de configuration MySQL 'my.cnf ' fichier avec vim.
vim /etc/mon.cnf
Dans le '[mysqld] ', collez la configuration ci-dessous.
# Tapez votre propre répertoire de certificats
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/server-cert.pem
ssl-key =/etc/certs/server-key.pem
Enregistrez le fichier et quittez vim, le service MySQL de redémarrage.
systemctl redémarre mysqld
Maintenant, connectez-vous à nouveau à MySQL et vérifiez le SSL.
mysql -u root -p
TAPEZ LE NOUVEAU MOT DE PASSE '[email protected]'
Exécutez la requête ci-dessous pour vous assurer que la valeur de la section SSL est 'OUI '.
AFFICHER LES VARIABLES COMME '%ssl%' ;
STATUT ;
Vous verrez que SSL pour MySQL est activé, mais l'utilisateur root n'est toujours pas connecté à l'aide de la connexion SSL.
Pour forcer la connexion de tous les utilisateurs locaux avec SSL, modifiez le fichier de configuration mysql 'my.cnf ' à nouveau.
vim /etc/mon.cnf
Collez la configuration ci-dessous jusqu'à la fin de la ligne.
[client]
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/client-cert.pem
ssl-key=/etc /certs/client-key.pem
Enregistrez et quittez, puis redémarrez MySQL.
systemctl redémarre mysqld
Connectez-vous à nouveau à MySQL et vérifiez la connexion et SSL activé.
mysql -u root -p
TYPE NEW PASSWORD '[email protected]'
AFFICHER LES VARIABLES COMME '%ssl%' ;
STATUT ;
SSL a été activé et la connexion locale utilise également SSL.
Étape 5 - Activer les connexions à distance
Dans les étapes ci-dessus, nous avons déjà activé SSL pour le serveur MySQL et les connexions locales sont obligées d'utiliser SSL. Dans cette étape, nous allons activer les connexions à distance pour MySQL, mais nous autorisons uniquement les clients disposant de fichiers de certificat signés par notre autorité de certification à se connecter au serveur MySQL.
Modifiez le fichier de configuration MySQL avec vim.
vim /etc/mon.cnfCollez cette configuration ci-dessous à la fin du '[mysqld] '.
bind-address =*
require_secure_transport =ONEnregistrez le fichier et quittez l'éditeur, puis redémarrez MySQL.
systemctl redémarre mysqldEnsuite, créez un nouvel utilisateur pour la connexion à distance. Je vais créer un nouvel utilisateur nommé 'hakase ' avec le mot de passe '[email protected] ' et accorder tous les privilèges au 'hakase ' utilisateur. 'hakase ' l'utilisateur ne pourra se connecter qu'avec la clé de certificat.
mysql -u root -p
TYPE NEW PASSWORD '[email protected]'
créer l'utilisateur 'hakase'@'%' identifié par '[email protected]' NÉCESSITE X509 ;
accorder tous les privilèges sur *.* à 'hakase'@'%' identifié par '[email protected]' REQUIRE X509 ;
vider les privilèges ;
Un nouvel utilisateur pour la connexion à distance a été créé.
Remarque :
Vous verrez peut-être "1 avertissement" ' dans le résultat de la requête mysql. Il s'agit simplement d'un avertissement concernant l'utilisation de la requête ALTER USER au lieu d'une requête GRANT, car la requête "GRANT" sera obsolète dans la prochaine version.
Étape 6 - Tester
Dans la dernière section de ce didacticiel, nous testerons si le nouvel utilisateur nommé "hakase" est capable de se connecter au serveur MySQL à distance avec des fichiers de certificat. Trois certificats pour le client doivent être téléchargés.
- Certificat CA - ca.pem
- Certificat client :client-cert.pem
- Clé client :client-key.pem
Je me suis connecté à un autre système Linux et y ai installé les packages mysql-client. Ensuite, j'ai téléchargé tous les fichiers de certificat client avec SCP. Je vais maintenant me connecter au serveur MySQL avec les fichiers de certificat.
mysql -h 10.0.15.11 -u hakase \
--ssl-ca=ca.pem \
--ssl-cert=client-cert.pem \
--ssl -key=clé-client.pem -p10.0.15.11 =Adresse IP du serveur MySQL.
Vous pouvez voir l'état de la connexion avec cette requête ci-dessous.
STATUT ;
Hakase de l'utilisateur avec l'adresse IP 10.0.15.10 Connecté au serveur MySQL avec l'adresse IP 10.0.15.11 , la connexion via TCP/IP sur le port 3306 et en utilisant SSL .
Lorsque vous essayez de vous connecter sans fichiers de certificat, vous verrez l'erreur comme ci-dessous.
Ensuite, je vais tester avec l'interface graphique MySQLWorkbench de mon hôte.
Voici ma configuration - Paramètre de réglage.
Configuration SSL - Paramétrage SSL.
Et ci-dessous les résultats de la connexion avec les fichiers du certificat client SSL.
Un nouvel utilisateur s'est connecté avec succès à distance au serveur de base de données MySQL avec une connexion SSL. Lorsqu'un utilisateur essaie de se connecter sans les fichiers de certificat, le résultat sera 'refusé '. L'installation et la configuration de MySQL avec une connexion SSL ont réussi.