Azure Database for MySQL に安全に接続するためにアプリケーションで SSL 接続を構成するConfigure SSL connectivity in your application to securely connect to Azure Database for MySQL

Azure Database for MySQL は、Secure Sockets Layer (SSL) を使用した、クライアント アプリケーションへの Azure Database for MySQL サーバーへの接続をサポートします。Azure Database for MySQL supports connecting your Azure Database for MySQL server to client applications using Secure Sockets Layer (SSL). データベース サーバーとクライアント アプリケーション間に SSL 接続を適用すると、サーバーとアプリケーション間のデータ ストリームが暗号化されて、"man in the middle" 攻撃から保護されます。Enforcing SSL connections between your database server and your client applications helps protect against "man in the middle" attacks by encrypting the data stream between the server and your application.

手順 1: SSL 証明書を取得するStep 1: Obtain SSL certificate

Azure Database for MySQL サーバーで SSL 経由で通信するために必要な証明書を https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem からダウンロードし、その証明書ファイルをローカル ドライブ (このチュートリアルでは c:\ssl を使用) に保存します。Download the certificate needed to communicate over SSL with your Azure Database for MySQL server from https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem and save the certificate file to your local drive (with this tutorial, we used c:\ssl). Microsoft Internet Explorer と Microsoft Edge の場合: ダウンロードが完了したら、証明書の名前を BaltimoreCyberTrustRoot.crt.pem に変更します。For Microsoft Internet Explorer and Microsoft Edge: After the download has completed, rename the certificate to BaltimoreCyberTrustRoot.crt.pem.

手順 2: SSL をバインドするStep 2: Bind SSL

MySQL Workbench による SSL 経由でのサーバーへの接続Connecting to server using the MySQL Workbench over SSL

SSL 経由で安全に接続するように MySQL Workbench を構成します。Configure the MySQL Workbench to connect securely over SSL. [Setup New Connection](新しい接続のセットアップ) ダイアログから、[SSL] タブに移動します。[SSL CA File:](SSL CA ファイル:) フィールドに BaltimoreCyberTrustRoot.crt.pem ファイルの場所を入力します。From the Setup New Connection dialogue, navigate to the SSL tab. In the SSL CA File: field, enter the file location of the BaltimoreCyberTrustRoot.crt.pem. カスタマイズされたタイル保存 既存の接続に SSL をバインドするには、接続アイコンを右クリックして編集を選択します。save customized tile For existing connections, you can bind SSL by right clicking on the connection icon and choose edit. 次に [SSL] タブに移動して証明書ファイルをバインドします。Then navigate to the SSL tab and bind the cert file.

MySQL CLI による SSL 経由でのサーバーへの接続Connecting to server using the MySQL CLI over SSL

SSL 証明書をバインドする別の方法として、次のコマンドを実行して MySQL コマンド ライン インターフェイスを使用します。Another way to bind the SSL certificate is using the MySQL command-line interface by execute the following command:

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

手順 3: Azure で SSL 接続を適用するStep 3: Enforcing SSL connections in Azure

Azure ポータルの使用Using the Azure portal

Azure Portal から Azure Database for MySQL サーバーにアクセスし、[接続のセキュリティ] をクリックします。Using the Azure portal, visit your Azure Database for MySQL server, and then click Connection security. トグル ボタンを使用して、[SSL 接続を強制する] 設定を有効または無効にし、[保存] をクリックします。Use the toggle button to enable or disable the Enforce SSL connection setting, and then click Save. Microsoft では、セキュリティ強化のため [SSL 接続を強制する] 設定を常に有効にしておくことをお勧めします。Microsoft recommends to always enable the Enforce SSL connection setting for enhanced security. SSL の有効化enable-ssl

Azure CLI の使用Using Azure CLI

ssl-enforcement パラメーターを有効または無効にするには、Azure CLI でそれぞれ Enabled または Disabled の値を使用します。You can enable or disable the ssl-enforcement parameter by using Enabled or Disabled values respectively in Azure CLI.

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

手順 4: SSL 接続を確認するStep 4: Verify the SSL connection

MySQL の status コマンドを実行して、SSL 経由で MySQL サーバーに接続していることを確認します。Execute the mysql status command to verify that you have connected to your MySQL server using SSL:

mysql> status

接続が暗号化されていることを確認します。そのためには、出力に "SSL: Cipher in use is AES256-SHA" (SSL: 使用中の暗号は AES256-SHA) と表示されていることを確認します。Confirm the connection is encrypted by reviewing the output, which should show: SSL: Cipher in use is AES256-SHA

サンプル コードSample code

アプリケーションから Azure Database for MySQL へのセキュリティで保護された接続を SSL 経由で確立するためには、次のコード サンプルを参照してください。To establish a secure connection to Azure Database for MySQL over SSL from your application, please refer to the following code samples.

PHPPHP

$conn = mysqli_init();
mysqli_ssl_set($conn,NULL,NULL, "/var/www/html/BaltimoreCyberTrustRoot.crt.pem", NULL, NULL) ; 
mysqli_real_connect($conn, 'myserver4demo.mysql.database.azure.com', 'myadmin@myserver4demo', '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 (MySQLConnector Python)Python (MySQLConnector Python)

try:
    conn=mysql.connector.connect(user='myadmin@myserver4demo', 
        password='yourpassword', 
        database='quickstartdb', 
        host='myserver4demo.mysql.database.azure.com', 
        ssl_ca='/var/www/html/BaltimoreCyberTrustRoot.crt.pem')
except mysql.connector.Error as err:
    print(err)

Python (PyMySQL)Python (PyMySQL)

conn = pymysql.connect(user = 'myadmin@myserver4demo', 
        password = 'yourpassword', 
        database = 'quickstartdb', 
        host = 'myserver4demo.mysql.database.azure.com', 
        ssl = {'ssl': {'ca': '/var/www/html/BaltimoreCyberTrustRoot.crt.pem'}})

RubyRuby

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

GolangGolang

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, InsecureSkipVerify: true})
var connectionString string
connectionString = fmt.Sprintf("%s:%s@tcp(%s:3306)/%s?allowNativePasswords=true&tls=custom",'myadmin@myserver4demo' , 'yourpassword', 'myserver4demo.mysql.database.azure.com', 'quickstartdb') 
db, _ := sql.Open("mysql", connectionString)

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

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

次のステップNext steps

Azure Database for MySQL の接続ライブラリに従って、さまざまなアプリケーション接続オプションを確認するReview various application connectivity options following Connection libraries for Azure Database for MySQL