Łą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:

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 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.
  • Wersje społeczności open source programu MySQL, począwszy od wersji 8.0.26 i 5.7.35, protokoły TLS 1.0 i TLS 1.1 są przestarzałe. Te protokoły wydane odpowiednio w 1996 i 2006 r. w celu szyfrowania danych w ruchu są uznawane za słabe, nieaktualne i podatne na zagrożenia bezpieczeństwa. Aby uzyskać więcej informacji, zobacz Usuwanie obsługi protokołów TLS 1.0 i TLS 1.1. Elastyczny serwer usługi Azure Database for MySQL przestaje również obsługiwać wersje protokołu TLS po zatrzymaniu obsługi protokołu przez społeczność w celu dostosowania ich do nowoczesnych standardów zabezpieczeń.

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
  • Połączenie do wystąpienia 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
  • Połączenie do wystąpienia serwera elastycznego usługi Azure Database for MySQL z zaszyfrowanymi połączeniami 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.

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

Połączenie 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, TLS 1.2 TLS 1.2
MySQL 8.0 TLS 1.2, TLS 1.3 TLS 1.2

Połączenie przy użyciu klienta wiersza polecenia mysql z protokołem 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.

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

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;

Połączenie do wystąpienia serwera elastycznego usługi Azure Database for MySQL z zaszyfrowanymi połączeniami przy użyciu różnych struktur aplikacji

ciągi Połączenie ion zdefiniowane wstępnie na stronie "ciągi Połączenie ion" 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 (MySQL Połączenie 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 Połączenie or 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 (MariaDB Połączenie or 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 (MySql Połączenie 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;
});

Następne kroki