MySQL için Azure Veritabanı'na güvenli bir şekilde bağlanmak üzere uygulamanızda SSL bağlantısı yapılandırma

AŞAĞıDAKILER IÇIN GEÇERLIDIR: MySQL için Azure Veritabanı - Tek Sunucu

MySQL için Azure Veritabanı, MySQL için Azure Veritabanı (SSL) kullanarak istemci uygulamalarına Güvenli Yuva Katmanı destekler. Veritabanı sunucunuzla istemci uygulamalarınız arasında SSL bağlantılarının zorunlu tutulması, sunucuya uygulamanız arasındaki veri akışını şifreleyerek "bağlantıyı izinsiz izleme" saldırılarına karşı korumaya yardımcı olur.

1. Adım: SSL sertifikası alma

MySQL için Azure Veritabanı sunucunuzla SSL üzerinden iletişim kurmak için gereken sertifikayı indirin ve sertifika dosyasını yerel sürücünize kaydedin (bu öğreticide https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem örneğin c:\ssl kullanılır). Microsoft Internet Explorer ve Microsoft Edge: İndirme işlemi tamamlandıktan sonra sertifikayı BaltimoreCyberTrustRoot.crt.pem olarak yeniden adlandırin.

Bağımsız bulutlarda sunucuların sertifikaları için aşağıdaki bağlantılara bakın: Azure Kamu, Azure Çinve Azure Almanya.

2. Adım: SSL bağlama

Belirli programlama dili bağlantı dizeleri için lütfen aşağıdaki örnek koda bakın.

SSL üzerinden MySQL Workbench kullanarak sunucuya bağlanma

MySQL Workbench'i SSL üzerinden güvenli bir şekilde bağlanarak yapılandırın.

  1. Yeni Bağlantı Kur iletişim penceresinde SSL sekmesine gidin.

  2. SSL Kullan alanını "Gerekli" olarak güncelleştirin.

  3. SSL CA Dosyası: alanına BaltimoreCyberTrustRoot.crt.pem dosyasının konumunu girin.

    SSL yapılandırmasını kaydetme

Mevcut bağlantılar için bağlantı simgesine sağ tıklar ve düzenle'yi seçerek SSL'yi bebilirsiniz. Ardından SSL sekmesine gidin ve sertifika dosyasını bağlayın.

SSL üzerinden MySQL CLI kullanarak sunucuya bağlanma

SSL sertifikasını bağlamanın bir diğer yolu da aşağıdaki komutları yürüterek MySQL komut satırı arabirimini kullanmaktır.

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

Not

MySQL komut satırı arabirimini Windows hata SSL connection error: Certificate signature check failed alabilirsiniz. Bu durumda, parametreleri --ssl-mode=REQUIRED --ssl-ca={filepath} ile --ssl değiştirin.

3. Adım: Azure'da SSL bağlantılarını zorlama

Azure portalını kullanma

Sunucuyu Azure portal, sunucu sunucunuza MySQL için Azure Veritabanı ve ardından Bağlantı güvenliği'ne tıklayın. SSL bağlantısını zorla ayarını etkinleştirmek veya devre dışı bırakmak için iki durumlu düğmeyi kullanın ve kaydet'e tıklayın. Microsoft, gelişmiş güvenlik için SSL bağlantısını zorla ayarını her zaman etkinleştirmenizi tavsiye ediyor.

MySQL için Azure Veritabanı'Azure portal SSL bağlantılarını zorunlu hale MySQL için Azure Veritabanı

Azure CLI’yı kullanma

Azure CLI'de sırasıyla Etkin veya Devre Dışı değerlerini kullanarak ssl zorlama parametresini etkinleştirebilirsiniz veya devre dışı abilirsiniz.

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

4. Adım: SSL bağlantısını doğrulama

SSL kullanarak MySQL sunucunuza bağlı olduğunuzdan emin olmak için mysql status komutunu yürütün:

mysql> status

Çıkışı gözden geçirerek bağlantının şifrelenir olduğunu onaylayın; burada şu şekilde gösterebilirsiniz: SSL: Kullanımda şifreleme AES256-SHA'dır

Örnek kod

Uygulamanıza SSL üzerinden MySQL için Azure Veritabanı güvenli bir bağlantı kurmak için aşağıdaki kod örneklerine bakın:

MySQL için Azure Veritabanı hizmeti tarafından desteklenen uyumlu sürücüler listesine bakın.

PHP

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/BaltimoreCyberTrustRoot.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($conn)) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}

PHP (PDO kullanarak)

$options = array(
    PDO::MYSQL_ATTR_SSL_CA => '/var/www/html/BaltimoreCyberTrustRoot.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/BaltimoreCyberTrustRoot.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/BaltimoreCyberTrustRoot.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/BaltimoreCyberTrustRoot.crt.pem'}
        }
    }
}

Ruby

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

Golang

rootCertPool := x509.NewCertPool()
pem, _ := ioutil.ReadFile("/var/www/html/BaltimoreCyberTrustRoot.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 (Java için MySQL Bağlayıcısı)

# 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 (Java için MariaDB Bağlayıcısı)

# 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 = "BaltimoreCyberTrustRoot.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/BaltimoreCyberTrustRoot.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;
});

Sonraki adımlar