Menyambungkan ke Azure Database for MySQL - Server Fleksibel dengan koneksi terenkripsi

BERLAKU UNTUK: Azure Database for MySQL - Server Fleksibel

Server fleksibel Azure Database for MySQL mendukung menghubungkan aplikasi klien Anda ke instans server fleksibel Azure Database for MySQL menggunakan Secure Sockets Layer (SSL) dengan enkripsi Keamanan lapisan transportasi (TLS). TLS adalah protokol standar industri yang memastikan koneksi jaringan terenkripsi antara server database dan aplikasi klien, memungkinkan Anda mematuhi persyaratan kepatuhan.

Server fleksibel Azure Database for MySQL mendukung koneksi terenkripsi menggunakan Keamanan Lapisan Transportasi (TLS 1.2) secara default dan semua koneksi masuk dengan TLS 1.0 dan TLS 1.1 ditolak secara default. Penerapan koneksi terenkripsi atau konfigurasi versi TLS di server fleksibel Anda dapat diubah seperti yang dibahas dalam artikel ini.

Berikut ini adalah berbagai konfigurasi pengaturan SSL dan TLS yang dapat Anda miliki untuk instans server fleksibel Azure Database for MySQL Anda:

Skenario Pengaturan parameter server Deskripsi
Menonaktifkan penerapan SSL require_secure_transport = OFF Jika aplikasi warisan Anda tidak mendukung koneksi terenkripsi ke server fleksibel Azure Database for MySQL, Anda dapat menonaktifkan penerapan koneksi terenkripsi ke instans server fleksibel Azure Database for MySQL Anda dengan mengatur require_secure_transport=OFF.
Menerapkan versi SSL dengan TLS < 1.2 require_secure_transport = ON dan tls_version = TLS 1.0 atau TLS 1.1 Jika aplikasi warisan Anda mendukung koneksi terenkripsi tetapi memerlukan TLS versi < 1.2, Anda dapat mengaktifkan koneksi terenkripsi, tetapi mengonfigurasi instans server fleksibel Azure Database for MySQL Anda untuk memungkinkan koneksi dengan versi TLS (1.0 atau 1.1) yang didukung oleh aplikasi Anda. Hanya didukung dengan Azure Database for MySQL versi server fleksibel v5.7
Menerapkan SSL dengan versi TLS = 1.2 (Konfigurasi default) require_secure_transport = ON dan tls_version = TLS 1.2 Ini adalah konfigurasi yang direkomendasikan dan default untuk server fleksibel Azure Database for MySQL.
Menerapkan SSL dengan TLS versi = 1.3 require_secure_transport = ON dan tls_version = TLS 1.3 Pengaturan ini berguna dan disarankan untuk pengembangan aplikasi baru. Hanya didukung dengan Azure Database for MySQL versi server fleksibel v8.0

Catatan

  • Perubahan pada Cipher SSL di server fleksibel Azure Database for MySQL tidak didukung. Cipher suite FIPS diterapkan secara default saat tls_version diatur ke TLS versi 1.2 . Untuk TLS selain versi 1.2, SSL Cipher diatur ke pengaturan default yang dilengkapi dengan penginstalan komunitas MySQL.
  • Edisi komunitas sumber terbuka MySQL dimulai dengan rilis mySQL versi 8.0.26 dan 5.7.35, protokol TLS 1.0 dan TLS 1.1 tidak digunakan lagi. Protokol ini dirilis pada tahun 1996 dan 2006, masing-masing untuk mengenkripsi data yang bergerak, dianggap lemah, kedaluwarsa, dan rentan terhadap ancaman keamanan. Untuk informasi selengkapnya, lihat Penghapusan Dukungan untuk Protokol TLS 1.0 dan TLS 1.1. Server fleksibel Azure Database for MySQL juga berhenti mendukung versi TLS setelah komunitas menghentikan dukungan untuk protokol, untuk menyelaraskan dengan standar keamanan modern.

Dalam artikel ini, Anda akan mempelajari cara:

  • Mengonfigurasi instans server fleksibel Azure Database for MySQL Anda
    • Dengan SSL yang dinonaktifkan
    • Dengan SSL yang diterapkan menggunakan versi TLS
  • Koneksi ke instans server fleksibel Azure Database for MySQL Anda menggunakan baris perintah mysql
    • Dengan koneksi terenkripsi yang dinonaktifkan
    • Dengan koneksi terenkripsi yang diaktifkan
  • Memverifikasi status enkripsi untuk koneksi Anda
  • Koneksi ke instans server fleksibel Azure Database for MySQL Anda dengan koneksi terenkripsi menggunakan berbagai kerangka kerja aplikasi

Menonaktifkan penerapan SSL pada instans server fleksibel Azure Database for MySQL Anda

Jika aplikasi klien Anda tidak mendukung koneksi terenkripsi, Anda perlu menonaktifkan penerapan koneksi terenkripsi pada instans server fleksibel Azure Database for MySQL Anda. Untuk menonaktifkan penerapan koneksi terenkripsi, Anda perlu mengatur parameter server require_secure_transport ke NONAKTIF seperti yang ditunjukkan pada cuplikan layar, dan menyimpan konfigurasi parameter server agar diterapkan. require_secure_transport adalah parameter server dinamis yang langsung berlaku dan kita tidak perlu menghidupkan ulang server untuk memberlakukannya.

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

Melakukan penyambungan menggunakan klien baris perintah mysql dengan SSL yang dinonaktifkan

Contoh berikut menunjukkan cara melakukan penyambungan ke server Anda menggunakan antarmuka baris perintah mysql. Gunakan pengaturan string koneksi --ssl-mode=DISABLED untuk menonaktifkan koneksi TLS /SSL dari klien mysql. Ganti nilai dengan nama server dan kata sandi Anda yang sebenarnya.

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

Penting

Mengatur require_secure_transport ke NONAKTIF tidak berarti koneksi terenkripsi tidak didukung di sisi server. Jika Anda mengatur require_secure_transport ke NONAKTIF pada instans server fleksibel Azure Database for MySQL, tetapi jika klien terhubung dengan koneksi terenkripsi, itu masih diterima. Koneksi berikut menggunakan klien mysql ke instans server fleksibel Azure Database for MySQL yang dikonfigurasi dengan require_secure_transport=OFF juga berfungsi seperti yang ditunjukkan di bawah ini.

 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)

Singkatnya, pengaturan require_secure_transport=OFF melonggarkan penerapan koneksi terenkripsi di server fleksibel Azure Database for MySQL dan memungkinkan koneksi yang tidak terenkripsi ke server dari klien selain koneksi terenkripsi.

Menerapkan SSL menggunakan versi TLS

Untuk mengatur versi TLS pada instans server fleksibel Azure Database for MySQL, Anda perlu mengatur parameter *tls_version- server. Pengaturan default untuk protokol TLS adalah TLS 1.2. Jika aplikasi Anda mendukung koneksi ke server MySQL dengan SSL, tetapi memerlukan protokol apa pun selain TLS 1.2, Anda harus mengatur versi TLS dalam parameter server. *tls_version- adalah parameter server statis yang memerlukan restart server agar parameter berlaku. Berikut ini adalah protokol yang didukung untuk versi server fleksibel Azure Database for MySQL yang tersedia.

Versi server fleksibel Azure Database for MySQL Nilai tls_version yang Didukung Pengaturan default
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

Melakukan penyambungan menggunakan klien baris perintah mysql dengan TLS/SSL

Mengunduh sertifikat SSL publik

Untuk menggunakan koneksi terenkripsi dengan aplikasi klien, Anda perlu mengunduh sertifikat SSL publik, yang juga tersedia di panel jaringan portal Azure seperti yang ditunjukkan pada cuplikan layar di bawah ini.

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

Catatan

Anda harus mengunduh sertifikat SSL ini untuk server Anda di cloud Azure Government.

Simpan file sertifikat ke lokasi pilihan Anda. Misalnya, tutorial ini menggunakan c:\ssl atau \var\www\html\bin pada lingkungan lokal Anda atau lingkungan klien tempat aplikasi Anda dihosting. Ini memungkinkan aplikasi untuk terhubung dengan aman ke database melalui SSL.

Jika Anda membuat instans server fleksibel Azure Database for MySQL dengan akses Privat (Integrasi VNet), Anda perlu menyambungkan ke server Anda dari sumber daya dalam VNet yang sama dengan server Anda. Anda dapat membuat komputer virtual dan menambahkannya ke VNet yang dibuat dengan instans server fleksibel Azure Database for MySQL Anda.

Jika Anda membuat instans server fleksibel Azure Database for MySQL dengan Akses publik (alamat IP yang diizinkan), Anda dapat menambahkan alamat IP lokal Anda ke daftar aturan firewall di server Anda.

Anda dapat memilih mysql.exe atau MySQL Workbench--> untuk melakukan penyambungan ke server dari lingkungan lokal Anda.

Contoh berikut menunjukkan cara melakukan penyambungan ke server Anda menggunakan antarmuka baris perintah mysql. Gunakan pengaturan string koneksi --ssl-mode=REQUIRED untuk menerapkan verifikasi sertifikat TLS/SSL. Teruskan jalur file sertifikat lokal ke parameter --ssl-ca. Ganti nilai dengan nama server dan kata sandi Anda yang sebenarnya.

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

Catatan

Konfirmasikan bahwa nilai yang diteruskan ke --ssl-ca cocok dengan jalur file untuk sertifikat yang Anda simpan. Jika Anda terhubung ke Azure Database for MySQL - Server fleksibel dengan SSL dan menggunakan opsi untuk melakukan verifikasi penuh (sslmode=VERTIFY_IDENTITY) dengan nama subjek sertifikat, gunakan <servername>.mysql.database.azure.com di string koneksi Anda.

Jika Anda mencoba menyambungkan ke server dengan koneksi tidak terenkripsi, Anda akan melihat kesalahan yang menyatakan koneksi yang menggunakan transportasi tidak aman dilarang, mirip dengan yang ada di bawah ini:

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

Memverifikasi koneksi TLS/SSL

Jalankan perintah status mysql untuk memverifikasi bahwa Anda telah tersambung ke server MySQL menggunakan TLS/SSL:

mysql> status

Konfirmasikan bahwa koneksi sudah dienkripsi dengan cara meninjau output yang akan menampilkan: SSL: Cipher yang digunakan adalah. Cipher suite ini menunjukkan satu contoh dan Anda dapat melihat cipher suite yang berbeda berdasarkan kliennya.

Bagaimana cara mengidentifikasi protokol TLS yang dikonfigurasi di server Anda?

Anda dapat menjalankan perintah SHOW GLOBAL VARIABLES LIKE 'tls_version'; dan periksa nilai untuk memahami apa yang dikonfigurasi oleh semua protokol.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

Bagaimana cara menemukan protokol TLS mana yang digunakan oleh klien saya untuk terhubung ke server?

Anda dapat menjalankan perintah di bawah ini dan melihat tls_version sesi untuk mengidentifikasi versi TLS mana yang digunakan untuk menyambungkan.

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;

Koneksi ke instans server fleksibel Azure Database for MySQL Anda dengan koneksi terenkripsi menggunakan berbagai kerangka kerja aplikasi

String koneksi yang telah ditentukan sebelumnya di halaman "String Koneksi" yang tersedia untuk server Anda di portal Microsoft Azure mencakup parameter yang diperlukan untuk bahasa umum agar dapat tersambung ke server database Anda menggunakan TLS/SSL. Parameter TLS/SSL bervariasi berdasarkan konektornya. Misalnya, "useSSL=true", "sslmode=required", atau "ssl_verify_cert=true" dan variasi lainnya.

Untuk membuat koneksi terenkripsi ke instans server fleksibel Azure Database for MySQL Anda melalui TLS/SSL dari aplikasi Anda, lihat sampel kode berikut:

WordPress

Unduh sertifikat publik SSL dan tambahkan baris berikut di wp-config.php setelah baris // **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 (Menggunakan 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 Connector untuk 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 Connector untuk 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;
});

Langkah berikutnya