Łączenie z usługą Azure Database for MySQL — serwer elastyczny za pomocą szyfrowanego połączenia
DOTYCZY: Azure Database for MySQL — serwer elastyczny
Serwer elastyczny usługi Azure Database for MySQL obsługuje łączenie aplikacji klienckich z wystąpieniem serwera elastycznego usługi Azure Database for MySQL przy użyciu protokołu SSL (Secure Sockets Layer) z szyfrowaniem TLS(Transport Layer). TLS to protokół standardu branżowego, który zapewnia szyfrowane połączenia sieciowe między serwerem bazy danych i aplikacjami klienckimi, co pozwala spełnić wymagania dotyczące zgodności.
Serwer elastyczny usługi Azure Database for MySQL obsługuje połączenia szyfrowane przy użyciu protokołu Transport Layer Security (TLS 1.2) domyślnie, a wszystkie połączenia przychodzące z protokołami TLS 1.0 i TLS 1.1 są domyślnie odrzucane. Konfigurację wymuszania połączenia szyfrowanego lub konfiguracji wersji protokołu TLS na serwerze elastycznym można zmienić zgodnie z opisem w tym artykule.
Poniżej przedstawiono różne konfiguracje ustawień protokołu SSL i TLS, które można mieć dla wystąpienia serwera elastycznego usługi Azure Database for MySQL:
Ważne
Zgodnie z usunięciem obsługi protokołów TLS 1.0 i TLS 1.1, począwszy od początku września 2024 r., nowe serwery nie będą już mogły korzystać z protokołu TLS 1.0 lub 1.1, a istniejące serwery nie będą mogły obniżyć do tych wersji. Od połowy września 2024 r. zainicjujemy obowiązkowe uaktualnienie wszystkich serwerów, które obecnie używają protokołu TLS 1.0 lub 1.1 do protokołu TLS 1.2. Ten proces uaktualniania ma zostać ukończony do końca września 2024 r. Zdecydowanie zalecamy, aby klienci upewnili się, że ich aplikacje są w pełni zgodne z protokołem TLS 1.2 przed końcem września.
Scenariusz | Ustawienia parametrów serwera | opis |
---|---|---|
Wyłączanie wymuszania protokołu SSL | require_secure_transport = WYŁĄCZONE | Jeśli starsza aplikacja nie obsługuje szyfrowanych połączeń z elastycznym serwerem usługi Azure Database for MySQL, możesz wyłączyć wymuszanie zaszyfrowanych połączeń z wystąpieniem serwera elastycznego usługi Azure Database for MySQL, ustawiając wartość require_secure_transport=OFF. |
Wymuszanie protokołu SSL przy użyciu protokołu TLS w wersji < 1.2 (zostanie wycofane we wrześniu 2024 r.) | require_secure_transport = ON and tls_version = TLS 1.0 lub TLS 1.1 | Jeśli starsza aplikacja obsługuje połączenia szyfrowane, ale wymaga protokołu TLS w wersji 1.2, możesz włączyć połączenia szyfrowane, ale skonfigurować wystąpienie serwera elastycznego usługi Azure Database for MySQL, aby zezwolić na połączenia z protokołem TLS w wersji < (1.0 lub 1.1) obsługiwanej przez aplikację. Obsługiwane tylko w przypadku usługi Azure Database for MySQL — serwer elastyczny w wersji 5.7 |
Wymuszanie protokołu SSL przy użyciu protokołu TLS w wersji 1.2 (konfiguracja domyślna) | require_secure_transport = ON and tls_version = TLS 1.2 | Jest to zalecana i domyślna konfiguracja serwera elastycznego usługi Azure Database for MySQL. |
Wymuszanie protokołu SSL przy użyciu protokołu TLS w wersji = 1.3 | require_secure_transport = ON and tls_version = TLS 1.3 | Jest to przydatne i zalecane w przypadku tworzenia nowych aplikacji. Obsługiwane tylko w przypadku usługi Azure Database for MySQL — serwer elastyczny w wersji 8.0 |
Uwaga
Zmiany szyfrowania SSL na serwerze elastycznym usługi Azure Database for MySQL nie są obsługiwane. Zestawy szyfrowania FIPS są domyślnie wymuszane, gdy tls_version jest ustawiona na protokół TLS w wersji 1.2. W przypadku wersji protokołu TLS innych niż wersja 1.2 szyfrowanie SSL jest ustawione na ustawienia domyślne, które są dostarczane z instalacją społeczności mySQL.
W tym artykule omówiono sposób wykonywania następujących zadań:
- Konfigurowanie wystąpienia elastycznego serwera usługi Azure Database for MySQL
- Z wyłączonym protokołem SSL
- W przypadku wymuszania protokołu SSL z wersją protokołu TLS
- Nawiązywanie połączenia z wystąpieniem serwera elastycznego usługi Azure Database for MySQL przy użyciu wiersza polecenia mysql
- Z wyłączonymi szyfrowanymi połączeniami
- Z włączonymi szyfrowanymi połączeniami
- Weryfikowanie stanu szyfrowania połączenia
- Nawiązywanie połączenia z wystąpieniem serwera elastycznego usługi Azure Database for MySQL przy użyciu szyfrowanych połączeń przy użyciu różnych struktur aplikacji
Wyłączanie wymuszania protokołu SSL w wystąpieniu serwera elastycznego usługi Azure Database for MySQL
Jeśli aplikacja kliencka nie obsługuje szyfrowanych połączeń, należy wyłączyć wymuszanie szyfrowanych połączeń w wystąpieniu serwera elastycznego usługi Azure Database for MySQL. Aby wyłączyć wymuszanie zaszyfrowanych połączeń, należy ustawić parametr serwera require_secure_transport na wartość OFF, jak pokazano na zrzucie ekranu, i zapisać konfigurację parametrów serwera, aby zaczęły obowiązywać. require_secure_transport jest dynamicznym parametrem serwera, który natychmiast wchodzi w życie i nie wymaga ponownego uruchomienia serwera.
Nawiązywanie połączenia przy użyciu klienta wiersza polecenia mysql z wyłączonym protokołem SSL
W poniższym przykładzie pokazano, jak nawiązać połączenie z serwerem przy użyciu interfejsu wiersza polecenia mysql. --ssl-mode=DISABLED
Użyj ustawienia parametry połączenia, aby wyłączyć połączenie TLS/SSL z klienta mysql. Zastąp wartości rzeczywistą nazwą serwera i hasłem.
mysql.exe -h mydemoserver.mysql.database.azure.com -u myadmin -p --ssl-mode=DISABLED
Ważne
Ustawienie require_secure_transport na WYŁĄCZONE nie oznacza, że szyfrowane połączenia nie są obsługiwane po stronie serwera. Jeśli ustawisz require_secure_transport na wartość OFF w wystąpieniu serwera elastycznego usługi Azure Database for MySQL, ale jeśli klient łączy się z zaszyfrowanym połączeniem, nadal jest akceptowany. Poniższe połączenie przy użyciu klienta mysql z wystąpieniem serwera elastycznego usługi Azure Database for MySQL skonfigurowanym przy użyciu require_secure_transport=OFF działa również tak, jak pokazano poniżej.
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)
Podsumowując, ustawienie require_secure_transport=OFF powoduje złagodzenie wymuszania zaszyfrowanych połączeń na serwerze elastycznym usługi Azure Database for MySQL i zezwala na niezaszyfrowane połączenia z serwerem z klienta oprócz zaszyfrowanych połączeń.
Wymuszanie protokołu SSL przy użyciu wersji protokołu TLS
Aby ustawić wersje protokołu TLS w wystąpieniu serwera elastycznego usługi Azure Database for MySQL, należy ustawić parametr *tls_version- server. Ustawieniem domyślnym protokołu TLS jest TLS 1.2. Jeśli aplikacja obsługuje połączenia z serwerem MySQL z protokołem SSL, ale wymaga protokołu innego niż TLS 1.2, należy ustawić wersje protokołu TLS w parametrze serwera. *tls_version - jest parametrem serwera statycznego, który wymaga ponownego uruchomienia serwera, aby parametr został zastosowany. Poniżej przedstawiono obsługiwane protokoły dla dostępnych wersji serwera elastycznego usługi Azure Database for MySQL.
Wersja serwera elastycznego usługi Azure Database for MySQL | Obsługiwane wartości tls_version | Ustawienie domyślne |
---|---|---|
MySQL 5.7 | TLS 1.0, TLS 1.1 (zostanie wycofany we wrześniu 2024 r.) TLS 1.2 | TLS 1.2 |
MySQL 8.0 | TLS 1.2, TLS 1.3 | TLS 1.2 |
Nawiązywanie połączenia przy użyciu klienta wiersza polecenia mysql za pomocą protokołu TLS/SSL
Pobieranie publicznego certyfikatu SSL
Aby korzystać z szyfrowanych połączeń z aplikacjami klienckimi, należy pobrać publiczny certyfikat SSL, który jest również dostępny w okienku Sieć w witrynie Azure Portal, jak pokazano na poniższym zrzucie ekranu.
Uwaga
Ten certyfikat SSL należy pobrać dla serwerów w chmurze Azure Government.
Zapisz plik certyfikatu w preferowanej lokalizacji. Na przykład w tym samouczku jest używane c:\ssl
środowisko lokalne lub \var\www\html\bin
środowisko klienta, w którym jest hostowana aplikacja. Dzięki temu aplikacje mogą bezpiecznie łączyć się z bazą danych za pośrednictwem protokołu SSL.
Jeśli utworzono wystąpienie serwera elastycznego usługi Azure Database for MySQL z dostępem prywatnym (integracja z siecią wirtualną), musisz nawiązać połączenie z serwerem z zasobu w tej samej sieci wirtualnej co serwer. Możesz utworzyć maszynę wirtualną i dodać ją do sieci wirtualnej utworzonej przy użyciu elastycznego wystąpienia serwera usługi Azure Database for MySQL.
Jeśli utworzono wystąpienie serwera elastycznego usługi Azure Database for MySQL z dostępem publicznym (dozwolonymi adresami IP), możesz dodać lokalny adres IP do listy reguł zapory na serwerze.
Możesz wybrać mysql.exe lub MySQL Workbench —> aby nawiązać połączenie z serwerem ze środowiska lokalnego.
W poniższym przykładzie pokazano, jak nawiązać połączenie z serwerem przy użyciu interfejsu wiersza polecenia mysql. --ssl-mode=REQUIRED
Użyj ustawienia parametry połączenia, aby wymusić weryfikację certyfikatu TLS/SSL. Przekaż ścieżkę pliku certyfikatu lokalnego do parametru --ssl-ca
. Zastąp wartości rzeczywistą nazwą serwera i hasłem.
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
Uwaga
Upewnij się, że wartość przekazana do elementu --ssl-ca
jest zgodna ze ścieżką pliku zapisanego certyfikatu.
Jeśli łączysz się z usługą Azure Database for MySQL — elastyczną przy użyciu protokołu SSL i używasz opcji przeprowadzenia pełnej weryfikacji (sslmode=VERTIFY_IDENTITY) z nazwą podmiotu certyfikatu, użyj nazwy <serwera.mysql.database.azure.com> w parametry połączenia.
Jeśli spróbujesz nawiązać połączenie z serwerem przy użyciu nieszyfrowanych połączeń, zostanie wyświetlony błąd informujący o błędzie informujący, że połączenia korzystające z niezabezpieczonego transportu są zabronione podobnie do jednego z poniższych:
ERROR 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.
Weryfikowanie połączenia TLS/SSL
Wykonaj polecenie stanu mysql, aby sprawdzić, czy nawiązano połączenie z serwerem MySQL przy użyciu protokołu TLS/SSL:
mysql> status
Upewnij się, że połączenie jest szyfrowane, przeglądając dane wyjściowe, które powinny zawierać: SSL: szyfrowanie używane. W tym zestawie szyfrowania przedstawiono przykład i na podstawie klienta można zobaczyć inny zestaw szyfrowania.
Jak zidentyfikować protokoły TLS skonfigurowane na serwerze?
Możesz uruchomić polecenie SHOW GLOBAL VARIABLES LIKE 'tls_version'; i sprawdź wartość, aby zrozumieć, jakie są skonfigurowane wszystkie protokoły.
mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
Jak znaleźć protokół TLS używany przez moich klientów do nawiązywania połączenia z serwerem?
Możesz uruchomić poniższe polecenie i przyjrzeć się tls_version sesji, aby określić, która wersja protokołu TLS jest używana do nawiązywania połączenia.
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;
Nawiązywanie połączenia z wystąpieniem serwera elastycznego usługi Azure Database for MySQL przy użyciu szyfrowanych połączeń przy użyciu różnych struktur aplikacji
Parametry połączenia, które są wstępnie zdefiniowane na stronie "Parametry połączenia" dostępne dla serwera w witrynie Azure Portal, zawierają wymagane parametry dla języków wspólnych do nawiązania połączenia z serwerem bazy danych przy użyciu protokołu TLS/SSL. Parametr TLS/SSL różni się w zależności od łącznika. Na przykład "useSSL=true", "sslmode=required" lub "ssl_verify_cert=true" i inne odmiany.
Aby nawiązać zaszyfrowane połączenie z wystąpieniem serwera elastycznego usługi Azure Database for MySQL za pośrednictwem protokołu TLS/SSL z aplikacji, zapoznaj się z następującymi przykładami kodu:
WordPress
Pobierz certyfikat publiczny SSL i dodaj następujące wiersze w wp-config.php po wierszu // **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 (korzystanie z 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 (Łącznik MySQL dla języka 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 (Łącznik MariaDB dla języka 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;
});
Następne kroki
- Używanie aplikacji MySQL Workbench do nawiązywania połączeń z danymi i wykonywania zapytań względem nich na serwerze elastycznym usługi Azure Database for MySQL
- Nawiązywanie połączeń i wykonywanie zapytań dotyczących danych na serwerze elastycznym usługi Azure Database for MySQL przy użyciu języka PHP
- Tworzenie elastycznej sieci wirtualnej serwera usługi Azure Database for MySQL i zarządzanie nią przy użyciu interfejsu wiersza polecenia platformy Azure.
- Dowiedz się więcej o sieci na serwerze elastycznym usługi Azure Database for MySQL
- Dowiedz się więcej o regułach zapory serwera elastycznego usługi Azure Database for MySQL