Csatlakozás rugalmas Azure Database for MySQL-kiszolgálóhoz titkosított kapcsolatokkal

A következőkre vonatkozik: Azure Database for MySQL – rugalmas kiszolgáló

A rugalmas Azure Database for MySQL-kiszolgáló támogatja az ügyfélalkalmazások rugalmas Azure Database for MySQL-kiszolgálópéldányhoz való csatlakoztatását a Secure Sockets Layer (SSL) és a Transport Layer Security (TLS) titkosításával. A TLS egy iparági szabvány szerinti protokoll, amely biztosítja az adatbázis-kiszolgáló és az ügyfélalkalmazások közötti titkosított hálózati kapcsolatokat, így Ön megfelelhet a megfelelőségi követelményeknek.

A rugalmas Azure Database for MySQL-kiszolgáló alapértelmezés szerint a Transport Layer Security (TLS 1.2) használatával támogatja a titkosított kapcsolatokat, és alapértelmezés szerint minden TLS 1.0- és TLS 1.1-es bejövő kapcsolatot elutasít. A rugalmas kiszolgáló titkosított kapcsolat-kényszerítési vagy TLS-verziókonfigurációja a jelen cikkben ismertetett módon módosítható.

A rugalmas Azure Database for MySQL-kiszolgálópéldányhoz az alábbi ssl- és TLS-beállításokat használhatja:

Eset Kiszolgálóparaméter-beállítások Leírás
SSL-kényszerítés letiltása require_secure_transport = KI Ha az örökölt alkalmazás nem támogatja a rugalmas Azure Database for MySQL-kiszolgáló titkosított kapcsolatait, letilthatja a rugalmas Azure Database for MySQL-kiszolgálópéldány titkosított kapcsolatainak érvényesítését a require_secure_transport=OFF beállítással.
SSL kényszerítése a TLS 1.2-es verziójával < require_secure_transport = BE és tls_version = TLS 1.0 vagy TLS 1.1 Ha az örökölt alkalmazás támogatja a titkosított kapcsolatokat, de a TLS 1.2-es verzióját < igényli, engedélyezheti a titkosított kapcsolatokat, de konfigurálhatja a rugalmas Azure Database for MySQL-kiszolgálópéldányt, hogy engedélyezze az alkalmazás által támogatott TLS-verzióval (1.0 vagy 1.1) való kapcsolatokat. Csak az Azure Database for MySQL rugalmas 5.7-es verziójával támogatott
SSL kényszerítése TLS-verzióval = 1.2 (Alapértelmezett konfiguráció) require_secure_transport = BE és tls_version = TLS 1.2 Ez a rugalmas Azure Database for MySQL-kiszolgáló ajánlott és alapértelmezett konfigurációja.
SSL kényszerítése TLS-verzióval = 1.3 require_secure_transport = BE és tls_version = TLS 1.3 Ez hasznos és ajánlott az új alkalmazások fejlesztéséhez. Csak a rugalmas Azure Database for MySQL-kiszolgáló 8.0-s verziójával támogatott

Feljegyzés

  • A rugalmas Azure Database for MySQL-kiszolgálón nem támogatott az SSL-titkosítás módosítása. A FIPS-titkosítási csomagok alapértelmezés szerint akkor lesznek kényszerítve, ha tls_version TLS 1.2-es verzióra van állítva. Az 1.2-es verziótól eltérő TLS-verziók esetén az SSL-titkosítás a MySQL-közösség telepítésével járó alapértelmezett beállításokra van beállítva.
  • A MySQL nyílt forráskódú közösségi kiadásai a MySQL 8.0.26-os és 5.7.35-ös verziójának kiadásával kezdődnek, a TLS 1.0 és a TLS 1.1 protokoll elavult. Ezek az 1996-ban és 2006-ban kiadott, az adatok mozgásban történő titkosítására kiadott protokollok gyenge, elavult és biztonsági fenyegetésekkel szembeni sebezhetőségnek minősülnek. További információ: A TLS 1.0 és a TLS 1.1 protokollok támogatásának eltávolítása. A rugalmas Azure Database for MySQL-kiszolgáló akkor is leállítja a TLS-verziók támogatását, ha a közösség leállítja a protokoll támogatását a modern biztonsági szabványoknak megfelelően.

Ebben a cikkben az alábbiakkal ismerkedhet meg:

  • Rugalmas Azure Database for MySQL-kiszolgálópéldány konfigurálása
    • Le van tiltva az SSL
    • Ssl kényszerítése TLS-verzióval
  • Csatlakozás rugalmas Azure Database for MySQL-kiszolgálópéldányhoz a mysql parancssor használatával
    • Letiltott titkosított kapcsolatok esetén
    • A titkosított kapcsolatok engedélyezve
  • A kapcsolat titkosítási állapotának ellenőrzése
  • Csatlakozás rugalmas Azure Database for MySQL-kiszolgálópéldányhoz titkosított kapcsolatokkal, különböző alkalmazás-keretrendszerek használatával

SSL-kényszerítés letiltása a rugalmas Azure Database for MySQL-kiszolgálópéldányon

Ha az ügyfélalkalmazás nem támogatja a titkosított kapcsolatokat, le kell tiltania a titkosított kapcsolatok kikényszerítését a rugalmas Azure Database for MySQL-kiszolgálópéldányon. A titkosított kapcsolatok kikényszerítésének letiltásához be kell állítania require_secure_transport kiszolgálóparamétert KI értékre a képernyőképen látható módon, és mentenie kell a kiszolgáló paraméterkonfigurációját ahhoz, hogy érvénybe lépjen. require_secure_transport egy dinamikus kiszolgálóparaméter , amely azonnal érvénybe lép, és nem igényli a kiszolgáló újraindítását.

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

Csatlakozás mysql parancssori ügyfélprogram használata ssl letiltva

Az alábbi példa bemutatja, hogyan csatlakozhat a kiszolgálóhoz a mysql parancssori felülettel. A kapcsolati sztring beállítással tiltsa le a --ssl-mode=DISABLED TLS/SSL-kapcsolatot a mysql-ügyfélről. Cserélje le az értékeket a kiszolgáló tényleges nevére és jelszavára.

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

Fontos

A require_secure_transport kikapcsolása nem jelenti azt, hogy a titkosított kapcsolatok nem támogatottak a kiszolgáló oldalán. Ha a rugalmas Azure Database for MySQL-kiszolgálón beállította a require_secure_transport KI értékre, de ha az ügyfél csatlakozik a titkosított kapcsolathoz, az továbbra is elfogadásra kerül. Az alábbi, mysql-ügyfelet használó kapcsolat egy rugalmas Azure Database for MySQL-kiszolgálópéldányhoz require_secure_transport=KI beállítással is működik az alábbiak szerint.

 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)

Összefoglalva, a require_secure_transport=OFF beállítás ellazítja a titkosított kapcsolatok kikényszerítését a rugalmas Azure Database for MySQL-kiszolgálón, és a titkosított kapcsolatok mellett engedélyezi a kiszolgálóval való titkosítatlan kapcsolatokat az ügyfélről.

SSL kényszerítése TLS-verzióval

A rugalmas Azure Database for MySQL-kiszolgálópéldány TLS-verzióinak beállításához *tls_version- kiszolgálóparamétert kell beállítania. A TLS protokoll alapértelmezett beállítása a TLS 1.2. Ha az alkalmazás SSL-kapcsolattal támogatja a MySQL-kiszolgálóval való kapcsolatokat, de a TLS 1.2 protokolltól eltérő protokollt igényel, a kiszolgálóparaméterben be kell állítania a TLS-verziókat. *tls_version- egy statikus kiszolgálóparaméter , amely a paraméter érvénybe lépéséhez a kiszolgáló újraindítását igényli. Az alábbiakban a rugalmas Azure Database for MySQL-kiszolgáló elérhető verzióihoz tartozó támogatott protokollokat követjük.

Rugalmas Azure Database for MySQL-kiszolgálóverzió A tls_version támogatott értékei Alapértelmezett beállítás
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

Csatlakozás mysql parancssori ügyfél használata TLS/SSL használatával

A nyilvános SSL-tanúsítvány letöltése

A titkosított kapcsolatok ügyfélalkalmazásokkal való használatához le kell töltenie a nyilvános SSL-tanúsítványt, amely az Azure Portal Hálózatkezelés paneljén is elérhető az alábbi képernyőképen látható módon.

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

Feljegyzés

Ezt az SSL-tanúsítványt le kell töltenie a kiszolgálókhoz az Azure Government-felhőben.

Mentse a tanúsítványfájlt a kívánt helyre. Ez az oktatóanyag például a helyi környezetet vagy \var\www\html\bin az alkalmazást futtató ügyfélkörnyezetet használja vagy használjac:\ssl. Ez lehetővé teszi, hogy az alkalmazások biztonságosan csatlakozzanak az adatbázishoz SSL-en keresztül.

Ha rugalmas Azure Database for MySQL-kiszolgálópéldányt hozott létre privát hozzáféréssel (VNet-integráció), a kiszolgálóval azonos virtuális hálózaton belüli erőforrásból kell csatlakoznia a kiszolgálóhoz. Létrehozhat egy virtuális gépet, és hozzáadhatja a rugalmas Azure Database for MySQL-kiszolgálópéldányával létrehozott virtuális hálózathoz.

Ha rugalmas Azure Database for MySQL-kiszolgálópéldányt hozott létre nyilvános hozzáféréssel (engedélyezett IP-címekkel), hozzáadhatja a helyi IP-címet a kiszolgáló tűzfalszabályainak listájához.

Választhatja a mysql.exe vagy a MySQL Workbench-t>, hogy a helyi környezetből csatlakozzon a kiszolgálóhoz.

Az alábbi példa bemutatja, hogyan csatlakozhat a kiszolgálóhoz a mysql parancssori felülettel. A TLS/SSL-tanúsítvány ellenőrzésének kényszerítéséhez használja a --ssl-mode=REQUIRED kapcsolati sztring beállítást. Adja át a helyi tanúsítványfájl elérési útját a --ssl-ca paraméternek. Cserélje le az értékeket a kiszolgáló tényleges nevére és jelszavára.

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

Feljegyzés

Győződjön meg arról, hogy az --ssl-ca paraméternek átadott érték megegyezik a mentett tanúsítvány fájlútvonalával. Ha ssl használatával csatlakozik a rugalmas Azure Database for MySQL-hez, és a tanúsítvány tulajdonosának nevével teljes ellenőrzést (sslmode=VERTIFY_IDENTITY) használ, használja <a servername.mysql.database.azure.com> a kapcsolati sztring.

Ha titkosítatlan kapcsolatokkal próbál csatlakozni a kiszolgálóhoz, hibaüzenet jelenik meg, amely szerint a nem biztonságos átvitelt használó kapcsolatok az alábbihoz hasonlóan tiltottak:

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

A TLS/SSL-kapcsolat ellenőrzése

Futtassa a mysql állapotparancsot annak ellenőrzéséhez, hogy TLS/SSL használatával csatlakozott-e a MySQL-kiszolgálóhoz:

mysql> status

Ellenőrizze, hogy a kapcsolat titkosítva van-e a kimenet áttekintésével, amelynek a következőnek kell megjelennie: SSL: A használatban lévő titkosítás. Ez a titkosítási csomag egy példát mutat be, és az ügyfél alapján egy másik titkosítási csomagot láthat.

Hogyan azonosíthatók a kiszolgálón konfigurált TLS-protokollok?

Futtathatja a SHOW GLOBAL VARIABLES LIKE "tls_version" parancsot; és ellenőrizze az értéket, hogy megismerje az összes protokoll konfigurálását.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Hogyan állapítható meg, hogy az ügyfelek melyik TLS protokollt használják a kiszolgálóhoz való csatlakozáshoz?

Futtassa az alábbi parancsot, és tekintse meg a munkamenet tls_version annak megállapításához, hogy melyik TLS-verziót használja a csatlakozáshoz.

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;

Csatlakozás rugalmas Azure Database for MySQL-kiszolgálópéldányhoz titkosított kapcsolatokkal, különböző alkalmazás-keretrendszerek használatával

Csatlakozás kiszolgáló számára az Azure Portalon elérhető "Csatlakozás ion-sztringek" lapon előre definiált sztringek tartalmazzák az adatbázis-kiszolgálóhoz TLS/SSL használatával való csatlakozáshoz szükséges paramétereket. A TLS/SSL paraméter az összekötőtől függően változik. Például: "useSSL=true", "sslmode=required", vagy "ssl_verify_cert=true" és egyéb változatok.

Ha egy rugalmas Azure Database for MySQL-kiszolgálópéldányhoz szeretne titkosított kapcsolatot létesíteni TLS/SSL protokollon keresztül az alkalmazásból, tekintse meg az alábbi kódmintákat:

WordPress

Töltse le az SSL nyilvános tanúsítványt , és adja hozzá a következő sorokat wp-config.php a sor // **MySQL settings - You can get this info from your web host** //után.

//** 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 (PDO használata)

$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 Csatlakozás 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 (Java MySQL Csatlakozás or)

# 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 (Java MariaDB Csatlakozás or)

# 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 Csatlakozás 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;
});

Következő lépések