Sdílet prostřednictvím


Připojení k flexibilnímu serveru Azure Database for MySQL pomocí šifrovaných připojení

PLATÍ PRO: Flexibilní server Azure Database for MySQL

Flexibilní server Azure Database for MySQL podporuje připojení klientských aplikací k instanci flexibilního serveru Azure Database for MySQL pomocí protokolu SSL (Secure Sockets Layer) s šifrováním TLS (Transport Layer Security). TLS je standardní oborový protokol, který zajišťuje šifrované síťové připojení mezi databázovým serverem a klientskými aplikacemi, a umožňuje tak dodržovat požadavky na dodržování předpisů.

Flexibilní server Azure Database for MySQL podporuje šifrovaná připojení pomocí protokolu TLS 1.2 (Transport Layer Security) ve výchozím nastavení a všechna příchozí připojení s protokolem TLS 1.0 a TLS 1.1 jsou ve výchozím nastavení odepřena. Konfiguraci vynucení šifrovaného připojení nebo verze protokolu TLS na flexibilním serveru je možné změnit, jak je popsáno v tomto článku.

Následují různé konfigurace nastavení PROTOKOLU SSL a TLS, které můžete mít pro instanci flexibilního serveru Azure Database for MySQL:

Důležité

Podle odebrání podpory protokolů TLS 1.0 a TLS 1.1 od začátku září 2024 už nebudou mít nové servery povoleno používat protokol TLS 1.0 nebo 1.1 a stávající servery nebudou mít povoleno downgradovat na tyto verze. Od poloviny září 2024 zahájíme povinný upgrade všech serverů, které aktuálně používají protokol TLS 1.0 nebo 1.1 na TLS 1.2. Tento proces upgradu se očekává do konce září 2024. Důrazně doporučujeme zákazníkům zajistit, aby jejich aplikace byly plně kompatibilní s protokolem TLS 1.2 před koncem září.

Scénář Nastavení parametrů serveru Popis
Zakázání vynucování SSL require_secure_transport = VYPNUTO Pokud vaše starší verze aplikace nepodporuje šifrovaná připojení k flexibilnímu serveru Azure Database for MySQL, můžete zakázat vynucení šifrovaných připojení k instanci flexibilního serveru Azure Database for MySQL nastavením require_secure_transport=OFF.
Vynucení protokolu SSL s protokolem TLS verze < 1.2 (bude zastaralé v září 2024) require_secure_transport = ZAPNUTO A TLS_VERSION = TLS 1.0 nebo TLS 1.1 Pokud starší verze aplikace podporuje šifrovaná připojení, ale vyžaduje protokol TLS verze 1.2, můžete povolit šifrovaná připojení, ale nakonfigurovat instanci flexibilního serveru Azure Database for MySQL tak, aby umožňovala připojení k protokolu TLS verze < (1.0 nebo 1.1), kterou vaše aplikace podporuje. Podporováno pouze s flexibilním serverem Azure Database for MySQL verze 5.7
Vynucení protokolu SSL s protokolem TLS verze = 1.2 (výchozí konfigurace) require_secure_transport = ZAPNUTO a TLS_VERSION = TLS 1.2 Toto je doporučená a výchozí konfigurace flexibilního serveru Azure Database for MySQL.
Vynucení protokolu SSL s protokolem TLS verze = 1.3 require_secure_transport = ZAPNUTO A TLS_VERSION = TLS 1.3 To je užitečné a doporučeno pro vývoj nových aplikací. Podpora pouze u flexibilního serveru Azure Database for MySQL verze 8.0

Poznámka:

Změny šifrování SSL na flexibilním serveru Azure Database for MySQL se nepodporují. Šifrovací sady FIPS se ve výchozím nastavení vynucují, když je tls_version nastavena na tls verze 1.2 . U jiných verzí protokolu TLS než verze 1.2 je šifrování SSL nastavené na výchozí nastavení, která se dodává s instalací komunity MySQL.

V tomto článku získáte informace o těchto tématech:

  • Konfigurace instance flexibilního serveru Azure Database for MySQL
    • S zakázaným protokolem SSL
    • S vynuceným protokolem SSL s využitím verze protokolu TLS
  • Připojení k instanci flexibilního serveru Azure Database for MySQL pomocí příkazového řádku mysql
    • Se zakázanými šifrovanými připojeními
    • S povolenými šifrovanými připojeními
  • Ověření stavu šifrování pro vaše připojení
  • Připojení k instanci flexibilního serveru Azure Database for MySQL pomocí šifrovaných připojení pomocí různých aplikačních architektur

Zakázání vynucení SSL na instanci flexibilního serveru Azure Database for MySQL

Pokud vaše klientská aplikace nepodporuje šifrovaná připojení, musíte zakázat vynucení šifrovaných připojení v instanci flexibilního serveru Azure Database for MySQL. Pokud chcete zakázat vynucení šifrovaných připojení, musíte nastavit parametr serveru require_secure_transport na VYPNUTO, jak je znázorněno na snímku obrazovky, a uložit konfiguraci parametru serveru, aby se projevila. require_secure_transport je dynamický parametr serveru, který se projeví okamžitě a nevyžaduje restartování serveru.

Snímek obrazovky znázorňující, jak zakázat SSL s flexibilním serverem Azure Database for MySQL

Připojení pomocí klienta příkazového řádku mysql se zakázaným protokolem SSL

Následující příklad ukazuje, jak se připojit k serveru pomocí rozhraní příkazového řádku mysql. --ssl-mode=DISABLED Pomocí nastavení připojovací řetězec zakažte připojení TLS/SSL z klienta mysql. Nahraďte hodnoty skutečným názvem serveru a heslem.

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

Důležité

Nastavení require_secure_transport na VYPNUTO neznamená, že na straně serveru nejsou podporovaná šifrovaná připojení. Pokud nastavíte require_secure_transport na vypnutou instanci flexibilního serveru Azure Database for MySQL, ale pokud se klient připojí k šifrovaným připojením, bude stále přijat. Následující připojení pomocí klienta mysql k instanci flexibilního serveru Azure Database for MySQL nakonfigurované pomocí require_secure_transport=OFF funguje také podle následujícího obrázku.

 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)

Stručně řečeno, nastavení require_secure_transport=OFF uvolní vynucení šifrovaných připojení na flexibilním serveru Azure Database for MySQL a kromě šifrovaných připojení umožňuje nešifrovaná připojení k serveru z klienta.

Vynucení protokolu SSL s využitím verze protokolu TLS

Pokud chcete nastavit verze PROTOKOLU TLS na instanci flexibilního serveru Azure Database for MySQL, musíte nastavit parametr serveru *tls_version-. Výchozí nastavení protokolu TLS je TLS 1.2. Pokud vaše aplikace podporuje připojení k serveru MySQL pomocí protokolu SSL, ale vyžaduje jiný protokol než TLS 1.2, musíte nastavit verze PROTOKOLU TLS v parametru serveru. *tls_version- je parametr statického serveru, který vyžaduje restartování serveru, aby se parametr projevil. Následují podporované protokoly pro dostupné verze flexibilního serveru Azure Database for MySQL.

Flexibilní verze serveru Azure Database for MySQL Podporované hodnoty tls_version Výchozí nastavení
MySQL 5.7 TLS 1.0, TLS 1.1 (bude zastaralé v září 2024) TLS 1.2 TLS 1.2
MySQL 8.0 TLS 1.2, TLS 1.3 TLS 1.2

Připojení pomocí klienta příkazového řádku mysql s protokolem TLS/SSL

Stažení veřejného certifikátu SSL

Pokud chcete používat šifrovaná připojení s klientskými aplikacemi, musíte stáhnout veřejný certifikát SSL, který je k dispozici také v podokně Sítě na webu Azure Portal, jak je znázorněno na následujícím snímku obrazovky.

Snímek obrazovky znázorňující, jak stáhnout veřejný certifikát SSL z webu Azure Portal

Poznámka:

Tento certifikát SSL musíte stáhnout pro servery v cloudu Azure Government.

Uložte soubor certifikátu do upřednostňovaného umístění. Tento kurz například používá c:\ssl nebo \var\www\html\bin používá místní prostředí nebo klientské prostředí, ve kterém je vaše aplikace hostovaná. Aplikace se tak můžou bezpečně připojit k databázi přes PROTOKOL SSL.

Pokud jste vytvořili instanci flexibilního serveru Azure Database for MySQL s privátním přístupem (integrace virtuální sítě), musíte se k serveru připojit z prostředku ve stejné virtuální síti jako váš server. Můžete vytvořit virtuální počítač a přidat ho do virtuální sítě vytvořené pomocí instance flexibilního serveru Azure Database for MySQL.

Pokud jste vytvořili instanci flexibilního serveru Azure Database for MySQL s veřejným přístupem (povolené IP adresy), můžete místní IP adresu přidat do seznamu pravidel brány firewall na vašem serveru.

Můžete zvolit mysql.exe nebo MySQL Workbench–> a připojit se k serveru z místního prostředí.

Následující příklad ukazuje, jak se připojit k serveru pomocí rozhraní příkazového řádku mysql. --ssl-mode=REQUIRED K vynucení ověřování certifikátu TLS/SSL použijte nastavení připojovací řetězec. Předejte do parametru --ssl-ca cestu k souboru místního certifikátu. Nahraďte hodnoty skutečným názvem serveru a heslem.

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

Poznámka:

Ověřte, že hodnota předaná parametru --ssl-ca odpovídá cestě k souboru uloženého certifikátu. Pokud se připojujete k flexibilní službě Azure Database for MySQL pomocí protokolu SSL a používáte možnost provést úplné ověření (sslmode=VERTIFY_IDENTITY) s názvem subjektu certifikátu, použijte <ve svém připojovací řetězec název_serveru.mysql.database.azure.com>.

Pokud se pokusíte připojit k serveru pomocí nešifrovaných připojení, zobrazí se chyba oznamující, že připojení používající nezabezpečený přenos jsou zakázána podobně jako v následujícím příkladu:

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

Ověření připojení TLS/SSL

Spuštěním příkazu stavu mysql ověřte, že jste se připojili k serveru MySQL pomocí protokolu TLS/SSL:

mysql> status

Ověřte, že je připojení šifrované kontrolou výstupu, který by se měl zobrazit: SSL: Šifra, která se používá. Tato sada šifer ukazuje příklad a na základě klienta uvidíte jinou sadu šifer.

Jak identifikovat protokoly TLS nakonfigurované na vašem serveru?

Můžete spustit příkaz SHOW GLOBAL VARIABLES LIKE 'tls_version'; a zkontrolujte hodnotu, abyste pochopili, co jsou nakonfigurované všechny protokoly.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Jak zjistit, který protokol TLS používají moji klienti pro připojení k serveru?

Můžete spustit následující příkaz a podívat se na tls_version relace a zjistit, která verze protokolu TLS se používá pro připojení.

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;

Připojení k instanci flexibilního serveru Azure Database for MySQL pomocí šifrovaných připojení pomocí různých aplikačních architektur

Připojovací řetězce, které jsou předem definované na stránce Připojovací řetězce dostupné pro váš server na webu Azure Portal, zahrnují požadované parametry pro běžné jazyky pro připojení k databázovému serveru pomocí protokolu TLS/SSL. Parametr TLS/SSL se liší podle konektoru. Například "useSSL=true", "sslmode=required" nebo "ssl_verify_cert=true" a další varianty.

Pokud chcete vytvořit šifrované připojení k instanci flexibilního serveru Azure Database for MySQL přes protokol TLS/SSL z vaší aplikace, projděte si následující ukázky kódu:

WordPress

Stáhněte si veřejný certifikát SSL a přidejte následující řádky do wp-config.php za řádek // **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 (pomocí 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 (konektor MySQL pro Javu)

# 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 (konektor MariaDB pro Javu)

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

Další kroky