Mengonfigurasi konektivitas SSL di aplikasi agar terhubung ke Azure Database for MySQL dengan aman.

BERLAKU UNTUKAzure Database for MySQL - Server Tunggal

Penting

Server tunggal Azure Database for MySQL berada di jalur penghentian. Kami sangat menyarankan Agar Anda meningkatkan ke server fleksibel Azure Database for MySQL. Untuk informasi selengkapnya tentang migrasi ke server fleksibel Azure Database for MySQL, lihat Apa yang terjadi pada Server Tunggal Azure Database for MySQL?

Azure Database for MySQL mendukung koneksi server Azure Database for MySQL Anda ke aplikasi klien menggunakan Secure Sockets Layer (SSL). Menerapkan koneksi SSL antara server database dan aplikasi klien Anda membantu melindungi dari serangan "man in the middle" dengan mengenkripsi aliran data antara server dan aplikasi Anda.

Langkah 1: Mendapatkan Sertifikat TLS/SSL

Unduh sertifikat yang diperlukan untuk berkomunikasi melalui SSL dengan Azure DB for MySQL Anda https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem dari dan simpan file sertifikat ke drive lokal Anda (tutorial ini menggunakan c:\ssl misalnya). Untuk Microsoft Internet Explorer dan Microsoft Azure Stack Edge: Setelah unduhan selesai, ganti nama sertifikat menjadi BaltimoreCyberTrustRoot.crt.pem.

Lihat tautan berikut untuk sertifikat untuk server di sovereign cloud: Azure Government, Microsoft Azure yang dioperasikan oleh 21Vianet, dan Azure Jerman.

Langkah 2: Ikat SSL

Untuk string koneksi bahasa pemrograman tertentu, silakan lihat contoh kode di bawah ini.

Menyambungkan ke server menggunakan MySQL Workbench melalui SSL

Konfigurasikan MySQL Workbench untuk terhubung dengan aman melalui SSL.

  1. Dari dialog Atur Koneksi Baru, buka ke tab SSL.

  2. Perbarui bidang Gunakan SSL ke "Wajib".

  3. Di bidang File CA SSL: , masukkan lokasi file DigiCertGlobalRootG2.crt.pem.

    Save SSL configuration

Untuk koneksi yang sudah ada, Anda dapat mengikat SSL dengan mengklik kanan ikon koneksi dan memilih edit. Kemudian buka tab SSL dan ikat file sertifikat.

Menyambungkan ke server menggunakan CLI MySQL melalui SSL

Cara lain untuk mengikat sertifikat SSL adalah dengan menggunakan antarmuka baris perintah MySQL dengan menjalankan perintah berikut.

mysql.exe -h mydemoserver.mysql.database.azure.com -u Username@mydemoserver -p --ssl-mode=REQUIRED --ssl-ca=c:\ssl\DigiCertGlobalRootG2.crt.pem

Catatan

Saat menggunakan antarmuka baris perintah MySQL di Windows, Anda mungkin menerima kesalahan SSL connection error: Certificate signature check failed. Jika hal ini terjadi, ganti parameter --ssl-mode=REQUIRED --ssl-ca={filepath} dengan --ssl.

Langkah 3: Menerapkan koneksi aman di Azure

Menggunakan portal Azure

Menggunakan portal Azure, kunjungi Azure DB for MySQL Anda, lalu klik Keamanan koneksi. Gunakan tombol dwiarah untuk mengaktifkan atau menonaktifkan pengaturan Terapkan koneksi SSL, lalu klik Simpan. Microsoft merekomendasikan untuk selalu mengaktifkan pengaturan Terapkan koneksi aman untuk peningkatan keamanan.

Screenshot of Azure portal to Enforce SSL connections in Azure Database for MySQL

Menggunakan Azure CLI

Anda dapat mengaktifkan atau menonaktifkan parameter ssl-enforcement menggunakan nilai Enabled atau Disabled berturut-turut di Azure CLI.

az mysql server update --resource-group myresource --name mydemoserver --ssl-enforcement Enabled

Langkah 4: Memverifikasi koneksi SSL

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

mysql> status

Konfirmasikan bahwa sambungan sudah dienkripsi dengan meninjau output, yang seharusnya menunjukkan: SSL: Cipher yang digunakan adalah AES256-SHA

Kode Sampel

Untuk membuat koneksi aman ke Azure Database for MySQL melalui SSL dari aplikasi Anda, lihat kode sampel berikut:

Lihat daftar driver yang kompatibel ang didukung oleh layanan Azure Database for MySQL.

PHP

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/DigiCertGlobalRootG2.crt.pem", NULL, NULL);
mysqli_real_connect($conn, 'mydemoserver.mysql.database.azure.com', 'myadmin@mydemoserver', '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/DigiCertGlobalRootG2.crt.pem'
);
$db = new PDO('mysql:host=mydemoserver.mysql.database.azure.com;port=3306;dbname=databasename', 'username@mydemoserver', 'yourpassword', $options);

Python (MySQLConnector Python)

try:
    conn = mysql.connector.connect(user='myadmin@mydemoserver',
                                   password='yourpassword',
                                   database='quickstartdb',
                                   host='mydemoserver.mysql.database.azure.com',
                                   ssl_ca='/var/www/html/DigiCertGlobalRootG2.crt.pem')
except mysql.connector.Error as err:
    print(err)

Python (PyMySQL)

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

Django (PyMySQL)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'quickstartdb',
        'USER': 'myadmin@mydemoserver',
        'PASSWORD': 'yourpassword',
        'HOST': 'mydemoserver.mysql.database.azure.com',
        'PORT': '3306',
        'OPTIONS': {
            'ssl': {'ca': '/var/www/html/DigiCertGlobalRootG2.crt.pem'}
        }
    }
}

Ruby

client = Mysql2::Client.new(
        :host     => 'mydemoserver.mysql.database.azure.com',
        :username => 'myadmin@mydemoserver',
        :password => 'yourpassword',
        :database => 'quickstartdb',
        :sslca => '/var/www/html/DigiCertGlobalRootG2.crt.pem'
    )

Golang

rootCertPool := x509.NewCertPool()
pem, _ := ioutil.ReadFile("/var/www/html/DigiCertGlobalRootG2.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@mydemoserver" , "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@mydemoserver');
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@mydemoserver');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

.NET (MySqlConnector)

var builder = new MySqlConnectionStringBuilder
{
    Server = "mydemoserver.mysql.database.azure.com",
    UserID = "myadmin@mydemoserver",
    Password = "yourpassword",
    Database = "quickstartdb",
    SslMode = MySqlSslMode.VerifyCA,
    SslCa = "DigiCertGlobalRootG2.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/DigiCertGlobalRootG2.crt.pem", "utf8")];
var conn=mysql.createConnection({
    host:"mydemoserver.mysql.database.azure.com",
    user:"myadmin@mydemoserver",
    password:"yourpassword",
    database:"quickstartdb",
    port:3306,
    ssl: {
        rejectUnauthorized: true,
        ca: serverCa
    }
});
conn.connect(function(err) {
  if (err) throw err;
});

Langkah berikutnya