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í s protokolem 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í. Podporováno pouze s flexibilním serverem 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.
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é tak, jak je znázorněno níže.
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.
Verze flexibilního 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.
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.
K připojení k serveru z místního prostředí můžete zvolit mysql.exe nebo použít MySQL Workbench s flexibilním serverem> Azure Database for MySQL.
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='<password>',
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='<password>',
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;
});
Související obsah
- Použití aplikace MySQL Workbench s flexibilním serverem Azure Database for MySQL
- Použití PHP s flexibilním serverem Azure Database for MySQL
- Vytváření a správa virtuálních sítí pro flexibilní server Azure Database for MySQL pomocí Azure CLI
- sítě na flexibilním serveru Azure Database for MySQL
- Azure Database for MySQL – Pravidla brány firewall flexibilního serveru