اتصل بـ Azure Database لخادم MySQL - Flexible Server مع وصول خاص في مدخل Azure

ينطبق على: قاعدة بيانات Azure لـMySQL - خادم مرن

يدعم خادم Azure Database for MySQL المرن توصيل تطبيقات العميل بمثيل خادم Azure Database for MySQL المرن باستخدام طبقة مآخذ التوصيل الآمنة (SSL) مع تشفير أمان طبقة النقل (TLS). TLS هو بروتوكول قياسي صناعي يضمن اتصالات شبكة مشفّرة بين خادم قاعدة البيانات وتطبيقات العميل، ما يسمح لك بالالتزام بمتطلبات الامتثال.

يدعم خادم Azure Database for MySQL المرن الاتصالات المشفرة باستخدام أمان طبقة النقل (TLS 1.2) بشكل افتراضي ويتم رفض جميع الاتصالات الواردة مع TLS 1.0 وTLS 1.1 بشكل افتراضي. يمكن تغيير فرض الاتصال المشفر أو تكوين إصدار TLS على الخادم المرن الخاص بك بالطريقة الموضعة في هذه المقالة.

فيما يلي التكوينات المختلفة لإعدادات SSL وTLS التي يمكنك الحصول علىها لمثيل خادم Azure Database for MySQL المرن:

السيناريو إعدادات معلمات الخادم ‏‏الوصف
تعطيل فرض SSL require_secure_transport = OFF إذا كان تطبيقك القديم لا يدعم الاتصالات المشفرة بقاعدة بيانات Azure لخادم MySQL المرن، يمكنك تعطيل فرض الاتصالات المشفرة إلى مثيل خادم Azure Database for MySQL المرن عن طريق تعيين require_secure_transport=OFF.
فرض SSL مع الإصدار < 1.2 من TLS require_secure_transport = ON و tls_version = TLS 1.0 أو TLS 1.1 إذا كان تطبيقك القديم يدعم الاتصالات المشفرة ولكنه يتطلب إصدار < TLS 1.2، يمكنك تمكين الاتصالات المشفرة، ولكن تكوين مثيل خادم Azure Database for MySQL المرن للسماح بالاتصالات بإصدار TLS (1.0 أو 1.1) المدعوم من قبل التطبيق الخاص بك. مدعوم فقط مع إصدار الخادم المرن v5.7 من Azure Database for MySQL
فرض SSL مع إصدار = 1.2 من TLS (التكوين الافتراضي) 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 Database for MySQL flexible server version v8.0

إشعار

  • التغييرات على SSL Cipher على خادم Azure Database for MySQL المرن غير مدعوم. يتم فرض مجموعات تشفير FIPS بشكل افتراضي عند تعيين tls_version إلى إصدار TLS 1.2 . بالنسبة لإصدارات TLS بخلاف الإصدار 1.2، يتم تعيين SSL Cipher إلى الإعدادات الافتراضية التي تأتي مع تثبيت مجتمع MySQL.
  • يتم إهمال إصدارات المجتمع مفتوحة المصدر MySQL بدءا من إصدارات MySQL 8.0.26 و5.7.35 وTLS 1.0 وTLS 1.1. وتعتبر هذه البروتوكولات التي تم إصدارها في عامي 1996 و2006، على التوالي لتشفير البيانات قيد الحركة، ضعيفة وعتيقة ومعرضة للتهديدات الأمنية. لمزيد من المعلومات، راجع إزالة الدعم لبروتوكولات TLS 1.0 وTLS 1.1. يتوقف خادم Azure Database for MySQL المرن أيضا عن دعم إصدارات TLS بمجرد توقف المجتمع عن دعم البروتوكول، للتوافق مع معايير الأمان الحديثة.

في هذه المقالة، ستتعرف على كيفية:

  • تكوين مثيل الخادم المرن لقاعدة بيانات Azure ل MySQL
    • مع تعطيل SSL
    • مع فرض SSL مع إصدار TLS
  • الاتصال إلى قاعدة بيانات Azure لمثيل خادم MySQL المرن باستخدام سطر أوامر mysql
    • مع تعطيل الاتصالات المشفرة
    • مع تمكين الاتصالات المشفرة
  • التحقق من حالة التشفير للاتصال
  • الاتصال إلى قاعدة بيانات Azure لمثيل خادم MySQL المرن مع اتصالات مشفرة باستخدام أطر عمل تطبيقات مختلفة

تعطيل فرض SSL على مثيل خادم Azure Database for MySQL المرن

إذا كان تطبيق العميل الخاص بك لا يدعم الاتصالات المشفرة، فأنت بحاجة إلى تعطيل فرض الاتصالات المشفرة على قاعدة بيانات Azure لمثيل خادم MySQL المرن. لتعطيل فرض الاتصالات المشفرة، تحتاج إلى تعيين معلمة خادم require_secure_transport إلى إيقاف التشغيل كما هو موضح في لقطة الشاشة، وحفظ تكوين معلمة الخادم حتى يصبح ساري المفعول. require_secure_transport هي معلمة خادم ديناميكية تسري على الفور ولا تتطلب إعادة تشغيل الخادم حتى تسري.

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

الاتصال باستخدام عميل سطر الأوامر mysql مع تعطيل SSL

يوضح المثال التالي كيفية الاتصال بخادمك المرن باستخدام واجهة سطر أوامر psql. استخدم إعداد سلسلة الاتصال --ssl-mode=DISABLED لتعطيل اتصال TLS/SSL من عميل mysql. استبدل القيم باسم الخادم الفعلي وكلمة المرور.

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

هام

لا يعني تعيين require_secure_transport إلى إيقاف التشغيل أن الاتصالات المشفرة غير مدعومة على جانب الخادم. إذا قمت بتعيين require_secure_transport إلى إيقاف تشغيل على مثيل خادم Azure Database for MySQL المرن، ولكن إذا كان العميل يتصل بالاتصال المشفر، فلا يزال مقبولا. يعمل الاتصال التالي باستخدام عميل mysql بمثيل خادم مرن ل Azure Database for 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 Database for MySQL المرن، تحتاج إلى تعيين معلمة خادم *tls_version- . الإعداد الافتراضي لبروتوكول TLS هو TLS 1.2. إذا كان تطبيقك يدعم الاتصالات بخادم MySQL مع SSL، ولكنه يتطلب أي بروتوكول آخر غير TLS 1.2، فأنت بحاجة إلى تعيين إصدارات TLS في معلمة الخادم. *tls_version- هي معلمة خادم ثابت تتطلب إعادة تشغيل الخادم حتى تسري المعلمة. فيما يلي البروتوكولات المدعومة للإصدارات المتوفرة من خادم Azure Database for MySQL المرن.

إصدار الخادم المرن ل Azure Database for 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 العامة، والتي تتوفر أيضا في جزء شبكة مدخل Microsoft Azure كما هو موضح في لقطة الشاشة أدناه.

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

إشعار

يجب تنزيل شهادة SSL هذه لخوادمك في سحابة Azure Government.

احفظ ملف الشهادة في الموقع الذي تفضله. على سبيل المثال، يستخدم c:\ssl هذا البرنامج التعليمي أو \var\www\html\bin على بيئتك المحلية أو بيئة العميل حيث تتم استضافة التطبيق الخاص بك. يسمح هذا للتطبيقات بالاتصال بأمان بقاعدة البيانات عبر SSL.

إذا قمت بإنشاء مثيل خادم مرن لقاعدة بيانات Azure ل MySQL مع وصول خاص (تكامل VNet)، فستحتاج إلى الاتصال بالخادم الخاص بك من مورد داخل نفس VNet مثل الخادم الخاص بك. يمكنك إنشاء جهاز ظاهري وإضافته إلى VNet الذي تم إنشاؤه باستخدام مثيل الخادم المرن ل Azure Database for MySQL.

إذا قمت بإنشاء مثيل خادم مرن لقاعدة بيانات Azure ل MySQL مع الوصول العام (عناوين IP المسموح بها)، يمكنك إضافة عنوان IP المحلي إلى قائمة قواعد جدار الحماية على الخادم الخاص بك.

يمكنك اختيار mysql.exe أو MySQL Workbench--> للاتصال بالخادم من بيئتك المحلية.

يوضح المثال التالي كيفية الاتصال بخادمك المرن باستخدام واجهة سطر أوامر psql. استخدم--ssl-mode=REQUIREDإعداد سلسلة الاتصال لفرض التحقق من شهادة TLS/SSL. قم بتمرير مسار ملف الشهادة المحلية إلى--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) مع اسم موضوع الشهادة، فاستخدم <servername.mysql.database.azure.com> في سلسلة الاتصال الخاصة بك.

إذا حاولت الاتصال بالخادم الخاص بك باستخدام اتصالات غير مشفرة، فسترى خطأ يفيد بأن الاتصالات التي تستخدم النقل غير الآمن محظورة على غرار الاتصالات أدناه:

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

تحقق من اتصال TLS/SSL

نفذ أمر mysql stauts للتحقق من اتصالك بخادم MySQL باستخدام TLS/SSL:

mysql> status

تأكد من تشفير الاتصال من خلال مراجعة الإخراج، والذي يجب أن يظهر: SSL: التشفير قيد الاستخدام هو . تعرض مجموعة التشفير هذه مثالا واستنادا إلى العميل، يمكنك رؤية مجموعة تشفير مختلفة.

كيفية تحديد بروتوكولات TLS التي تم تكوينها على الخادم الخاص بك؟

يمكنك تشغيل الأمر إظهار المتغيرات العمومية مثل "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/SSL. تختلف المعلمة TLS/SSL استنادًا إلى الموصل. على سبيل المثال، "useSSL=true" أو "sslmode=required" أو "ssl_verify_cert=true" والتباينات الأخرى.

لإنشاء اتصال مشفر بقاعدة بيانات Azure لمثيل خادم MySQL المرن عبر TLS/SSL من التطبيق الخاص بك، راجع نماذج التعليمات البرمجية التالية:

ورد

قم بتنزيل شهادة 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;
});

الخطوات التالية