Se connecter à Azure Database pour MySQL - Serveur flexible en utilisant des connexions chiffrées

S’APPLIQUE À : Azure Database pour MySQL - Serveur flexible

Le serveur flexible Azure Database pour MySQL prend en charge la connexion de vos applications clientes à l’instance de serveur flexible Azure Database pour MySQL en utilisant le chiffrement SSL (Secure Sockets Layer) avec TLS (Transport Layer Security). TLS est un protocole standard qui garantit la sécurité des connexions réseau entre votre serveur de base de données et vos applications clientes, ce qui vous permet de respecter les exigences de conformité.

Le serveur flexible Azure Database pour MySQL prend en charge par défaut les connexions chiffrées en utilisant TLS (Transport Layer Security) 1.2. Toutes les connexions entrantes qui utilisent TLS 1.0 et TLS 1.1 sont donc refusées par défaut. Vous pouvez modifier la configuration de la mise en œuvre de la connexion chiffrée ou de la version TLS sur votre serveur flexible, tel qu’abordé dans cet article.

Voici les différentes configurations des paramètres SSL et TLS possibles pour votre instance de serveur flexible Azure Database pour MySQL :

Scénario Paramètres du serveur Description
Désactiver la contrainte d’application de SSL require_secure_transport = OFF Si votre application héritée ne prend pas en charge les connexions chiffrées au serveur flexible Azure Database pour MySQL, vous pouvez désactiver l’application des connexions chiffrées à votre instance de serveur flexible Azure Database pour MySQL en définissant require_secure_transport=OFF.
Appliquer le protocole SSL avec la version TLS < 1.2 require_secure_transport = ON et tls_version = TLS 1.0 ou TLS 1.1 Si votre application héritée prend en charge les connexions chiffrées mais nécessite une version de TLS < 1.2, vous pouvez activer les connexions chiffrées, mais configurez votre instance de serveur flexible Azure Database pour MySQL de manière à autoriser les connexions avec la version de TLS (1.0 ou 1.1) prise en charge par votre application. Uniquement pris en charge avec le serveur flexible Azure Database pour MySQL version 5.7
Appliquer le protocole SSL avec la version TLS version = 1.2 (configuration par défaut) require_secure_transport = ON et tls_version = TLS 1.2 Il s’agit de la configuration par défaut recommandée pour un serveur flexible Azure Database pour MySQL.
Appliquer le protocole SSL avec TLS version = 1.3 require_secure_transport = ON et tls_version = TLS 1.3 Cette fonctionnalité est utile et recommandée pour le développement de nouvelles applications. Uniquement pris en charge avec le serveur flexible Azure Database pour MySQL version 8.0

Remarque

  • Les modifications apportées au chiffrement SSL sur le serveur flexible Azure Database pour MySQL ne sont pas prises en charge. Les suites de chiffrement FIPS sont appliquées par défaut quand tls_version est défini sur TLS version 1.2. Pour les versions TLS autres que la version 1.2, le chiffrement SSL est défini sur les paramètres par défaut qui sont fournis avec l’installation de MySQL Community.
  • Pour les éditions open source de MySQL Community, à partir de la publication des versions 8.0.26 et 5.7.35 de MySQL, les protocoles TLS 1.0 et TLS 1.1 sont déconseillés. Ces protocoles, respectivement publiés en 1996 et 2006 pour chiffrer les données en mouvement, sont considérés comme faibles, obsolètes et vulnérables aux atteintes à la sécurité. Pour plus d’informations, consultez Suppression de la prise en charge des protocoles TLS 1.0 et TLS 1.1. Le serveur flexible Azure Database pour MySQL cesse également de prendre en charge les versions de TLS lorsque la communauté cesse de prendre en charge le protocole afin de s’aligner sur les normes de sécurité modernes.

Dans cet article, vous apprendrez comment :

  • Configurer votre instance de serveur flexible Azure Database pour MySQL
    • Avec SSL désactivé
    • Avec SSL appliqué à la version TLS
  • Établir une connexion à votre instance de serveur flexible Azure Database pour MySQL à l’aide de la ligne de commande mysql
    • Avec les connexions chiffrées désactivées
    • Avec les connexions chiffrées activées
  • Vérifier l’état du chiffrement pour votre connexion
  • Établir une connexion à votre instance de serveur flexible Azure Database pour MySQL avec des connexions chiffrées à l’aide de diverses infrastructures d’application

Désactiver l’application de SSL sur votre instance de serveur flexible Azure Database pour MySQL

Si votre application cliente ne prend pas en charge les connexions chiffrées, vous devez désactiver l’application des connexions chiffrées sur votre instance de serveur flexible Azure Database pour MySQL. Pour désactiver la mise en œuvre des connexions chiffrées, vous devez définir le paramètre de serveur require_secure_transport sur OFF, comme indiqué dans la capture d’écran, et enregistrer la configuration du paramètre de serveur pour qu’elle prenne effet. require_secure_transport est un paramètre de serveur dynamique qui prend effet immédiatement et ne nécessite pas le redémarrage du serveur pour prendre effet.

Screenshot showing how to disable SSL with Azure Database for MySQL flexible server.

Se connecter à l’aide du client de ligne de commande mysql avec SSL désactivé

L’exemple suivant montre comment vous connecter à votre serveur à l’aide de l’interface de ligne de commande mysql. Utilisez le paramètre de chaîne de connexion --ssl-mode=DISABLED pour désactiver la connexion TLS/SSL à partir du client mysql. Remplacez les valeurs par le nom et le mot de passe réels de votre serveur.

 mysql.exe -h mydemoserver.mysql.database.azure.com -u myadmin -p --ssl-mode=DISABLED

Important

La définition de la require_secure_transport sur OFF ne signifie pas que les connexions chiffrées ne sont pas prises en charge côté serveur. Si vous définissez require_secure_transport sur OFF sur l’instance de serveur flexible Azure Database pour MySQL, mais que le client se connecte avec la connexion chiffrée, il est toujours accepté. La connexion suivante utilisant le client mysql à une instance de serveur flexible Azure Database pour MySQL configurée avec require_secure_transport=OFF fonctionne également comme indiqué ci-dessous.

 mysql.exe -h mydemoserver.mysql.database.azure.com -u myadmin -p --ssl-mode=REQUIRED
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.7.29-log MySQL Community Server (GPL)

Copyright (c) 2000, 2020, 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> show global variables like '%require_secure_transport%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| require_secure_transport | OFF |
+--------------------------+-------+
1 row in set (0.02 sec)

En résumé, le paramètre require_secure_transport=OFF assouplit l’application des connexions chiffrées sur le serveur flexible Azure Database pour MySQL et autorise les connexions non chiffrées au serveur à partir du client en plus des connexions chiffrées.

Appliquer le protocole SSL avec la version TLS

Pour définir les versions de TLS sur votre instance de serveur flexible Azure Database pour MySQL, vous devez définir le paramètre de serveur *tls_version-. Le paramètre par défaut du protocole TLS est TLS 1.2. Si votre application prend en charge les connexions au serveur MySQL avec SSL, mais requiert un protocole autre que TLS 1.2, vous devez définir les versions TLS dans le paramètre de serveur. *tls_version- est un paramètre serveur statique qui nécessite un redémarrage du serveur pour que le paramètre prenne effet. Voici les protocoles pris en charge pour les versions disponibles du serveur flexible Azure Database pour MySQL.

Version du serveur flexible Azure Database pour MySQL Valeurs prises en charge pour tls_version Paramètre par défaut
MySQL 5.7 TLS 1.0, TLS 1.1, TLS 1.2 TLS 1.2
MySQL 8.0 TLS 1.2, TLS 1.3 TLS 1.2

Se connecter à l’aide du client de ligne de commande mysql avec le protocole TLS/SSL

Télécharger le certificat SSL public

Pour utiliser des connexions chiffrées avec vos applications clientes, vous devez télécharger le certificat SSL public, qui est également disponible dans le volet Mise en réseau du portail Azure, comme indiqué dans la capture d’écran ci-dessous.

Screenshot showing how to download public SSL certificate from Azure portal.

Remarque

Vous devez télécharger ce certificat SSL pour vos serveurs dans Azure Government Cloud.

Téléchargez le fichier de certificat dans votre l’emplacement favori. Par exemple, ce didacticiel utilise c:\ssl ou \var\www\html\bin sur votre environnement local ou l’environnement client où votre application est hébergée. Cela permet aux applications de se connecter en toute sécurité à la base de données via SSL.

Si vous avez créé votre instance de serveur flexible Azure Database pour MySQL avec l’option Accès privé (intégration au réseau virtuel), vous devez vous connecter à votre serveur à partir d’une ressource qui se trouve au sein du même réseau virtuel que votre serveur. Vous pouvez créer une machine virtuelle et l’ajouter au réseau virtuel créé avec votre instance de serveur flexible Azure Database pour MySQL.

Si vous avez créé votre instance de serveur flexible Azure Database pour MySQL avec l’option Accès public (adresses IP autorisées), vous pouvez ajouter votre adresse IP locale à la liste des règles de pare-feu sur votre serveur.

Vous pouvez choisir mysql.exe ou MySQL Workbench--> pour vous connecter au serveur à partir de votre environnement local.

L’exemple suivant montre comment vous connecter à votre serveur à l’aide de l’interface de ligne de commande mysql. Utilisez le paramètre de chaîne de connexion --ssl-mode=REQUIRED pour appliquer la vérification du certificat TLS/SSL. Passez le chemin d’accès du fichier de certificat local au paramètre --ssl-ca. Remplacez les valeurs par le nom et le mot de passe réels de votre serveur.

sudo apt-get install mysql-client
wget --no-check-certificate https://dl.cacerts.digicert.com/DigiCertGlobalRootCA.crt.pem
mysql -h mydemoserver.mysql.database.azure.com -u mydemouser -p --ssl-mode=REQUIRED --ssl-ca=DigiCertGlobalRootCA.crt.pem

Notes

Vérifiez que la valeur passée à --ssl-ca correspond au chemin de fichier du certificat que vous avez enregistré. Si vous vous connectez à Azure Database pour MySQL - Flexible avec SSL et que vous utilisez une option pour effectuer une vérification complète (sslmode = VERIFY_IDENTITY) avec le nom d’objet du certificat, utilisez <servername>.mysql.database.azure.com dans votre chaîne de connexion.

Si vous essayez de vous connecter à votre serveur avec des connexions non chiffrées, vous verrez une erreur indiquant que les connexions utilisant un transport non sécurisé sont interdites :

ERROR 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.

Vérifier la connexion TLS/SSL

Exécutez la commande MySQL status pour vérifier que vous êtes connecté à votre serveur MySQL à l’aide du protocole TLS/SSL :

mysql> status

Vérifiez que la connexion est chiffrée en examinant la sortie, qui doit indiquer : SSL: Cipher in use is. Cette suite de chiffrement est un exemple basé sur le client. Celle que vous voyez peut être différente.

Comment identifier les protocoles TLS configurés sur votre serveur ?

Vous pouvez exécuter la commande SHOW GLOBAL VARIABLES LIKE 'tls_version'; et vérifier la valeur pour identifier les protocoles configurés.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Comment savoir quel protocole TLS mes clients utilisent pour se connecter au serveur ?

Vous pouvez exécuter la commande ci-dessous et examiner le paramètre tls_version de la session afin d’identifier la version TLS utilisée pour la connexion.

SELECT sbt.variable_value AS tls_version,  t2.variable_value AS cipher,
processlist_user AS user, processlist_host AS host
FROM performance_schema.status_by_thread  AS sbt
JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id
JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id
WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher' ORDER BY tls_version;

Établir une connexion à votre instance de serveur flexible Azure Database pour MySQL avec des connexions chiffrées à l’aide de diverses infrastructures d’application

Les chaînes de connexion prédéfinies dans la page « Chaînes de connexion » disponible pour votre serveur dans le portail Azure incluent les paramètres nécessaires pour les langages courants afin de vous connecter au serveur de base de données à l’aide du protocole TLS/SSL. Le paramètre TLS/SSL varie en fonction du connecteur. Exemples : "useSSL=true", "sslmode=required" ou "ssl_verify_cert=true" et d’autres variantes.

Pour établir une connexion chiffrée à votre instance de serveur flexible Azure Database pour MySQL par le biais du protocole TLS/SSL à partir de votre application, reportez-vous aux exemples de code suivants :

WordPress

Téléchargez le certificat public SSL et ajoutez les lignes suivantes dans le fichier wp-config.php après la ligne // **MySQL settings - You can get this info from your web host** //.

//** Connect with SSL ** //
define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);
//** SSL CERT **//
define('MYSQL_SSL_CERT','/FULLPATH/on-client/to/DigiCertGlobalRootCA.crt.pem');

PHP

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/DigiCertGlobalRootCA.crt.pem", NULL, NULL);
mysqli_real_connect($conn, 'mydemoserver.mysql.database.azure.com', 'myadmin', 'yourpassword', 'quickstartdb', 3306, MYSQLI_CLIENT_SSL);
if (mysqli_connect_errno()) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}

PHP (avec PDO)

$options = array(
    PDO::MYSQL_ATTR_SSL_CA => '/var/www/html/DigiCertGlobalRootCA.crt.pem'
);
$db = new PDO('mysql:host=mydemoserver.mysql.database.azure.com;port=3306;dbname=databasename', 'myadmin', 'yourpassword', $options);

Python (MySQLConnector Python)

try:
    conn = mysql.connector.connect(user='myadmin',
                                   password='yourpassword',
                                   database='quickstartdb',
                                   host='mydemoserver.mysql.database.azure.com',
                                   ssl_ca='/var/www/html/DigiCertGlobalRootCA.crt.pem')
except mysql.connector.Error as err:
    print(err)

Python (PyMySQL)

conn = pymysql.connect(user='myadmin',
                       password='yourpassword',
                       database='quickstartdb',
                       host='mydemoserver.mysql.database.azure.com',
                       ssl={'ca': '/var/www/html/DigiCertGlobalRootCA.crt.pem'})

Django (PyMySQL)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'quickstartdb',
        'USER': 'myadmin',
        'PASSWORD': 'yourpassword',
        'HOST': 'mydemoserver.mysql.database.azure.com',
        'PORT': '3306',
        'OPTIONS': {
            'ssl': {'ca': '/var/www/html/DigiCertGlobalRootCA.crt.pem'}
        }
    }
}

Ruby

client = Mysql2::Client.new(
        :host     => 'mydemoserver.mysql.database.azure.com',
        :username => 'myadmin',
        :password => 'yourpassword',
        :database => 'quickstartdb',
        :sslca => '/var/www/html/DigiCertGlobalRootCA.crt.pem'
    )

Golang

rootCertPool := x509.NewCertPool()
pem, _ := ioutil.ReadFile("/var/www/html/DigiCertGlobalRootCA.crt.pem")
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
    log.Fatal("Failed to append PEM.")
}
mysql.RegisterTLSConfig("custom", &tls.Config{RootCAs: rootCertPool})
var connectionString string
connectionString = fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?allowNativePasswords=true&tls=custom",'myadmin' , 'yourpassword', 'mydemoserver.mysql.database.azure.com', 'quickstartdb')
db, _ := sql.Open("mysql", connectionString)

Java (connecteur MySQL pour Java)

# generate truststore and keystore in code

String importCert = " -import "+
    " -alias mysqlServerCACert "+
    " -file " + ssl_ca +
    " -keystore truststore "+
    " -trustcacerts " +
    " -storepass password -noprompt ";
String genKey = " -genkey -keyalg rsa " +
    " -alias mysqlClientCertificate -keystore keystore " +
    " -storepass password123 -keypass password " +
    " -dname CN=MS ";
sun.security.tools.keytool.Main.main(importCert.trim().split("\\s+"));
sun.security.tools.keytool.Main.main(genKey.trim().split("\\s+"));

# use the generated keystore and truststore

System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
System.setProperty("javax.net.ssl.trustStorePassword","password");

url = String.format("jdbc:mysql://%s/%s?serverTimezone=UTC&useSSL=true", 'mydemoserver.mysql.database.azure.com', 'quickstartdb');
properties.setProperty("user", 'myadmin');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

Java (connecteur MariaDB pour Java)

# generate truststore and keystore in code

String importCert = " -import "+
    " -alias mysqlServerCACert "+
    " -file " + ssl_ca +
    " -keystore truststore "+
    " -trustcacerts " +
    " -storepass password -noprompt ";
String genKey = " -genkey -keyalg rsa " +
    " -alias mysqlClientCertificate -keystore keystore " +
    " -storepass password123 -keypass password " +
    " -dname CN=MS ";
sun.security.tools.keytool.Main.main(importCert.trim().split("\\s+"));
sun.security.tools.keytool.Main.main(genKey.trim().split("\\s+"));

# use the generated keystore and truststore

System.setProperty("javax.net.ssl.keyStore","path_to_keystore_file");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
System.setProperty("javax.net.ssl.trustStorePassword","password");

url = String.format("jdbc:mariadb://%s/%s?useSSL=true&trustServerCertificate=true", 'mydemoserver.mysql.database.azure.com', 'quickstartdb');
properties.setProperty("user", 'myadmin');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

.NET (MySqlConnector)

var builder = new MySqlConnectionStringBuilder
{
    Server = "mydemoserver.mysql.database.azure.com",
    UserID = "myadmin",
    Password = "yourpassword",
    Database = "quickstartdb",
    SslMode = MySqlSslMode.VerifyCA,
    SslCa = "DigiCertGlobalRootCA.crt.pem",
};
using (var connection = new MySqlConnection(builder.ConnectionString))
{
    connection.Open();
}

Node.js

var fs = require('fs');
var mysql = require('mysql');
const serverCa = [fs.readFileSync("/var/www/html/DigiCertGlobalRootCA.crt.pem", "utf8")];
var conn=mysql.createConnection({
    host:"mydemoserver.mysql.database.azure.com",
    user:"myadmin",
    password:"yourpassword",
    database:"quickstartdb",
    port:3306,
    ssl: {
        rejectUnauthorized: true,
        ca: serverCa
    }
});
conn.connect(function(err) {
  if (err) throw err;
});

Étapes suivantes