Verbinding maken Azure Database for MySQL - Flexibele server met versleutelde verbindingen

VAN TOEPASSING OP: Azure Database for MySQL - Flexibele server

Flexibele Azure Database for MySQL-server biedt ondersteuning voor het verbinden van uw clienttoepassingen met het azure Database for MySQL flexibele serverexemplaren met SSL -versleuteling (Secure Sockets Layer) met TLS-versleuteling (Transport Layer Security). TLS is een industriestandaardprotocol dat zorgt voor versleutelde netwerkverbindingen tussen uw databaseserver en client-toepassingen, zodat u kunt voldoen aan nalevingsvereisten.

Flexibele Azure Database for MySQL-server ondersteunt standaard versleutelde verbindingen met TLS 1.2 (Transport Layer Security) en alle binnenkomende verbindingen met TLS 1.0 en TLS 1.1 worden standaard geweigerd. De configuratie van de versleutelde verbinding afdwingen of TLS-versie op uw flexibele server kan worden gewijzigd, zoals wordt beschreven in dit artikel.

Hieronder vindt u de verschillende configuraties van SSL- en TLS-instellingen die u kunt hebben voor uw flexibele Azure Database for MySQL-serverexemplaren:

Scenario Serverparameterinstellingen Beschrijving
SSL-afdwinging uitschakelen require_secure_transport = UIT Als uw verouderde toepassing geen ondersteuning biedt voor versleutelde verbindingen met een flexibele Azure Database for MySQL-server, kunt u afdwingen van versleutelde verbindingen met uw flexibele Azure Database for MySQL-serverexemplaren uitschakelen door require_secure_transport=UIT in te stellen.
SSL afdwingen met TLS-versie < 1.2 require_secure_transport = AAN en tls_version = TLS 1.0 of TLS 1.1 Als uw verouderde toepassing versleutelde verbindingen ondersteunt, maar TLS-versie < 1.2 vereist, kunt u versleutelde verbindingen inschakelen, maar uw exemplaar van flexibele Azure Database for MySQL-server configureren om verbindingen met de TLS-versie (1.0 of 1.1) toe te staan die door uw toepassing worden ondersteund. Alleen ondersteund met azure Database for MySQL flexibele server versie v5.7
SSL afdwingen met TLS-versie = 1.2(standaardconfiguratie) require_secure_transport = AAN en tls_version = TLS 1.2 Dit is de aanbevolen en standaardconfiguratie voor flexibele Azure Database for MySQL-server.
SSL afdwingen met TLS-versie = 1.3 require_secure_transport = AAN en tls_version = TLS 1.3 Dit is handig en wordt aanbevolen voor het ontwikkelen van nieuwe toepassingen. Alleen ondersteund met Versie v8.0 van flexibele Azure Database for MySQL-server

Notitie

  • Wijzigingen in SSL-codering op een flexibele Azure Database for MySQL-server worden niet ondersteund. FIPS-coderingssuites worden standaard afgedwongen wanneer tls_version is ingesteld op TLS-versie 1.2. Voor andere TLS-versies dan versie 1.2 is SSL-codering ingesteld op standaardinstellingen die worden geleverd bij de installatie van de MySQL-community.
  • MySQL opensource-communityversies die beginnen met de release van MySQL-versies 8.0.26 en 5.7.35, worden de PROTOCOLLEN TLS 1.0 en TLS 1.1 afgeschaft. Deze protocollen die zijn uitgebracht in respectievelijk 1996 en 2006 om gegevens in beweging te versleutelen, worden beschouwd als zwak, verouderd en kwetsbaar voor beveiligingsrisico's. Zie Ondersteuning verwijderen voor de TLS 1.0- en TLS 1.1-protocollen voor meer informatie. Flexibele Azure Database for MySQL-server stopt ook met het ondersteunen van TLS-versies zodra de community de ondersteuning voor het protocol stopt om te voldoen aan moderne beveiligingsstandaarden.

In dit artikel leert u het volgende:

  • Uw exemplaar van flexibele Azure Database for MySQL-server configureren
    • Met SSL uitgeschakeld
    • Met SSL afgedwongen met TLS-versie
  • Verbinding maken naar uw exemplaar van flexibele Azure Database for MySQL-server met behulp van de mysql-opdrachtregel
    • Als versleutelde verbindingen zijn uitgeschakeld
    • Als versleutelde verbindingen zijn ingeschakeld
  • Versleutelingsstatus voor uw verbinding controleren
  • Verbinding maken naar uw flexibele Azure Database for MySQL-serverexemplaren met versleutelde verbindingen met behulp van verschillende toepassingsframeworks

SSL-afdwinging uitschakelen op uw flexibele Azure Database for MySQL-serverexemplaren

Als uw clienttoepassing geen ondersteuning biedt voor versleutelde verbindingen, moet u het afdwingen van versleutelde verbindingen uitschakelen op uw flexibele serverexemplaren van Azure Database for MySQL. Als u het afdwingen van versleutelde verbindingen wilt uitschakelen, moet u require_secure_transport serverparameter instellen op UIT, zoals wordt weergegeven in de schermopname en de configuratie van de serverparameter opslaan zodat deze van kracht wordt. require_secure_transport is een dynamische serverparameter die onmiddellijk van kracht wordt en waarvoor het opnieuw opstarten van de server niet van kracht hoeft te worden.

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

Verbinding maken met behulp van de mysql-opdrachtregelclient waarvoor SSL is uitgeschakeld

In het volgende voorbeeld ziet u hoe u verbinding maakt met uw server met behulp van de mysql-opdrachtregelinterface. Gebruik de --ssl-mode=DISABLED instelling verbindingsreeks om de TLS/SSL-verbinding van mysql-client uit te schakelen. Vervang de waarden door uw werkelijke servernaam en wachtwoord.

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

Belangrijk

Als u de require_secure_transport instelt op UIT, betekent dit niet dat versleutelde verbindingen niet worden ondersteund aan de serverzijde. Als u require_secure_transport instelt op UIT op het exemplaar van de flexibele Azure Database for MySQL-server, maar als de client verbinding maakt met de versleutelde verbinding, wordt deze nog steeds geaccepteerd. De volgende verbinding met behulp van mysql-client naar een flexibele Azure Database for MySQL-serverinstantie die is geconfigureerd met require_secure_transport=OFF werkt ook zoals hieronder wordt weergegeven.

 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)

Kortom, require_secure_transport=OFF-instelling versoepelt de afdwinging van versleutelde verbindingen op azure Database for MySQL flexibele server en maakt niet-versleutelde verbindingen met de server mogelijk naast de versleutelde verbindingen.

SSL afdwingen met TLS-versie

Als u TLS-versies wilt instellen op uw exemplaar van flexibele Azure Database for MySQL-server, moet u de serverparameter *tls_version- instellen. De standaardinstelling voor TLS-protocol is TLS 1.2. Als uw toepassing verbindingen met MySQL-server ondersteunt met SSL, maar een ander protocol dan TLS 1.2 vereist, moet u de TLS-versies instellen in de serverparameter. *tls_version- is een statische serverparameter waarvoor een server opnieuw moet worden opgestart voordat de parameter van kracht wordt. Hieronder vindt u de ondersteunde protocollen voor de beschikbare versies van azure Database for MySQL flexibele server.

Versie van flexibele Azure Database for MySQL-server Ondersteunde waarden van tls_version Standaardinstelling
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

Verbinding maken met behulp van de mysql-opdrachtregelclient met TLS/SSL

Het openbare SSL-certificaat downloaden

Als u versleutelde verbindingen met uw clienttoepassingen wilt gebruiken, moet u het openbare SSL-certificaat downloaden, dat ook beschikbaar is in het deelvenster Netwerken in Azure Portal, zoals wordt weergegeven in de onderstaande schermopname.

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

Notitie

U moet dit SSL-certificaat downloaden voor uw servers in de Azure Government-cloud.

Sla het certificaatbestand op de gewenste locatie op. In deze zelfstudie wordt bijvoorbeeld gebruikgemaakt c:\ssl van of \var\www\html\bin in uw lokale omgeving of in de clientomgeving waar uw toepassing wordt gehost. Hierdoor kunnen toepassingen veilig verbinding maken met de database via SSL.

Als u uw exemplaar van flexibele Azure Database for MySQL-server hebt gemaakt met privétoegang (VNet-integratie), moet u verbinding maken met uw server vanuit een resource binnen hetzelfde VNet als uw server. U kunt een virtuele machine maken en deze toevoegen aan het VNet dat is gemaakt met uw flexibele Azure Database for MySQL-serverexemplaren.

Als u uw exemplaar van flexibele Azure Database for MySQL-server hebt gemaakt met openbare toegang (toegestane IP-adressen), kunt u uw lokale IP-adres toevoegen aan de lijst met firewallregels op uw server.

U kunt kiezen mysql.exe of MySQL Workbench> om verbinding te maken met de server vanuit uw lokale omgeving.

In het volgende voorbeeld ziet u hoe u verbinding maakt met uw server met behulp van de mysql-opdrachtregelinterface. Gebruik de --ssl-mode=REQUIRED verbindingsreeks-instelling om verificatie van TLS/SSL-certificaten af te dwingen. Geef het pad naar het lokale certificaatbestand door aan de --ssl-ca parameter. Vervang de waarden door uw werkelijke servernaam en wachtwoord.

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

Notitie

Controleer of de waarde die is doorgegeven aan --ssl-ca overeenkomt met het bestandspad voor het certificaat dat u hebt opgeslagen. Als u verbinding maakt met Azure Database for MySQL - Flexibel met SSL en een optie gebruikt om volledige verificatie (sslmode=VERTIFY_IDENTITY) uit te voeren met de onderwerpnaam van het certificaat, gebruikt <u servernaam.mysql.database.azure.com> in uw verbindingsreeks.

Als u probeert verbinding te maken met uw server met niet-versleutelde verbindingen, ziet u een foutbericht waarin staat dat verbindingen met onveilig transport zijn verboden, zoals hieronder:

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

De TLS/SSL-verbinding controleren

Voer de mysql-statusopdracht uit om te controleren of u verbinding hebt gemaakt met uw MySQL-server met behulp van TLS/SSL:

mysql> status

Controleer of de verbinding is versleuteld door de uitvoer te controleren, die moet worden weergegeven: SSL: Codering in gebruik is. Deze coderingssuite toont een voorbeeld en op basis van de client ziet u een andere coderingssuite.

Hoe identificeert u de TLS-protocollen die op uw server zijn geconfigureerd?

U kunt de opdracht SHOW GLOBAL VARIABLES LIKE 'tls_version' uitvoeren; en controleer de waarde om te begrijpen wat alle protocollen zijn geconfigureerd.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Hoe kunt u vinden welk TLS-protocol door mijn clients wordt gebruikt om verbinding te maken met de server?

U kunt de onderstaande opdracht uitvoeren en tls_version voor de sessie bekijken om te bepalen welke TLS-versie wordt gebruikt om verbinding te maken.

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;

Verbinding maken naar uw flexibele Azure Database for MySQL-serverexemplaren met versleutelde verbindingen met behulp van verschillende toepassingsframeworks

Verbinding maken iontekenreeksen die vooraf zijn gedefinieerd op de pagina 'Verbinding maken ion Strings' die beschikbaar zijn voor uw server in Azure Portal, bevatten de vereiste parameters voor algemene talen om verbinding te maken met uw databaseserver met behulp van TLS/SSL. De TLS/SSL-parameter varieert op basis van de connector. Bijvoorbeeld 'useSSL=true', 'sslmode=required' of 'ssl_verify_cert=true' en andere variaties.

Raadpleeg de volgende codevoorbeelden om een versleutelde verbinding tot stand te brengen met uw flexibele Azure Database for MySQL-serverexemplaren via TLS/SSL vanuit uw toepassing:

WordPress

Download het openbare SSL-certificaat en voeg de volgende regels toe in wp-config.php na de regel // **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 (met 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 (MySQL Verbinding maken or 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 Verbinding maken or voor 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 (MariaDB Verbinding maken or voor 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 (MySql Verbinding maken or)

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;
});

Volgende stappen