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

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

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

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

فيما يلي التكوينات المختلفة لإعدادات SSL و TLS التي يمكنك الحصول عليها لخادمك المرن:

السيناريو إعدادات معلمة الخادم الوصف
تعطيل تطبيق طبقة المقابس الآمنة (SSL) require_secure_transport = إيقاف إذا كان تطبيقك القديم لا يدعم الاتصالات المشفرة بخادم MySQL، فيمكنك تعطيل فرض الاتصالات المشفرة على الخادم المرن عن طريق تعيين require_secure_transport=OFF.
فرض طبقة المقابس الآمنة باستخدام TLS الإصدار < 1.2 require_secure_transport = تشغيل و tls_version = TLSV1 أو TLSV1.1 إذا كان تطبيقك القديم يدعم الاتصالات المشفرة ولكنه يتطلب إصدار < TLS 1.2، فيمكنك تمكين الاتصالات المشفرة ولكن تكوين الخادم المرن للسماح بالاتصالات بإصدار TLS (الإصدار 1.0 أو الإصدار 1.1) الذي يدعمه تطبيقك. مدعوم فقط مع قاعدة بيانات Azure ل MySQL - إصدار خادم مرن v5.7
فرض طبقة المقابس الآمنة باستخدام إصدار TLS = 1.2 (التكوين الافتراضي) require_secure_transport = تشغيل و tls_version = TLSV1.2 هذا هو التكوين الموصى به والافتراضي للخادم المرن.
فرض طبقة المقابس الآمنة باستخدام إصدار TLS = 1.3 require_secure_transport = تشغيل و tls_version = TLSV1.3 هذا مفيد وموصى به لتطوير تطبيقات جديدة. مدعوم فقط مع قاعدة بيانات Azure ل MySQL - إصدار خادم مرن v8.0

ملاحظة

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

ستتعرف في هذه المقالة على طريقة القيام بما يلي:

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

تعطيل فرض طبقة المقابس الآمنة (SSL) على الخادم المرن

إذا كان تطبيق العميل الخاص بك لا يدعم الاتصالات المشفرة، فستحتاج إلى تعطيل فرض الاتصالات المشفرة على الخادم المرن. لتعطيل فرض الاتصالات المشفرة، ستحتاج إلى تعيين معلمة خادم 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 لا يعني أن الاتصالات المشفرة لن تكون مدعومة على جانب الخادم. إذا قمت بتعيين require_secure_transport إلى OFF على خادم مرن ولكن إذا كان العميل يتصل باتصال مشفر ، فسيظل مقبولا. سيعمل الاتصال التالي باستخدام عميل 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 من فرض الاتصالات المشفرة على الخادم المرن ويسمح بالاتصالات غير المشفرة بالخادم من العميل بالإضافة إلى الاتصالات المشفرة.

فرض طبقة المقابس الآمنة باستخدام إصدار TLS

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

إصدار خادم مرن القيم المدعومة tls_version الإعداد الافتراضي
ماي إس كيو إل ٥,٧ TLSv1، TLSv1.1، TLSv1.2 TLSv1.2
ماي إس إل ٨,٠ TLSv1.2, TLSv1.3 TLSv1.2

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

تنزيل شهادة SSL العامة

لاستخدام الاتصالات المشفرة مع تطبيقات العميل، ستحتاج إلى تنزيل شهادة SSL العامة المتوفرة أيضا في شفرة شبكة مدخل Azure كما هو موضح في لقطة الشاشة أدناه.

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

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

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

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

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

يوضح المثال التالي كيفية الاتصال بالخادم الخاص بك باستخدام واجهة سطر الأوامر mysql. --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- مرن مع طبقة المقابس الآمنة وتستخدم خيارا لإجراء التحقق الكامل (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 للتحقق من اتصالك بخادم 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 المعلمات المطلوبة للغات الشائعة للاتصال بخادم قاعدة البيانات باستخدام طبقة النقل الآمنة (TLS/SSL). تختلف معلمة TLS/SSL بناء على الموصل. على سبيل المثال، "useSSL=true" أو "sslmode=required" أو "ssl_verify_cert=true" وغيرها من الاختلافات.

لإنشاء اتصال مشفر بالخادم المرن عبر 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($conn)) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}

PHP (باستخدام شركة تنمية نفط عمان)

$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);

بايثون (MySQLConnector بايثون)

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)

بايثون (PyMySQL)

conn = pymysql.connect(user='myadmin',
                       password='yourpassword',
                       database='quickstartdb',
                       host='mydemoserver.mysql.database.azure.com',
                       ssl={'ca': '/var/www/html/DigiCertGlobalRootCA.crt.pem'})

جانغو (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)

جافا (موصل MySQL لجافا)

# 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);

جافا (موصل MariaDB لجافا)

# 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;
});

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