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

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

Önemli

MySQL için Azure Veritabanı tek sunucu kullanımdan kaldırma yolundadır. Esnek MySQL için Azure Veritabanı sunucuya yükseltmenizi kesinlikle öneririz. MySQL için Azure Veritabanı esnek sunucuya geçiş hakkında daha fazla bilgi için bkz. MySQL için Azure Veritabanı Tek Sunucu'ya neler oluyor?

MySQL için Azure Veritabanı, güvenli yuva katmanı (SSL) kullanarak MySQL için Azure Veritabanı sunucunuzu istemci uygulamalarına bağlamayı 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 https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem SSL üzerinden iletişim kurmak için gereken sertifikayı indirin ve sertifika dosyasını yerel sürücünüze kaydedin (bu öğreticide örneğin c:\ssl kullanılır). Microsoft Internet Explorer ve Microsoft Edge için: İndirme tamamlandıktan sonra sertifikayı BaltimoreCyberTrustRoot.crt.pem olarak yeniden adlandırın.

Bağımsız bulutlardaki sunucular için sertifikalar için aşağıdaki bağlantılara bakın: Azure Kamu, 21Vianet tarafından sağlanan Microsoft Azure ve Azure Almanya.

2. Adım: SSL bağlama

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

SSL üzerinden MySQL Workbench kullanarak sunucuya Bağlan

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

  1. Kurulum Yeni Bağlan ion iletişim kutusunda SSL sekmesine gidin.

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

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

    Save SSL configuration

Mevcut bağlantılar için, bağlantı simgesine sağ tıklayıp Düzenle'yi seçerek SSL'yi bağlayabilirsiniz. Ardından SSL sekmesine gidin ve sertifika dosyasını bağlayın.

SSL üzerinden MySQL CLI kullanarak sunucuya Bağlan

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\DigiCertGlobalRootG2.crt.pem

Dekont

Windows'ta MySQL komut satırı arabirimini kullanırken hata SSL connection error: Certificate signature check failedalabilirsiniz. Bu durumda, parametrelerini ile --ssldeğiştirin--ssl-mode=REQUIRED --ssl-ca={filepath}.

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

Azure portalını kullanma

Azure portalını kullanarak MySQL için Azure Veritabanı sunucunuzu ziyaret edin ve Bağlan ion güvenliği'ne tıklayın. SSL bağlantısını zorunlu kılma 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ı zorunlu kılma ayarının her zaman etkinleştirilmesini önerir.

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

Azure CLI’yı kullanma

Azure CLI'da sırasıyla Etkin veya Devre Dışı değerlerini kullanarak ssl zorlama parametresini etkinleştirebilir veya devre dışı bırakabilirsiniz.

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

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

MySQL sunucunuza SSL kullanarak bağlandığınızdan emin olmak için mysql status komutunu yürütebilirsiniz:

mysql> status

Çıkışı gözden geçirerek bağlantının şifrelendiğinden emin olmak için şunu göstermelisiniz: SSL: Şifreleme kullanımda AES256-SHA

Örnek kod

Uygulamanızdan 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ülerin listesine bakın.

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 (PDO kullanarak)

$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 (MySQL Bağlan veya 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 (Java için MySQL Bağlan or)

# 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ğlan or)

# 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 (MySql Bağlan or)

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

Sonraki adımlar