転送中のデータのセキュリティを強化するために、Secure Sockets Layer (SSL) 暗号化を有効にし、アプリケーションサービスに CA 証明書をインストールできます。SSL は、トランスポート層でネットワーク接続を暗号化してデータのセキュリティと完全性を向上させますが、これにより接続レイテンシーが増加する場合があります。
背景情報
SSL は、元々 Netscape 社が Web ブラウザと Web サーバー間でデータを安全に伝送するチャネルを確立するために開発したセキュリティプロトコルです。RC4、MD5、RSA などの暗号化アルゴリズムを使用して通信を保護します。Internet Engineering Task Force (IETF) は SSL 3.0 を標準化し、トランスポート層セキュリティ (TLS) と改名しました。一般的には SSL という用語がより広く使われていますが、このドキュメントでは SSL 暗号化は TLS 暗号化を指します。
シナリオ
-
パブリックインターネット経由でのデータベースへのアクセス:クライアントがパブリックインターネット経由で PolarDB クラスターに接続する場合、データリンクは信頼できないネットワークにさらされます。中間者攻撃を防ぐには、暗号化が必要です。
-
セキュリティおよびコンプライアンス要件への対応:PCI-DSS や GDPR などの特定の業界またはデータ保護規制では、転送中の機密データに対して暗号化が義務付けられています。
-
異なるネットワーク環境間での通信:ハイブリッドクラウドやマルチ VPC アーキテクチャでは、ネットワーク境界を越えるデータフローの機密性と完全性を確保するために SSL 暗号化が必要です。
制限事項
-
単一エンドポイントの暗号化: 各クラスターは、一度に 1 つのエンドポイントに対してのみ SSL 暗号化をサポートします。クラスターにパブリックエンドポイントと内部エンドポイントの両方が設定されている場合は、ビジネスシナリオに基づいて暗号化するエンドポイントを 1 つ選択する必要があります。
-
暗号化するエンドポイントの選択に関する推奨事項:
-
パブリックインターネット経由でデータベースにアクセスする場合は、転送中のデータを保護するためにパブリックエンドポイントの SSL 暗号化を有効にすることを推奨します。
-
VPC 内からのみデータベースにアクセスし、セキュリティおよびコンプライアンス要件を満たす必要がある場合は、内部エンドポイントの SSL 暗号化を有効にすることを推奨します。
-
-
エンドポイントの長さの制限: SSL 暗号化が有効になっている PolarDB エンドポイントは、64 文字未満である必要があります。 エンドポイントの変更方法の詳細については、「PolarProxy の設定」をご参照ください。
注意事項
-
証明書の有効期間: SSL 証明書の有効期間は 1 年で、延長はできません。有効期限が切れる前に、有効期間を更新し、CA 証明書を再ダウンロードして設定する必要があります。そうしないと、暗号化されたクライアント接続は失敗します。証明書を手動で更新する手間を省くため、証明書の自動ローテーションを有効にすることを推奨します。
-
サービスの中断: SSL 暗号化の有効化または無効化、証明書の有効期間の更新、保護対象エンドポイントの変更、証明書の自動ローテーションの有効化などの操作を行うと、クラスターが再起動されます。これらの操作はオフピーク時間に行い、アプリケーションが自動的に再接続できることを確認することを推奨します。
操作手順
ステップ 1:SSL 暗号化の有効化
SSL 暗号化を有効にすると、クラスターが再起動します。この操作はオフピーク時間に実行することを推奨します。
-
PolarDB コンソールにログインします。左側メニューで、クラスター をクリックします。クラスターが所在する[リージョン] を選択し、クラスター ID をクリックします。
-
左側メニューで、 を選択します。
-
SSL の設定 タブで、SSL スイッチをオンにして SSL 暗号化を有効にします。
説明SSL は、プライマリエンドポイント、クラスターエンドポイント、カスタムエンドポイントに対して設定できます。
-
SSL の設定 ダイアログボックスで、暗号化するエンドポイントを選択し、OK をクリックします。
ステップ 2:証明書のダウンロード
SSL 暗号化を有効にすると、PolarDB クラスターの証明書をダウンロードして、クライアントがリモートで PolarDB クラスターに接続する際にデータベースの真正性を検証できます。
-
SSL の設定 タブで、対象のエンドポイントのセクションにある証明書のダウンロード をクリックします。
-
ダウンロードしたファイルは圧縮パッケージであり、以下の 3 つのファイルが含まれています。
-
.p7b ファイル:Windows で CA 証明書をインポートするために使用します。
-
.pem ファイル:他のシステムやアプリケーションで CA 証明書をインポートするために使用します。
-
.jks ファイル:Java アプリケーションに CA 証明書チェーンをインポートするための Java トラストストアファイルです。パスワードは
apsaradbです。説明Java で JKS 証明書ファイルを使用する場合、JDK 7 および JDK 8 のデフォルトのセキュリティ設定を変更する必要があります。PolarDB データベースに接続するサーバーで、
jre/lib/security/java.securityファイルを編集し、次の 2 つの設定を変更します。jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 224 jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024JDK のセキュリティ設定を変更しない場合、次のようなエラーが発生することがあります。このエラーや関連する他のエラーは、通常、Java のセキュリティ設定が正しくないことが原因で発生します。
javax.net.ssl.SSLHandshakeException: DHPublicKey does not comply to algorithm constraints
-
ステップ 3:クライアントからのPolarDBへの接続
SSL 暗号化を有効にすると、クライアントと PolarDB クラスター間の接続が暗号化されるかどうかは、クライアントのタイプと設定によって異なります。 たとえば、一部のクライアントはデフォルトで暗号化された接続を使用する場合があります。 クライアントの設定またはコードを変更して、暗号化された接続を確立し、PolarDB クラスターの ID を検証できます。
データ管理 (DMS) を使用して PolarDB クラスターにログインして管理する場合、接続を暗号化する必要はありません。
CLI
MySQL クライアントバージョン 5.7.11 以降では、接続コマンドで --ssl-mode オプションを使用して SSL 暗号化を設定できます。
-
--ssl-mode=DISABLED:接続は暗号化されません。 -
--ssl-mode=PREFERREDまたは--ssl-modeオプションを省略した場合:暗号化された接続を試行します。失敗した場合は、代わりに暗号化されていない接続を確立します。 -
--ssl-mode=REQUIRED:暗号化された接続を要求します。暗号化された接続を確立できない場合、接続は失敗します。 -
--ssl-mode=VERIFY_CA:暗号化された接続を要求し、サーバー証明書をローカルの CA 証明書と照合して検証します。 -
--ssl-mode=VERIFY_IDENTITY:暗号化された接続を要求し、サーバー証明書をローカルの CA 証明書と照合して検証し、さらにサーバーのホスト名または IP アドレスが接続に使用されたものと一致することを確認します。
例 1:暗号化された接続を試行し、失敗した場合は暗号化されていない接続にフォールバックします。
mysql -h {endpoint} -u {username} -p --ssl-mode=PREFERRED
例 2:暗号化された接続を要求し、サーバー証明書を検証します。
mysql -h {endpoint} -u {username} -p --ssl-mode=VERIFY_CA --ssl-ca={CA certificate path}/ApsaraDB-CA-Chain.pem
-
{endpoint}、{username}、{CA certificate path}を実際の値に置き換えてください。 -
--ssl-modeオプションの詳細については、「MySQL ドキュメント」をご参照ください。
MySQL Workbench
-
MySQL Workbench を開き、[Database > Manage Connections] を選択します。
-
PolarDB エンドポイント、ユーザー名、パスワードを入力します。
-
[SSL] タブで、[Use SSL] パラメーターを設定し、[SSL CA File] にダウンロードした PEM 形式の CA 証明書のパスを設定して、[Test Connection] または [OK] をクリックします。
説明[Use SSL] オプションの説明については、コマンドライン接続の --ssl-mode オプションの説明をご参照ください。
アプリケーションコード
Java
Connector/J (mysql-connector-java) は、MySQL の公式 JDBC ドライバーです。この例では、mysql-connector-java バージョン 8.0.19 を依存関係として使用します。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
以下のサンプルコードでは、sslMode プロパティを使用して SSL モードを指定しています。このプロパティは、mysql-connector-java バージョン 8.0.13 以降でサポートされています。それ以前のバージョンを使用している場合は、代わりに useSSL、requireSSL、verifyServerCertificate プロパティを使用する必要があります。詳細については、MySQL ドキュメントをご参照ください。
サンプルコード:
package com.example.ssltest;
import com.mysql.cj.jdbc.MysqlDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Main {
public static void main(String[] args) {
Connection conn = null;
MysqlDataSource mysqlDS=null;
try{
mysqlDS = new MysqlDataSource();
// 必要に応じて SslMode を設定します。オプションについては、コマンドライン接続の説明をご参照ください。
mysqlDS.setSslMode("VERIFY_IDENTITY");
// トラストストアにはCA証明書が含まれています。トラストストアのタイプをJKSに設定します。
mysqlDS.setTrustCertificateKeyStoreType("JKS");
// file:/ の後のパスを、ご自身の ApsaraDB-CA-Chain.jks ファイルのパスに置き換えてください。
mysqlDS.setTrustCertificateKeyStoreUrl("file://{CA certificate path}/ApsaraDB-CA-Chain.jks");
// ダウンロードした JKS ファイルのパスワードは apsaradb で、変更できません。
mysqlDS.setTrustCertificateKeyStorePassword("apsaradb");
// データベースのエンドポイント
mysqlDS.setServerName("your_polardb_host");
// データベースのポート
mysqlDS.setPort(3306);
// データベースのユーザー名
mysqlDS.setUser("your_username");
// データベースのパスワード
mysqlDS.setPassword("your_password");
// データベース名
mysqlDS.setDatabaseName("your_database");
System.out.println("Attempting to connect to the database...");
conn = mysqlDS.getConnection();
System.out.println("Database connection successful!");
// try-with-resources を使用して、Statement と ResultSet が自動的にクローズされるようにします。
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT VERSION()")) {
// クエリが結果を返したかどうかを確認します。
if (rs.next()) {
// 最初の列から結果を取得して出力します。
String dbVersion = rs.getString(1);
System.out.println("Database version: " + dbVersion);
} else {
System.out.println("Failed to retrieve database version information.");
}
}
}catch(Exception e){
e.printStackTrace();
} finally {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Python
# pymysql をインストールします
# pip install pymysql
import pymysql
# --- データベース情報を設定します ---
db_config = {
'host': 'your_polardb_host', # クラスターのエンドポイント
'user': 'your_username', # ユーザー名
'password': 'your_password', # パスワード
'database': 'your_database', # 接続したいデータベース
'port': 3306
}
# --- SSL情報を設定します ---
ssl_args = {
'ca': '{CA certificate path}/ApsaraDB-CA-Chain.pem'
}
try:
# 接続を確立し、sslパラメーターを渡します
print("Attempting to connect to MySQL with SSL...")
connection = pymysql.connect(**db_config, ssl=ssl_args)
print("SSL connection successful!")
with connection.cursor() as cursor:
# 簡単なクエリを実行して接続を検証します
cursor.execute("SELECT VERSION()")
version = cursor.fetchone()
print(f"Database version: {version[0]}")
except pymysql.MySQLError as e:
# SSL関連のエラーを出力すると、トラブルシューティングに役立ちます。
print(f"Connection failed: {e}")
finally:
if 'connection' in locals() and connection.open:
connection.close()
print("Database connection closed.")
Sysbench ベンチマーク
-
証明書をダウンロードし、パッケージを展開します。
-
Sysbench を設定します。
-
sysbenchコマンドに--mysql-ssl=onを追加します。 -
Sysbench 1.0.x を使用している場合、.pem ファイルを cacert.pem に名前変更し、
sysbenchコマンドを実行するディレクトリに配置してください。このバージョンの Sysbench は、SSL 証明書の名前を cacert.pem としてハードコーディングしています。 -
Sysbench 1.1.x を使用している場合、Sysbench 1.0.x と同様に SSL 証明書を設定できます。または、
--mysql-ssl-caパラメーターを使用して PEM ファイルへのパスを指定することもできます。
-
-
ベンチマークの方法については、「パフォーマンスのテスト方法 (OLTP)」をご参照ください。
説明ベンチマーク中は、MySQL クライアントのバージョンが、PolarDB クラスターの MySQL バージョンと一致していることを確認してください。
ステップ 4:暗号化接続の検証
SSL プロトコルには複数のバージョンがあります。PolarDB は現在、TLSv1.2 以降をサポートしています。SSL ハンドシェイク中に、クライアントと PolarDB サーバーは、TLS バージョン、暗号スイート、セッションキーなどの接続パラメーターをネゴシエートします。暗号スイートの詳細なリストについては、OpenSSL 公式 Web サイトをご参照ください。
-
SSL 用に設定されたクライアントを使用して、PolarDB クラスターに接続します。
-
次の SQL クエリを実行します。
SHOW STATUS LIKE 'ssl_cipher'; +---------------+---------------------------+ | Variable_name | Value | +---------------+---------------------------+ | Ssl_cipher | DHE-RSA-AES256-GCM-SHA384 | +---------------+---------------------------+ -
結果を分析します。
-
Value列が空でない値 (DHE-RSA-AES256-GCM-SHA384など) を返す場合、現在の接続は暗号化されています。 -
Value列が空の場合、現在の接続は暗号化されていません。クライアントの設定を確認してください。
-
メンテナンスと管理
保護対象エンドポイントの変更
SSL で保護するエンドポイントを変更するには、そのエンドポイントのセクションでSSL の設定 をクリックします。
保護対象のエンドポイントを変更すると、SSL 証明書が自動的に更新され、クラスターが再起動します。この操作はオフピーク時間に実行してください。
証明書の有効期間の更新
SSL エンドポイントを変更した場合や、証明書の有効期限が近づいている場合は、証明書の有効期間を手動で更新する必要があります。
証明書の有効期間を更新すると、クラスターが再起動します。このダウンタイムを考慮して計画を立ててください。
SSL 証明書の有効期間は延長できません。有効期間を更新した上で、証明書を再ダウンロードして設定することしかできません。証明書の有効期限が近づくたびに手動で更新する手間を省くため、証明書の自動ローテーションを有効にすることを推奨します。詳細については、「証明書の自動ローテーションの有効化」をご参照ください。
証明書の自動ローテーションの有効化
自動証明書ローテーションを有効にすると、PolarDB は、有効期限が切れる 10 日以内のクラスターのメンテナンスウィンドウ中に証明書を自動的に更新します。
証明書の自動更新はクラスターを再起動します。この操作はオフピーク時間に実行することを推奨します。
-
SSL の設定 タブで、詳細設定 をクリックします。
-
詳細設定 ダイアログボックスで、証明書の自動ローテーションを有効にし、確定 をクリックします。
SSL 暗号化の無効化
SSL 暗号化を無効にすると、クラスターが再起動します。この操作はオフピーク時間に実行することを推奨します。
-
SSL の設定 タबで、SSL スイッチをオフにして SSL 暗号化を無効にします。
-
表示されるダイアログボックスで、OK をクリックします。
関連 API
|
API |
説明 |
|
PolarDB クラスターの SSL 設定を照会します。 |
|
|
PolarDB クラスターの SSL 暗号化を有効化または無効化するか、CA 証明書を更新します。 |