اتصل بـ 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 هي معلمة خادم ديناميكية تدخل حيز التنفيذ على الفور ولا تتطلب إعادة تشغيل الخادم لتصبح سارية المفعول.
الاتصال باستخدام عميل سطر الأوامر 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 كما هو موضح في لقطة الشاشة أدناه.
احفظ ملف الشهادة في موقعك المفضل. على سبيل المثال، يستخدم 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;
});
الخطوات التالية
- استخدام MySQL Workbench للاتصال بالبيانات والاستعلام عنها في قاعدة بيانات Azure لخادم MySQL المرن
- استخدام PHP للاتصال بالبيانات والاستعلام عنها في قاعدة بيانات Azure لخادم MySQL المرن
- إنشاء وإدارة قاعدة بيانات Azure لشبكة MySQL المرنة Server الظاهرية باستخدام Azure CLI.
- تعرف على المزيد حول الشبكات في قاعدة بيانات Azure لخادم MySQL المرن
- فهم المزيد حول قاعدة بيانات Azure لقواعد جدار حماية خادم MySQL المرن

