Şifrelenmiş bağlantılarla MySQL için Azure Veritabanı - Esnek Sunucuya bağlanma

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

MySQL için Azure Veritabanı esnek sunucu, Aktarım katmanı güvenliği (TLS) şifrelemesi ile Güvenli Yuva Katmanı (SSL) kullanarak istemci uygulamalarınızı MySQL için Azure Veritabanı esnek sunucu örneğine bağlamayı destekler. TLS, veritabanı sunucunuz ve istemci uygulamalarınız arasında şifrelenmiş ağ bağlantıları sağlayarak, uyumluluk gereksinimlerine uymanızı sağlayan endüstri standardı bir protokoldür.

MySQL için Azure Veritabanı esnek sunucu varsayılan olarak Aktarım Katmanı Güvenliği (TLS 1.2) kullanan şifreli bağlantıları destekler ve TLS 1.0 ve TLS 1.1 ile gelen tüm bağlantılar varsayılan olarak reddedilir. Esnek sunucunuzdaki şifreli bağlantı zorlama veya TLS sürüm yapılandırması, bu makalede açıklandığı gibi değiştirilebilir.

MySQL için Azure Veritabanı esnek sunucu örneğiniz için sahip olabileceğiniz farklı SSL ve TLS ayarları yapılandırmaları aşağıdadır:

Senaryo Sunucu parametresi ayarları Açıklama
SSL zorlamayı devre dışı bırakma require_secure_transport = KAPALI Eski uygulamanız MySQL için Azure Veritabanı esnek sunucuya şifreli bağlantıları desteklemiyorsa, require_secure_transport=KAPALI ayarını yaparak MySQL için Azure Veritabanı esnek sunucu örneğiniz için şifrelenmiş bağlantıların zorunlu olmasını devre dışı bırakabilirsiniz.
TLS sürüm < 1.2 ile SSL'i zorunlu kılma require_secure_transport = ON ve tls_version = TLS 1.0 veya TLS 1.1 Eski uygulamanız şifreli bağlantıları destekliyorsa ancak TLS sürüm < 1.2 gerektiriyorsa, şifrelenmiş bağlantıları etkinleştirebilir, ancak MySQL için Azure Veritabanı esnek sunucu örneğinizi uygulamanız tarafından desteklenen TLS sürümü (1.0 veya 1.1) ile bağlantılara izin verecek şekilde yapılandırabilirsiniz. Yalnızca MySQL için Azure Veritabanı esnek sunucu sürümü v5.7 ile desteklenir
TLS sürümü = 1.2 (Varsayılan yapılandırma) ile SSL'i zorunlu kılma require_secure_transport = ON ve tls_version = TLS 1.2 Bu, esnek MySQL için Azure Veritabanı sunucu için önerilen ve varsayılan yapılandırmadır.
TLS sürüm = 1.3 ile SSL'i zorunlu kılma require_secure_transport = ON ve tls_version = TLS 1.3 Bu, yeni uygulama geliştirme için kullanışlıdır ve önerilir. Yalnızca MySQL için Azure Veritabanı esnek sunucu sürümü v8.0 ile desteklenir

Not

  • Esnek MySQL için Azure Veritabanı sunucuda SSL Şifrelemesi değişiklikleri desteklenmez. FIPS şifreleme paketleri, tls_version TLS sürüm 1.2 olarak ayarlandığında varsayılan olarak zorlanır. 1.2 sürümü dışındaki TLS sürümleri için SSL Şifrelemesi, MySQL topluluk yüklemesi ile birlikte gelen varsayılan ayarlara ayarlanır.
  • MySQL 8.0.26 ve 5.7.35 sürümleri, TLS 1.0 ve TLS 1.1 protokollerinin yayımlanmasıyla başlayan MySQL açık kaynak topluluk sürümleri kullanım dışı bırakılmıştır. Hareket halindeki verileri şifrelemek için sırasıyla 1996 ve 2006'da yayınlanan bu protokoller zayıf, güncel olmayan ve güvenlik tehditlerine karşı savunmasız olarak kabul edilir. Daha fazla bilgi için bkz . TLS 1.0 ve TLS 1.1 Protokolleri için Desteği Kaldırma. MySQL için Azure Veritabanı esnek sunucu, topluluk modern güvenlik standartlarıyla uyumlu hale getirmek için protokol desteğini durdurduğunda TLS sürümlerini desteklemeyi de durdurur.

Bu makalede şunları öğreneceksiniz:

  • MySQL için Azure Veritabanı esnek sunucu örneğinizi yapılandırma
    • SSL devre dışı bırakıldı
    • TLS sürümüyle zorunlu SSL ile
  • mysql komut satırını kullanarak MySQL için Azure Veritabanı esnek sunucu örneğinize Bağlan
    • Şifrelenmiş bağlantılar devre dışı bırakılmıştır
    • Şifrelenmiş bağlantılar etkinken
  • Bağlantınızın şifreleme durumunu doğrulama
  • Çeşitli uygulama çerçevelerini kullanarak şifrelenmiş bağlantılarla MySQL için Azure Veritabanı esnek sunucu örneğine Bağlan

MySQL için Azure Veritabanı esnek sunucu örneğinizde SSL zorlamayı devre dışı bırakma

İstemci uygulamanız şifrelenmiş bağlantıları desteklemiyorsa, MySQL için Azure Veritabanı esnek sunucu örneğinizde şifrelenmiş bağlantı zorlamasını devre dışı bırakmanız gerekir. Şifrelenmiş bağlantı zorlamasını devre dışı bırakmak için, ekran görüntüsünde gösterildiği gibi require_secure_transport sunucu parametresini KAPALI olarak ayarlamanız ve etkili olması için sunucu parametresi yapılandırmasını kaydetmeniz gerekir. require_secure_transport, hemen etkin olan ve sunucunun yeniden başlatılmasını gerektirmeyen dinamik bir sunucu parametresidir .

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

SSL devre dışı bırakılmış mysql komut satırı istemcilerini kullanarak Bağlan

Aşağıdaki örnekte, mysql komut satırı arabirimini kullanarak sunucunuza nasıl bağlandığınız gösterilmektedir. --ssl-mode=DISABLED mysql istemcisinden TLS/SSL bağlantısını devre dışı bırakmak için bağlantı dizesi ayarını kullanın. Değerleri gerçek sunucu adınız ve parolanızla değiştirin.

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

Önemli

require_secure_transport KAPALI olarak ayarlanması, sunucu tarafında şifrelenmiş bağlantıların desteklenmediği anlamına gelmez. MySQL için Azure Veritabanı esnek sunucu örneğinde require_secure_transport KAPALI olarak ayarlarsanız, ancak istemci şifreli bağlantıyla bağlanırsa, yine de kabul edilir. require_secure_transport=KAPALI ile yapılandırılan MySQL için Azure Veritabanı esnek sunucu örneğine mysql istemcisini kullanan aşağıdaki bağlantı da aşağıda gösterildiği gibi çalışır.

 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)

Özetle, require_secure_transport=KAPALI ayarı, esnek MySQL için Azure Veritabanı sunucuda şifrelenmiş bağlantıların uygulanmasını rahatlatır ve şifrelenmiş bağlantılara ek olarak istemciden sunucuya şifrelenmemiş bağlantılara izin verir.

TLS sürümüyle SSL'i zorunlu kılma

MySQL için Azure Veritabanı esnek sunucu örneğinizde TLS sürümlerini ayarlamak için *tls_version- sunucu parametresini ayarlamanız gerekir. TLS protokolü için varsayılan ayar TLS 1.2'dir. Uygulamanız SSL ile MySQL sunucusu bağlantılarını destekliyorsa ancak TLS 1.2 dışında bir protokol gerektiriyorsa, sunucu parametresinde TLS sürümlerini ayarlamanız gerekir. *tls_version- parametresinin etkili olması için sunucunun yeniden başlatılmasını gerektiren statik bir sunucu parametresidir. Esnek MySQL için Azure Veritabanı sunucusunun kullanılabilir sürümleri için desteklenen protokoller aşağıdadır.

esnek sunucu sürümünü MySQL için Azure Veritabanı Desteklenen tls_version Değerleri Varsayılan Ayar
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

TLS/SSL ile mysql komut satırı istemci kullanarak Bağlan

Genel SSL sertifikasını indirme

İstemci uygulamalarınızla şifrelenmiş bağlantıları kullanmak için, aşağıdaki ekran görüntüsünde gösterildiği gibi Azure portalı Ağ bölmesinde de kullanılabilen genel SSL sertifikasını indirmeniz gerekir.

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

Not

Azure Kamu buluttaki sunucularınız için bu SSL sertifikasını indirmeniz gerekir.

Sertifika dosyasını tercih ettiğiniz konuma kaydedin. Örneğin, bu öğreticide yerel ortamınızda veya \var\www\html\bin uygulamanızın barındırıldığı istemci ortamında veya c:\ssl kullanılır. Bu, uygulamaların SSL üzerinden veritabanına güvenli bir şekilde bağlanmasına olanak tanır.

Özel erişim (VNet Tümleştirmesi) ile MySQL için Azure Veritabanı esnek sunucu örneğinizi oluşturduysanız, sunucunuzla aynı sanal ağ içindeki bir kaynaktan sunucunuza bağlanmanız gerekir. Bir sanal makine oluşturabilir ve bunu MySQL için Azure Veritabanı esnek sunucu örneğiniz ile oluşturulan sanal ağa ekleyebilirsiniz.

Genel erişim (izin verilen IP adresleri) ile MySQL için Azure Veritabanı esnek sunucu örneğinizi oluşturduysanız, yerel IP adresinizi sunucunuzdaki güvenlik duvarı kuralları listesine ekleyebilirsiniz.

Yerel ortamınızdan sunucuya bağlanmak için mysql.exe veya MySQL Workbench'i> seçebilirsiniz.

Aşağıdaki örnekte, mysql komut satırı arabirimini kullanarak sunucunuza nasıl bağlandığınız gösterilmektedir. TLS/SSL sertifika doğrulamasını --ssl-mode=REQUIRED zorunlu kılmak için bağlantı dizesi ayarını kullanın. Yerel sertifika dosya yolunu parametresine --ssl-ca geçirin. Değerleri gerçek sunucu adınız ve parolanızla değiştirin.

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

Not

--ssl-ca hedefine geçirilen değerin, kaydettiğiniz sertifikanın dosya yolu ile eşleştiğini onaylayın. SSL ile MySQL için Azure Veritabanı- Esnek'e bağlanıyorsanız ve sertifika konu adıyla tam doğrulama (sslmode=VERTIFY_IDENTITY) gerçekleştirme seçeneği kullanıyorsanız, bağlantı dizesi servername.mysql.database.azure.com> kullanın<.

Sunucunuza şifrelenmemiş bağlantılarla bağlanmaya çalışırsanız, güvenli olmayan aktarım kullanan bağlantıların aşağıdakine benzer şekilde yasak olduğunu belirten bir hata görürsünüz:

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

TLS/SSL bağlantısını doğrulama

MYSQL sunucunuza TLS/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 olun. Bu, şunu göstermelidir: SSL: Şifreleme kullanımda. Bu şifreleme paketi bir örnek gösterir ve istemciyi temel alarak farklı bir şifreleme paketi görebilirsiniz.

Sunucunuzda yapılandırılan TLS protokollerini tanımlama

'tls_version' GIBI GENEL DEĞIŞKENLERI GÖSTER komutunu çalıştırabilirsiniz; ve tüm protokollerin hangi protokollerin yapılandırıldığını anlamak için değerini denetleyin.

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';

İstemcilerim tarafından sunucuya bağlanmak için hangi TLS protokollerinin kullanıldığını nasıl bulabilirim?

Bağlanmak için hangi TLS sürümünün kullanıldığını belirlemek için aşağıdaki komutu çalıştırabilir ve oturumun tls_version bakabilirsiniz.

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;

Çeşitli uygulama çerçevelerini kullanarak şifrelenmiş bağlantılarla MySQL için Azure Veritabanı esnek sunucu örneğine Bağlan

Azure portalında sunucunuz için kullanılabilen "Bağlan Ion Dizeleri" sayfasında önceden tanımlanmış Bağlan ion dizeleri, TLS/SSL kullanarak veritabanı sunucunuza bağlanmak için ortak diller için gerekli parametreleri içerir. TLS/SSL parametresi bağlayıcıya göre değişir. Örneğin, "useSSL=true", "sslmode=required" veya "ssl_verify_cert=true" ve diğer çeşitlemeler.

Uygulamanızdan TLS/SSL üzerinden MySQL için Azure Veritabanı esnek sunucu örneğine şifreli bir bağlantı kurmak için aşağıdaki kod örneklerine bakın:

WordPress

SSL ortak sertifikasını indirin ve satırın arkasına // **MySQL settings - You can get this info from your web host** //aşağıdaki satırları wp-config.php ekleyin.

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

$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 (MySQL Bağlan veya 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 (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');
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');
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",
    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;
});

Sonraki adımlar