Pour surmonter ce risque, MySQL prend en charge le cryptage en transit entre le client et le serveur via le protocole TLS / SSL. L'article se concentre sur la génération manuelle de certificats SSL et de fichiers de clés dans MySQL pour configurer SSL. Plus tard, l'article se concentre également sur l'activation des exigences de chiffrement obligatoires des clients.
Commencer
Versions MySQL 5.7.28+ fournit un outil pratique connu sous le nom de mysql_ssl_rsa_setup, qui s'appuie sur les binaires OpenSSL pour générer automatiquement les certificats SSL requis pour prendre en charge une connexion sécurisée.
Par conséquent, avant de commencer, vérifiez l'état de connexion SSL par défaut du serveur MySQL. Tapez la commande suivante pour vérifier la valeur de session SSL:
mysql> montrent des variables globales comme «% ssl%»;La sortie ci-dessus montre que MySQL ne prend pas en charge le cryptage en transit pour la session en cours.
Utiliser OpenSSL pour créer un certificat SSL et des clés
Pour fournir un chiffrement en transit, MySQL nécessite des certificats X509 côté client et côté serveur signés par l'autorité de certificat pour valider la propriété du domaine. Nous générerons des certificats auto-signés, ainsi que des certificats de serveur et côté client via l'utilitaire de ligne de commande OpenSSL. Il s'agit d'un outil de bibliothèque OpenSSL qui génère des clés privées, crée des demandes de certificat X509, les signe comme CA et les vérifie.
Avant de commencer, créez un répertoire pour stocker tous les fichiers:
ubuntu @ ubuntu: ~ $ mkdir / var / lib / mysql / transit
ubuntu @ ubuntu: ~ $ cd / var / lib / mysql / transit
L'ensemble de commandes suivant générera plusieurs invites qui doivent avoir des réponses non vides.
Clé de certificat Clé et génération de certificat
La création d'un certificat auto-signé nécessite un certificat d'autorité de certificat (CA) via un fichier de clé privée. Utilisez la commande OpenSSL pour générer une clé privée RSA 2048 bits pour le CA.
Ubuntu @ Ubuntu: ~ $ OpenSSL Genrsa 2048> CA-Key.pem
Utilisez la clé ci-dessus avec une commande OpenSSL REQ pour générer un certificat pour votre propre CA avec une expiration de 3000 jours.
ubuntu @ ubuntu: ~ $ openssl req -new -x509 -Nodes -Days 3000 -Key Ca-key.pem -out ca.pem
Les commandes ci-dessus créent de nouveaux fichiers CA-Key.PEM et CA.PEM pour signer les certificats X509 de MySQL Server and Client.
Générer une clé privée et un certificat auto-signé pour MySQL Server
Utilisez OpenSSL pour générer la clé de signature de la touche RSA et du certificat MySQL Server et le certificat::
Ubuntu @ Ubuntu: ~ $ OpenSSL GENRSA 2048> CLÉ DE SERVER.pem
Ubuntu @ Ubuntu: ~ $ OpenSSL REQ -EW -Key Server-Key.pem -out server-req.pem
Maintenant, supprimez la phrase de passe de la clé du serveur:
Ubuntu @ Ubuntu: ~ $ OpenSSL RSA -in Server-Key.pem -out serveur-clé.pem
Générez le certificat auto-signé MySQL Server à partir de la demande de certificat en utilisant la clé privée et le certificat CA.
ubuntu @ ubuntu: ~ $ openssl x509 -req -in server-req.pem -days 3600 -ca ca.pem -cakey ca-key.pem -set_serial 01 -out server-cerret.pem
Maintenant, la configuration SSL pour MySQL ne nécessite pas CSR.
Générer une clé client et un certificat auto-signé
De même, générez la clé et la demande de certificat pour le client.
Ubuntu @ Ubuntu: ~ $ OpenSSL REQ -NEWKEY RSA: 2048 -Days 3600 -Nodes -Keyout Client-Key.pem -out client-req.pem
Supprimer la phrase de passe de la clé et générer un certificat client à partir de la demande de certificat à l'aide des fichiers CA.
Ubuntu @ Ubuntu: ~ $ OpenSSL RSA -in Client-Key.pem -out client-clé.pem
ubuntu @ ubuntu: ~ $ openssl x509 -req -in client-req.pem -days 365000 -ca ca.pem -cakey ca-key.pem -set_serial 01 -out client-cerret.pem
Le serveur n'acceptera que des connexions distantes des clients avec ces fichiers.
Enfin, vérifiez les certificats du client et du serveur par rapport au certificat CA.
ubuntu @ ubuntu: ~ $ openssl vérifie -cafile ca.PEM Server.PEM Client-certe.pem
serveur de serveur.PEM: OK
Client-cerf.PEM: OK
La valeur OK indique que les certificats ont été correctement générés et sont prêts à l'emploi.
Configuration du serveur MySQL
Pour activer le service TLS / SSL pour MySQL Server, il faut définir un certain nombre de variables système dans le fichier de configuration principale MySQL mysqld.confli, tel que:
Utilisez votre éditeur préféré pour modifier le fichier de configuration situé à l'intérieur / etc / mysql / mysql.confli.d annuaire.
ubuntu @ ubuntu: ~ $ vim / etc / mysql / mysql.confli.d / mysqld.CNF
[mysqld]
ssl_ca = / var / lib / mysql / new_certs / ca.pem
ssl_cert = / var / lib / mysql / new_certs / server-cerret.pem
ssl_key = / var / lib / mysql / new_certs / server-key.pem
Enfin, modifiez les clés SSL et la propriété des certificats et les autorisations.
ubuntu @ ubuntu: ~ $ chown -r mysql: mysql / var / lib / mysql / new_certs /
Ubuntu @ Ubuntu: ~ $ Chmod 600 Client-Key.clé de serveur PEM.pem ca-key.pem
Redémarrez la base de données pour charger des changements récents.
ubuntu @ ubuntu: ~ $ sudo service mysql redémarrage
Connectez-vous au serveur après le redémarrage et vérifiez l'état actuel de la session MySQL SSL.
Configuration côté client
L'établissement d'une connexion distante sécurisée à partir du client nécessite le transfert des fichiers de certificat d'OpenSSL côté client généré ci-dessus. Créez un nouveau répertoire et utilisez l'utilitaire SCP pour le transfert de fichiers sécurisé.
ubuntu @ ubuntu: ~ $ mkdir ~ / client-certe
ubuntu @ ubuntu: ~ $ utilisateur SCP @ [ip_address]: / var / lib / mysql / transit / ca-certed.pem ~ / client-cert /
ubuntu @ ubuntu: ~ $ utilisateur SCP @ [ip_address]: / var / lib / mysql / transit / client-cerred.pem ~ / client-cert /
ubuntu @ ubuntu: ~ $ utilisateur SCP @ [ip_address]: / var / lib / mysql / transit / client-key.pem ~ / client-cert /
Lors de l'établissement d'une connexion distante cryptée, le client nécessite désormais d'ajouter des options côté client qui vérifient les clés et les certificats côté client. Les options incluses sont similaires aux variables système côté serveur mais le -clé SSL et -SSL-cerf Les options identifient les chemins vers la clé privée du client et le certificat. Utilisez le -SSL-CA Option pour ajouter le chemin du certificat CA. Ce fichier doit être le même que le certificat CA côté serveur.
Utilisez la commande ci-dessous avec toutes les options requises pour établir une connexion distante sécurisée avec le serveur de base de données MySQL.
ubuntu @ ubuntu: ~ $ mysql -u user -p -h--SSL-CA = ~ / Client-CERT / CA.pem --sl-cert = ~ / client-cert / client-cert.pem --sl-key = Under ~ / client-cert / client-key.pem
Configurer les connexions cryptées obligatoires
Pour certains serveurs MySQL, il n'est pas nécessaire au client de se connecter avec le serveur via une connexion cryptée, mais c'est obligatoire. MySQL permet à l'administrateur du serveur de configurer des connexions cryptées obligatoires. Il est rendu possible en plaçant trois niveaux de contrôle différents:
Détaillons chacun d'eux:
require_secure_transport
Pour garantir que les clients utilisant une connexion cryptée, activez le require_secure_transport Variable dans le fichier de configuration MySQL situé dans / etc / mysql / mysql.CNF.D Directory:
ubuntu @ ubuntu: ~ $ sudo vim / etc / mysql / mysql.confli.d / mysqld.CNF
[mysqld]
require_secure_transport = on
La variable système ci-dessus garantit que le client utilise un transport sécurisé pour se connecter avec le serveur, et le serveur n'autorise que les connexions TCP via SSL. Par conséquent, le serveur rejette toute demande de connexion client sans transport sécurisé et renvoie une sortie d'erreur de ER_SECure_Transport_Required dans le programme du client.
De plus, la configuration du serveur ci-dessus désactive également la connexion client distante au serveur avec un -ssl-mode = handicapé chaîne.
Invoquer le programme client
Ce niveau de contrôle permet à invoquer le programme client pour configurer une communication cryptée sécurisée, quels que soient les paramètres du serveur. Autrement dit, même si le serveur n'est pas configuré pour établir un transport SSL / TLS, il est en mesure de maintenir une connexion sécurisée au désir du client.
Il est possible par l'utilisation d'un -mode SSL Option disponible dans MySQL 5.7.11 avec ses différentes valeurs. Il est utile de spécifier l'état de sécurité souhaité de la connexion client au serveur. Les valeurs d'option sont appliquées en fonction du niveau croissant de rigueur.
Cependant, il est important de noter que la vérification du nom d'hôte ne fonctionne pas pour les certificats auto-signés. Ceux-ci incluent des certificats générés automatiquement par le serveur ou créés manuellement via l'outil MySQL_SSL_RSA_SETUP.
En dehors du chiffrement par défaut, MySQL permet au client d'inclure des paramètres de sécurité supplémentaires en fournissant un certificat CA, comme le serveur et en permettant une vérification d'identité du nom d'hôte. Ces paramètres permettent aux deux parties de faire confiance à une entité commune, et le client peut vérifier qu'il se connecte à la bonne hôte.
Nous comprenons maintenant comment le mode ci-dessus interagit avec les options de certificat CA:
Configurer les comptes d'utilisateurs
Pour activer la communication chiffrée par le client, configurez un compte utilisateur spécifique pour accéder au serveur MySQL via SSL. Créer un compte d'utilisateur CRÉER UN UTILISATEUR avec le EXIGER déclaration de clause. Ou, utilisez le Modifier l'utilisateur déclaration pour ajouter la clause. Ce contrôle termine la connexion client tente au serveur s'il ne prend pas en charge une connexion cryptée.
La clause requise est utile pour exécuter une configuration liée au chiffrement qui applique des exigences de sécurité strictes. Il permet de spécifier un ou plusieurs TLS_OPTION valeur.
Passons dans le détail des options de commande requises des clients configurés avec diverses valeurs exigées:
AUCUN: ne nécessite pas de connexion SSL
SSL: Le serveur permet uniquement la connexion cryptée à partir des comptes compatibles SSL.
X509: Exige que le client présente la clé privée et le certificat. Cette valeur ne nécessite pas la nécessité de montrer le certificat de l'AC, le sujet et l'émetteur.
La clause spécifie les caractéristiques de chiffrement requises de sorte qu'il n'est pas nécessaire d'inclure l'option SSL.
mysql> créer l'utilisateur 'utilisateur' @ 'localhost' nécessitent x509;Maintenant, le client doit spécifier les options -SSL-Key et -SSL-CERT pour se connecter, tandis que -SSL-CA n'est pas nécessaire (cela s'applique également à la émetteur et sujet valeurs).
ubuntu @ ubuntu: ~ $ mysql -u user -p -h--SSL-CERT = CLIENT-CERT.pem --sl-key = Client-key.pem
Émetteur: Le compte créé avec la requise émetteur, oblige le client à spécifier des options -SL-Key et -SSL-CERT avec un certificat valide délivré par l'émetteur CA 'émetteur'. Créez le compte d'utilisateur comme suit:
mysql> Créer l'utilisateur 'utilisateur' @ 'localhost' exiger l'émetteur '/ c = se / st = stockholm / l = stockholm / o = mysql / cn = ca / emailaddress = ca @ exemple.com ';Si le certificat est valide avec un émetteur différent, la tentative de connexion échoue.
SUJET: exiger que le client présente le certificat avec un sujet Valeur fournie lors de la création de son compte. Une connexion avec un certificat valide mais un sujet de sujet différent dans les terminaisons de connexion.
MySQL> Créer l'utilisateur 'utilisateur' @ 'localhost' exiger le sujet '/ c = se / st = stockholm / l = stockholm / o = mysql Démo Client Certificate / cn = client / emailAddress = Client @ Exemple.com ';CHIFFRER: Le compte créé avec l'instruction oblige le client à inclure la méthode de chiffre utilisé pour crypter la communication. Il est nécessaire de s'assurer que les chiffres et les longueurs clés sont suffisamment forts.
MySQL> Créer l'utilisateur «utilisateur» @ «localhost» nécessite un chiffrement «EDH-RSA-des-CBC3-Sha»;Conclusion
L'article illustre comment sécuriser la communication entre MySQL Server et les clients en activant le protocole SSL. Nous apprenons à créer un certificat auto-signé manuel car nous faisons confiance à l'hôte dans le réseau. Nous appliquons également le cryptage en transit pour la communication MySQL Server en dehors du réseau et apprenez des moyens de configurer le serveur pour les exigences de chiffrement obligatoires.