Konfigurowanie łączności SSL w aplikacji w celu bezpiecznego nawiązywania połączeń z usługą Azure Database for MySQL

DOTYCZY: Azure Database for MySQL — pojedynczy serwer

Ważne

Pojedynczy serwer usługi Azure Database for MySQL znajduje się na ścieżce wycofania. Zdecydowanie zalecamy uaktualnienie do serwera elastycznego usługi Azure Database for MySQL. Aby uzyskać więcej informacji na temat migracji do serwera elastycznego usługi Azure Database for MySQL, zobacz Co się dzieje z usługą Azure Database for MySQL — pojedynczy serwer?

Usługa Azure Database for MySQL obsługuje łączenie serwera usługi Azure Database for MySQL z aplikacjami klienckimi przy użyciu protokołu SSL (Secure Sockets Layer). Wymuszanie połączeń SSL między serwerem bazy danych a aplikacją kliencką ułatwia ochronę przed atakami typu man-in-the-middle dzięki szyfrowaniu strumienia danych między serwerem a aplikacją.

Krok 1. Uzyskiwanie certyfikatu SSL

Pobierz certyfikat wymagany do komunikacji za pośrednictwem protokołu SSL z serwerem https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem usługi Azure Database for MySQL i zapisz plik certyfikatu na dysku lokalnym (na przykład w tym samouczku jest używany plik c:\ssl). W przypadku programów Microsoft Internet Explorer i Microsoft Edge: po zakończeniu pobierania zmień nazwę certyfikatu na BaltimoreCyberTrustRoot.crt.pem.

Zobacz następujące linki do certyfikatów dla serwerów w suwerennych chmurach: Azure Government, Microsoft Azure obsługiwane przez firmę 21Vianet i Azure (Niemcy).

Krok 2. Powiązanie protokołu SSL

W przypadku określonych parametry połączenia języka programowania zapoznaj się z poniższym przykładowym kodem.

Połączenie na serwerze przy użyciu programu MySQL Workbench za pośrednictwem protokołu SSL

Skonfiguruj program MySQL Workbench, aby bezpiecznie nawiązać połączenie za pośrednictwem protokołu SSL.

  1. W oknie dialogowym Setup New Połączenie ion (Konfigurowanie nowego Połączenie ionu) przejdź do karty SSL.

  2. Zaktualizuj pole Użyj protokołu SSL do opcji "Wymagaj".

  3. W polu Plik urzędu certyfikacji SSL wprowadź lokalizację pliku DigiCertGlobalRootG2.crt.pem.

    Save SSL configuration

W przypadku istniejących połączeń możesz powiązać protokół SSL, klikając prawym przyciskiem myszy ikonę połączenia i wybierając pozycję Edytuj. Następnie przejdź do karty SSL i powiąż plik certyfikatu.

Połączenie do serwera przy użyciu interfejsu wiersza polecenia MySQL za pośrednictwem protokołu SSL

Innym sposobem powiązania certyfikatu SSL jest użycie interfejsu wiersza polecenia MySQL, wykonując następujące polecenia.

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

Uwaga

W przypadku korzystania z interfejsu wiersza polecenia MySQL w systemie Windows może zostać wyświetlony błąd SSL connection error: Certificate signature check failed. W takim przypadku zastąp --ssl-mode=REQUIRED --ssl-ca={filepath} parametry parametrami --ssl.

Krok 3. Wymuszanie połączeń SSL na platformie Azure

Korzystanie z witryny Azure Portal

Korzystając z witryny Azure Portal, odwiedź serwer usługi Azure Database for MySQL, a następnie kliknij pozycję zabezpieczenia Połączenie ion. Użyj przycisku przełącznika, aby włączyć lub wyłączyć ustawienie Wymuszaj połączenie SSL, a następnie kliknij przycisk Zapisz. Firma Microsoft zaleca zawsze włączenie ustawienia Wymuszaj połączenie SSL w celu zapewnienia zwiększonych zabezpieczeń.

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

Korzystanie z interfejsu wiersza polecenia platformy Azure

Możesz włączyć lub wyłączyć parametr ssl-enforcement , używając odpowiednio wartości Włączone lub Wyłączone w interfejsie wiersza polecenia platformy Azure.

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

Krok 4. Weryfikowanie połączenia SSL

Wykonaj polecenie stanu mysql, aby sprawdzić, czy nawiązano połączenie z serwerem MySQL przy użyciu protokołu SSL:

mysql> status

Upewnij się, że połączenie jest szyfrowane, przeglądając dane wyjściowe, które powinny zawierać następujące informacje: SSL: szyfrowanie w użyciu to AES256-SHA

Przykładowy kod

Aby nawiązać bezpieczne połączenie z usługą Azure Database for MySQL za pośrednictwem protokołu SSL z aplikacji, zapoznaj się z następującymi przykładami kodu:

Zapoznaj się z listą zgodnych sterowników obsługiwanych przez usługę 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 (korzystanie z 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 (MySQL Połączenie or 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 Połączenie or dla języka 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 Połączenie or dla języka 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 (MySql Połączenie 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;
});

Następne kroki