Бөлісу құралы:


Подключение к базе данных Azure для MySQL — гибкому серверу с зашифрованными подключениями

ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для MySQL — гибкий сервер

База данных Azure для MySQL гибкий сервер поддерживает подключение клиентских приложений к База данных Azure для MySQL гибкому экземпляру сервера с помощью протокола SSL с шифрованием TLS. TLS — это отраслевой стандарт протокола, обеспечивающего шифрование сетевых подключений между сервером базы данных и клиентскими приложениями, что позволяет соблюдать требования соответствия.

База данных Azure для MySQL гибкий сервер поддерживает зашифрованные подключения с помощью протокола TLS 1.2 по умолчанию, а все входящие подключения с TLS 1.0 и TLS 1.1 по умолчанию запрещены. Конфигурация с принудительным применением зашифрованного подключения или версии TLS на гибком сервере может быть изменена, как описано в этой статье.

Ниже приведены различные конфигурации параметров SSL и TLS, которые можно использовать для вашего База данных Azure для MySQL гибкого экземпляра сервера:

Сценарий Параметры сервера Description
Отключение принудительного применения SSL require_secure_transport = OFF Если устаревшее приложение не поддерживает зашифрованные подключения к гибкому серверу База данных Azure для MySQL, вы можете отключить принудительное применение зашифрованных подключений к экземпляру гибкого сервера База данных Azure для MySQL, задав require_secure_transport=OFF.
Применение SSL с TLS версии ниже 1.2 require_secure_transport = ON и tls_version = TLS 1.0 или TLS 1.1 Если устаревшее приложение поддерживает зашифрованные подключения, но требует TLS версии < 1.2, вы можете включить зашифрованные подключения, но настроить экземпляр гибкого сервера База данных Azure для MySQL, чтобы разрешить подключения с версией TLS (1.0 или 1.1), поддерживаемой приложением. Поддерживается только с гибким сервером версии База данных Azure для MySQL версии 5.7
Принудительное использование SSL с версией TLS = 1.2 (конфигурация по умолчанию) require_secure_transport = ON и tls_version = TLS 1.2 Это рекомендуемая и стандартная конфигурация для гибкого сервера База данных Azure для MySQL.
Применение SSL с TLS версии = 1.3 require_secure_transport = ON и tls_version = TLS 1.3 Это полезно и рекомендуется для разработки новых приложений. Поддерживается только для гибкого сервера версии База данных Azure для MySQL версии 8.0

Примечание.

  • Изменения в шифре SSL на гибком сервере База данных Azure для MySQL не поддерживаются. Наборы шифров FIPS применяются по умолчанию, если для параметра tls_version установлено значение 1.2. Для версий TLS, отличных от версии 1.2, для шифра SSL заданы параметры по умолчанию, которые входят в состав установщика от сообщества MySQL.
  • Выпуски сообщества с открытым кодом MySQL, начиная с выпуска MySQL версии 8.0.26 и 5.7.35, протоколы TLS 1.0 и TLS 1.1 устарели. Эти протоколы, выпущенные в 1996 и 2006 гг. соответственно для шифрования передаваемых данных, считаются слабыми, устаревшими и уязвимыми для угроз безопасности. Дополнительные сведения см. в разделе "Удаление поддержки протоколов TLS 1.0 и TLS 1.1". База данных Azure для MySQL гибкий сервер также останавливает поддержку версий TLS после прекращения поддержки протокола в соответствии с современными стандартами безопасности.

Вы узнаете, как выполнять следующие задачи:

  • Настройка гибкого экземпляра сервера База данных Azure для MySQL
    • Без использования SSL
    • С принудительным применением SSL для версий TLS
  • Подключение в База данных Azure для MySQL гибкий экземпляр сервера с помощью командной строки mysql
    • С отключенным шифрованием подключений
    • С включенным шифрованием подключений
  • Проверка состояния шифрования для подключения
  • Подключение к База данных Azure для MySQL гибкому экземпляру сервера с зашифрованными подключениями с помощью различных платформ приложений

Отключение принудительного применения SSL на гибком экземпляре сервера База данных Azure для MySQL

Если клиентское приложение не поддерживает зашифрованные подключения, необходимо отключить принудительное применение зашифрованных подключений на База данных Azure для MySQL гибком экземпляре сервера. Чтобы отключить принудительное применение зашифрованных подключений, необходимо задать для параметра сервера require_secure_transport значение OFF, как показано на снимке экрана, и сохранить конфигурацию параметра сервера, чтобы она вступают в силу. require_secure_transport является динамическим параметром сервера, то есть вступает в силу немедленно, без перезапуска сервера.

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

Подключение с помощью клиента командной строки mysql с отключенным SSL

В следующем примере показано, как подключиться к серверу с помощью интерфейса командной строки mysql. Используйте параметр --ssl-mode=DISABLED в строке подключения, чтобы отключить подключение TLS/SSL от клиента mysql. Замените в ней предложенные значения реальными значениями имени сервера и пароля.

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

Важно!

Установка параметра require_secure_transport в OFF не означает, что зашифрованные подключения не поддерживаются на стороне сервера. Если в экземпляр База данных Azure для MySQL е гибкого сервера require_secure_transport задано значение OFF, но если клиент подключается к зашифрованным подключению, он по-прежнему принимается. Следующее подключение с помощью клиента mysql к База данных Azure для MySQL гибкому экземпляру сервера, настроенном с помощью require_secure_transport=OFF, также работает, как показано ниже.

 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)

В итоге параметр require_secure_transport=OFF упрощает применение зашифрованных подключений на гибком сервере База данных Azure для MySQL и разрешает незашифрованные подключения к серверу из клиента в дополнение к зашифрованным подключениям.

Применение SSL с версией TLS

Чтобы задать версии TLS в База данных Azure для MySQL гибкий экземпляр сервера, необходимо задать параметр *tls_version-server. Значение по умолчанию для протокола TLS — TLS 1.2. Если приложение поддерживает подключения к серверу MySQL с помощью SSL, но требуется любой протокол, отличный от TLS 1.2, необходимо задать версии TLS в параметре сервера. *tls_version— это статический параметр сервера, для которого требуется перезапуск сервера для того, чтобы параметр вступил в силу. Ниже приведены поддерживаемые протоколы для доступных версий База данных Azure для MySQL гибкого сервера.

База данных Azure для MySQL гибкой версии сервера Поддерживаемые значения tls_version Параметр по умолчанию
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

Подключение с помощью клиента командной строки mysql с использованием TLS/SSL

Скачивание общедоступного SSL-сертификата

Чтобы использовать зашифрованные подключения с клиентскими приложениями, необходимо скачать общедоступный SSL-сертификат, который также доступен в области портал Azure сети, как показано на снимке экрана ниже.

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

Примечание.

Этот SSL-сертификат необходимо скачать для серверов в облаке Azure для государственных организаций.

Сохраните файл сертификата в любое расположение. В этом руководстве используется c:\ssl или \var\www\html\bin в локальной среде или в клиентской среде, где размещается приложение. Это позволяет приложениям безопасно подключаться к базе данных через SSL.

Если вы создали гибкий экземпляр сервера База данных Azure для MySQL с частным доступом (интеграция с виртуальной сетью), необходимо подключиться к серверу из ресурса в той же виртуальной сети, что и сервер. Вы можете создать виртуальную машину и добавить ее в виртуальную сеть, созданную с помощью База данных Azure для MySQL гибкого экземпляра сервера.

Если вы создали База данных Azure для MySQL гибкий экземпляр сервера с общедоступным доступом (разрешенными IP-адресами), вы можете добавить локальный IP-адрес в список правил брандмауэра на сервере.

Вы можете выбрать mysql.exe или MySQL Workbench, чтобы подключиться к серверу из локальной среды.

В следующем примере показано, как подключиться к серверу с помощью интерфейса командной строки mysql. Для принудительной проверки сертификата TLS/SSL используйте параметр --ssl-mode=REQUIRED. Передайте путь к локальному файлу сертификата параметру --ssl-ca. Замените в ней предложенные значения реальными значениями имени сервера и пароля.

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

Примечание.

Убедитесь, что значение в параметре --ssl-ca соответствует пути к сохраненному файлу сертификата. Если вы подключаетесь к Базе данных Azure MySQL (гибкий сервер) с помощью SSL и используете параметр для полной проверки (sslmode = VERTIFY_IDENTITY) с именем субъекта сертификата, укажите в строке подключения <имя_сервера>.mysql.database.azure.com.

При попытке незашифрованного подключения к серверу вы увидите ошибку с сообщением о том, что подключения с использованием незащищенного транспорта будут заблокированы. Пример такой ошибки представлен ниже:

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

Проверка TLS/SSL-соединения

Выполните команду mysql status, чтобы проверить наличие подключения к серверу MySQL по протоколу SSL:

mysql> status

Убедитесь, что подключение зашифровано, просмотрев выходные данные, в которых должно отображаться следующее: SSL: Cipher in use is (SSL: используется шифр). Этот комплект шифров приведен только для примера, а вы увидите другой комплект в зависимости от используемого клиента.

Как определить протоколы TLS, настроенные на сервере?

Вы можете запустить команду SHOW GLOBAL VARIABLES LIKE 'tls_version'; также проверьте значение, чтобы понять, как все протоколы настроены.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Как найти, какой протокол TLS используется моими клиентами для подключения к серверу?

Вы можете выполнить следующую команду и просмотреть tls_version сеанса, чтобы определить, какая версия TLS используется для подключения.

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;

Подключение к База данных Azure для MySQL гибкому экземпляру сервера с зашифрованными подключениями с помощью различных платформ приложений

Предопределенные строки подключения в разделе "Строки подключения" на странице сервера на портале Azure содержат необходимые параметры для распространенных языков, которые позволяют подключиться к серверу базы данных с помощью TLS. Параметр TLS/SSL зависит от используемого соединителя. Это могут быть "useSSL=true", "sslmode=required", "ssl_verify_cert=true" и другие варианты.

Чтобы установить зашифрованное подключение к вашему База данных Azure для MySQL гибкому экземпляру сервера через TLS/SSL из приложения, ознакомьтесь со следующими примерами кода:

WordPress

Скачайте общедоступный сертификат SSL и добавьте следующие строки в файл wp-config.php после строки // **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 (с использованием 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 (соединитель MySQL для 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 для 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;
});

Следующие шаги