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

Ważne

Usługa Azure Database for MariaDB znajduje się na ścieżce wycofania. Zdecydowanie zalecamy przeprowadzenie migracji do usługi Azure Database for MySQL. Aby uzyskać więcej informacji na temat migracji do usługi Azure Database for MySQL, zobacz Co się dzieje z usługą Azure Database for MariaDB?.

Usługa Azure Database for MariaDB obsługuje łączenie serwera usługi Azure Database for MariaDB 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ą.

Uzyskiwanie certyfikatu SSL

Pobierz certyfikat wymagany do komunikacji za pośrednictwem protokołu SSL z serwerem https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem usługi Azure Database for MariaDB 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).

Wiązanie protokołu SSL

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 BaltimoreCyberTrustRoot.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.mariadb.database.azure.com -u Username@mydemoserver -p --ssl-mode=REQUIRED --ssl-ca=c:\ssl\BaltimoreCyberTrustRoot.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.

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 MariaDB, a następnie wybierz pozycję zabezpieczenia Połączenie ion. Użyj przycisku przełącznika, aby włączyć lub wyłączyć ustawienie Wymuszaj połączenie SSL, a następnie wybierz pozycję Zapisz. Firma Microsoft zaleca zawsze włączenie ustawienia Wymuszaj połączenie SSL w celu zapewnienia zwiększonych zabezpieczeń. enable-ssl for MariaDB server

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 mariadb server update --resource-group myresource --name mydemoserver --ssl-enforcement Enabled

Weryfikowanie połączenia SSL

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

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 MariaDB za pośrednictwem protokołu SSL z aplikacji, zapoznaj się z następującymi przykładami kodu:

PHP

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/BaltimoreCyberTrustRoot.crt.pem", NULL, NULL) ;
mysqli_real_connect($conn, 'mydemoserver.mariadb.database.azure.com', 'myadmin@mydemoserver', 'yourpassword', 'quickstartdb', 3306, MYSQLI_CLIENT_SSL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);
if (mysqli_connect_errno($conn)) {
die('Failed to connect to MySQL: '.mysqli_connect_error());
}

Python (MySQL Połączenie or Python)

try:
    conn = mysql.connector.connect(user='myadmin@mydemoserver',
                                   password='yourpassword',
                                   database='quickstartdb',
                                   host='mydemoserver.mariadb.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.mariadb.database.azure.com',
                       ssl={'ca': '/var/www/html/BaltimoreCyberTrustRoot.crt.pem'})

Ruby

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

Ruby on Rails

default: &default
  adapter: mysql2
  username: username@mydemoserver
  password: yourpassword
  host: mydemoserver.mariadb.database.azure.com
  sslca: BaltimoreCyberTrustRoot.crt.pem
  sslverify: true

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.mariadb.database.azure.com', 'quickstartdb')
db, _ := sql.Open("mysql", connectionString)

Java (JDBC)

# 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.mariadb.database.azure.com', 'quickstartdb');
properties.setProperty("user", 'myadmin@mydemoserver');
properties.setProperty("password", 'yourpassword');
conn = DriverManager.getConnection(url, properties);

Java (MariaDB)

# 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.mariadb.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,
    CACertificateFile = "BaltimoreCyberTrustRoot.crt.pem",
};
using (var connection = new MySqlConnection(builder.ConnectionString))
{
    connection.Open();
}

Następne kroki

Aby dowiedzieć się więcej o wygaśnięciu i rotacji certyfikatów, zapoznaj się z dokumentacją rotacji certyfikatów