Connettersi al server flessibile di Database di Azure per MySQL con connessioni crittografate

SI APPLICA A: Database di Azure per MySQL - Server flessibile

Database di Azure per MySQL server flessibile supporta la connessione delle applicazioni client all'istanza del server flessibile Database di Azure per MySQL tramite SSL (Secure Sockets Layer) con la crittografia TLS (Transport Layer Security). TLS è un protocollo standard del settore che garantisce connessioni di rete crittografate tra il server di database e le applicazioni client, consentendo di rispettare i requisiti di conformità.

Database di Azure per MySQL server flessibile supporta connessioni crittografate tramite Transport Layer Security (TLS 1.2) per impostazione predefinita e tutte le connessioni in ingresso con TLS 1.0 e TLS 1.1 vengono negate per impostazione predefinita. L'imposizione della connessione crittografata o la configurazione della versione TLS nel server flessibile può essere modificata come descritto in questo articolo.

Di seguito sono riportate le diverse configurazioni delle impostazioni SSL e TLS disponibili per l'istanza del server flessibile Database di Azure per MySQL:

Scenario Impostazioni dei parametri del server Descrizione
Disabilitare l'imposizione SSL require_secure_transport = OFF Se l'applicazione legacy non supporta le connessioni crittografate a Database di Azure per MySQL server flessibile, è possibile disabilitare l'imposizione delle connessioni crittografate all'istanza del server flessibile Database di Azure per MySQL impostando require_secure_transport=OFF.
Applicare SSL con TLS versione < 1.2 require_secure_transport = ON e tls_version = TLS 1.0 o TLS 1.1 Se l'applicazione legacy supporta connessioni crittografate ma richiede TLS versione < 1.2, è possibile abilitare le connessioni crittografate, ma configurare l'istanza del server flessibile Database di Azure per MySQL per consentire le connessioni con la versione TLS (1.0 o 1.1) supportata dall'applicazione. Supportato solo con Database di Azure per MySQL versione server flessibile v5.7
Applicare SSL con TLS versione = 1.2(Configurazione predefinita) require_secure_transport = ON e tls_version = TLS 1.2 Si tratta della configurazione consigliata e predefinita per Database di Azure per MySQL server flessibile.
Applicare SSL con TLS versione = 1.3 require_secure_transport = ON e tls_version = TLS 1.3 Ciò è utile e consigliato per lo sviluppo di nuove applicazioni. Supportato solo con Database di Azure per MySQL versione 8.0 del server flessibile

Nota

  • Le modifiche apportate alla crittografia SSL in Database di Azure per MySQL server flessibile non sono supportate. I pacchetti di crittografia FIPS vengono applicati per impostazione predefinita quando tls_version è impostato su TLS versione 1.2 . Per le versioni TLS diverse dalla versione 1.2, la crittografia SSL è impostata su impostazioni predefinite, che include l'installazione della community mySQL.
  • Le edizioni della community open source di MySQL a partire dalla versione 8.0.26 e 5.7.35 di MySQL, i protocolli TLS 1.0 e TLS 1.1 sono deprecati. Questi protocolli rilasciati nel 1996 e nel 2006, rispettivamente per crittografare i dati in movimento, sono considerati deboli, obsoleti e vulnerabili alle minacce alla sicurezza. Per altre informazioni, vedere Rimozione del supporto per i protocolli TLS 1.0 e TLS 1.1. Database di Azure per MySQL server flessibile interrompe anche il supporto delle versioni TLS dopo che la community arresta il supporto per il protocollo, per allinearsi agli standard di sicurezza moderni.

In questo articolo vengono illustrate le operazioni seguenti:

  • Configurare l'istanza del server flessibile Database di Azure per MySQL
    • Con SSL disabilitato
    • Con SSL applicato con la versione TLS
  • Connessione all'istanza del server flessibile Database di Azure per MySQL usando la riga di comando mysql
    • Con connessioni crittografate disabilitate
    • Con connessioni crittografate abilitate
  • Verificare lo stato della crittografia per la connessione
  • Connessione all'istanza del server flessibile Database di Azure per MySQL con connessioni crittografate usando vari framework applicazione

Disabilitare l'imposizione SSL nell'istanza del server flessibile Database di Azure per MySQL

Se l'applicazione client non supporta le connessioni crittografate, è necessario disabilitare l'imposizione delle connessioni crittografate nell'istanza del server flessibile Database di Azure per MySQL. Per disabilitare l'imposizione delle connessioni crittografate, è necessario impostare require_secure_transport parametro del server su OFF, come illustrato nello screenshot e salvare la configurazione dei parametri del server per renderla effettiva. require_secure_transport è un parametro del server dinamico che diventa effettivo immediatamente e non richiede l'applicazione del riavvio del server.

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

Connessione l'uso del client della riga di comando mysql con SSL disabilitato

L'esempio seguente illustra come connettersi al server usando l'interfaccia della riga di comando mysql. Usare l'impostazione --ssl-mode=DISABLED stringa di connessione per disabilitare la connessione TLS/SSL dal client mysql. Sostituire i valori con il nome server e la password effettivi.

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

Importante

L'impostazione del require_secure_transport su OFF non indica che le connessioni crittografate non sono supportate sul lato server. Se si imposta require_secure_transport su OFF nell'istanza del server flessibile Database di Azure per MySQL, ma se il client si connette con la connessione crittografata, viene comunque accettato. La connessione seguente tramite il client mysql a un'istanza del server flessibile Database di Azure per MySQL configurata con require_secure_transport=OFF funziona anche come illustrato di seguito.

 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)

In sintesi, l'impostazione require_secure_transport=OFF riduce l'applicazione delle connessioni crittografate in Database di Azure per MySQL server flessibile e consente connessioni non crittografate al server dal client oltre alle connessioni crittografate.

Applicare SSL con la versione TLS

Per impostare le versioni TLS nell'istanza del server flessibile Database di Azure per MySQL, è necessario impostare il parametro *tls_version- server. L'impostazione predefinita per il protocollo TLS è TLS 1.2. Se l'applicazione supporta le connessioni al server MySQL con SSL, ma richiede qualsiasi protocollo diverso da TLS 1.2, è necessario impostare le versioni TLS nel parametro server. *tls_version- è un parametro del server statico che richiede un riavvio del server per rendere effettivo il parametro. Di seguito sono riportati i protocolli supportati per le versioni disponibili di Database di Azure per MySQL server flessibile.

Database di Azure per MySQL versione flessibile del server Valori supportati di tls_version Impostazione predefinita
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

Connessione usando il client della riga di comando mysql con TLS/SSL

Scaricare il certificato SSL pubblico

Per usare connessioni crittografate con le applicazioni client, è necessario scaricare il certificato SSL pubblico, disponibile anche nel riquadro Rete portale di Azure, come illustrato nello screenshot seguente.

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

Nota

È necessario scaricare questo certificato SSL per i server in Azure per enti pubblici cloud.

Salvare il file di certificato nella posizione preferita. Ad esempio, questa esercitazione usa c:\ssl o \var\www\html\bin nell'ambiente locale o nell'ambiente client in cui è ospitata l'applicazione. Ciò consente alle applicazioni di connettersi in modo sicuro al database tramite SSL.

Se è stata creata l'istanza del server flessibile Database di Azure per MySQL con accesso privato (integrazione rete virtuale), è necessario connettersi al server da una risorsa all'interno della stessa rete virtuale del server. È possibile creare una macchina virtuale e aggiungerla alla rete virtuale creata con l'istanza del server flessibile Database di Azure per MySQL.

Se è stata creata l'istanza del server flessibile Database di Azure per MySQL con accesso pubblico (indirizzi IP consentiti), è possibile aggiungere l'indirizzo IP locale all'elenco delle regole del firewall nel server.

È possibile scegliere mysql.exe o MySQL Workbench per> connettersi al server dall'ambiente locale.

L'esempio seguente illustra come connettersi al server usando l'interfaccia della riga di comando mysql. Usare l'impostazione --ssl-mode=REQUIRED stringa di connessione per applicare la verifica del certificato TLS/SSL. Passare il percorso del file del certificato locale al --ssl-ca parametro . Sostituire i valori con il nome server e la password effettivi.

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

Nota

Verificare che il valore passato a --ssl-ca corrisponda al percorso del file per il certificato salvato. Se ci si connette al Database di Azure per MySQL- Flessibile con SSL e si usa un'opzione per eseguire la verifica completa (sslmode=VERTIFY_IDENTITY) con il nome soggetto del certificato, usare <servername.mysql.database.azure.com> nel stringa di connessione.

Se si tenta di connettersi al server con connessioni non crittografate, verrà visualizzato un errore che indica che le connessioni che usano il trasporto non sicuro sono vietate in modo simile a una di seguito:

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

Verificare la connessione TLS/SSL

Eseguire il comando mysql status per verificare di aver eseguito la connessione al server MySQL usando TLS/SSL:

mysql> status

Verificare che la connessione sia crittografata esaminando l'output, che dovrebbe essere visualizzato: SSL: Crittografia in uso. Questa suite di crittografia mostra un esempio e basato sul client, è possibile visualizzare una suite di crittografia diversa.

Come identificare i protocolli TLS configurati nel server?

È possibile eseguire il comando SHOW GLOBAL VARIABLES LIKE 'tls_version'; e controllare il valore per comprendere quali sono tutti i protocolli configurati.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Come trovare il protocollo TLS usato dai client per connettersi al server?

È possibile eseguire il comando seguente ed esaminare tls_version per identificare la versione TLS usata per la connessione.

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;

Connessione all'istanza del server flessibile Database di Azure per MySQL con connessioni crittografate usando vari framework applicazione

Connessione stringhe predefinite nella pagina "stringhe di Connessione ion" disponibili per il server nel portale di Azure includono i parametri necessari per i linguaggi comuni per connettersi al server di database tramite TLS/SSL. Il parametro TLS/SSL varia in base al connettore. Ad esempio, "useSSL=true", "sslmode=required" o "ssl_verify_cert=true" e altre varianti.

Per stabilire una connessione crittografata all'istanza del server flessibile Database di Azure per MySQL tramite TLS/SSL dall'applicazione, vedere gli esempi di codice seguenti:

WordPress

Scaricare il certificato pubblico SSL e aggiungere le righe seguenti in wp-config.php dopo la riga // **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 (uso di 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 (mySQL Connessione or per 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 (Connessione or MariaDB per 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;
});

Passaggi successivi