Guide du cryptage MySQL dans les paramètres de chiffrement des transports et obligatoires

Guide du cryptage MySQL dans les paramètres de chiffrement des transports et obligatoires
Par défaut, la transmission de données MySQL entre le client et le serveur a lieu sans cryptage. La transmission de données non cryptée n'est acceptable que lorsque le client et le serveur sont dans le même réseau qui garantit la sécurité. Cependant, les données sont à risque potentiel si les deux parties sont sur un réseau séparé. L'absence de chiffrement introduit un risque grave d'interception des données par l'attaque de l'homme au milieu (MITM).

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%»;
+---------------+-----------------+
| Variable_name | Valeur |
+---------------+-----------------+
| have_openssl | Désactivé |
| have_ssl | Désactivé |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| SSL_CIPHER | |
| ssl_crl | |
| ssl_crlpath | |
| SSL_KEY | |
+---------------+-----------------+
9 lignes en jeu (0.53 sec)

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:

  • Utiliser ssl_cert et ssl_key Pour définir le chemin d'accès au certificat et à la clé privée du serveur.
  • Utilisez le ssl_ca variable pour définir le chemin d'accès au certificat de l'AC à côté du serveur.

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:

  • Configurer MySQL qui oblige le client à accéder à la base de données uniquement via une connexion cryptée.
  • Invoquez des programmes clients pour avoir besoin d'une connexion cryptée, même si MySQL le permet mais n'en nécessite pas nécessairement un.
  • Configurer des comptes d'utilisateurs spécifiques pour accéder à la base de données uniquement sur un canal crypté.

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.

  • DÉSACTIVÉ: La valeur établit une connexion non sécurisée.
  • PRÉFÉRÉ: Le mode est similaire à celle d'option de mode de telle telle. Il établit le cryptage uniquement si le serveur le prend en charge autrement, il retombe à la connexion non cryptée par défaut.
  • REQUIS: La valeur garantit une communication cryptée si le serveur est autorisé à prendre en charge un. Le client échoue la tentative de connexion si MySQL ne prend pas en charge TLS / SSL.
  • Verify_ca: La valeur fonctionne similaire à REQUIS, Mais en plus, il vérifie également le certificat CA du serveur. Le client ne se connecte pas en cas de certificats de correspondance valides.
  • Verify_identity: semblable à Verify_ca, Mais pour une version 1 OpenSSL.0.2+, les clients peuvent également vérifier le nom d'hôte qu'ils utilisent pour se connecter à l'identité du certificat de serveur. La connexion se casse dans le cas d'un décalage.

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:

  • Spécifiez le certificat CA avec l'option -ssl-CA avec -ssl-mode = Verify_ca.
  • Activer la vérification de l'identité du nom d'hôte en utilisant -ssl-mode = Verify_identity
  • Une valeur -ssl mode autre que Verify_identity ou Verify_ca avec -ssl-CA générera un avertissement indiquant la non-vérification du certificat de serveur.

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.