新しい TLS 証明書を使用して Aurora MySQL DB クラスターに接続するようにアプリケーションを更新する
202323 年 1 月 13 日に、Amazon RDS は、Transport Layer Security(TLS)を使用して Aurora DB クラスターに接続するための新しい認証局(CA)証明書を公開しました。ここでは、新しい証明書を使用するためのアプリケーションの更新について説明します。
このトピックでは、クライアントアプリケーションが DB クラスターへの接続に TLS を使用するかどうかを判断する方法を説明します。該当する場合はさらに、それらのアプリケーションの接続に証明書の検証が必要かどうかを確認できます。
注記
一部のアプリケーションは、サーバー上の証明書を正常に検証できる場合にのみ、Aurora MySQL DB クラスターに接続されるように設定されています。
そのようなアプリケーションの場合は、新しい CA 証明書を含むように、クライアントアプリケーションの信頼ストアを更新する必要があります。
クライアントアプリケーションの信頼ストアで CA 証明書を更新した後、DB クラスターで証明書をローテーションできます。これらの手順を開発環境またはステージング環境でテストしてから、本番環境で実装することを強くお勧めします。
証明書のローテーションの詳細については、「SSL/TLS 証明書のローテーション」を参照してください。証明書のダウンロードの詳細については、SSL/TLS を使用した DB クラスターへの接続の暗号化 を参照してください。Aurora MySQL DB クラスターで TLS を使用する方法については、「Aurora MySQL DB クラスターへの接続」を参照してください。
トピック
アプリケーションが TLS を使用して Aurora MySQL DB クラスターに接続しているかどうかの確認
Aurora MySQL バージョン 2(MySQL 5.7 と互換性あり)を使用しており、パフォーマンススキーマが有効になっている場合は、次のクエリを実行すると、接続で TLS が使用されているかどうかを確認できます。Performance Schemaを有効にする方法については、MySQL ドキュメントの「Performance Schemaクイックスタート
mysql> SELECT id, user, host, connection_type FROM performance_schema.threads pst INNER JOIN information_schema.processlist isp ON pst.processlist_id = isp.id;
この出力例では、webapp1
が TLS を使用しているため、ユーザー独自のセッション (admin
) と、ログインしているアプリケーションの両方を確認できます。
+----+-----------------+------------------+-----------------+ | id | user | host | connection_type | +----+-----------------+------------------+-----------------+ | 8 | admin | 10.0.4.249:42590 | SSL/TLS | | 4 | event_scheduler | localhost | NULL | | 10 | webapp1 | 159.28.1.1:42189 | SSL/TLS | +----+-----------------+------------------+-----------------+ 3 rows in set (0.00 sec)
クライアントが接続するために証明書の検証が必要かどうかの確認
JDBC クライアントおよび MySQL クライアントを接続するために証明書の検証が必要かどうかを確認できます。
JDBC
MySQL Connector/J 8.0 を使用した次の例では、アプリケーションの JDBC 接続プロパティをチェックして、正常な接続に有効な証明書が必要かどうかを確認する 1 つの方法を示します。MySQL のすべての JDBC 接続オプションの詳細については、MySQL ドキュメントの「設定プロパティ
MySQL Connector/J 8.0 を使用するとき、次の例のように、接続プロパティで sslMode
が VERIFY_CA
または VERIFY_IDENTITY
に設定されている場合、TLS 接続にはサーバー CA 証明書に対する検証が必要です。
Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD);
注記
MySQL Java Connector v5.1.38 以降または MySQL Java Connector v8.0.9 以降を使用してデータベースに接続する場合、データベースへの接続時に TLS を使用するようにアプリケーションを明示的に設定しなくても、これらのクライアントドライバーはデフォルトで TLS を使用します。また、TLS の使用時に部分的な証明書検証が実行され、データベースサーバー証明書の有効期限が切れている場合、接続に失敗します。
MySQL
MySQL クライアントの以下の例では、スクリプトの MySQL 接続をチェックして、正常な接続に有効な証明書が必要かどうかを確認する 2 つの方法を示します。MySQL クライアントで使用するすべての接続オプションの詳細については、MySQL ドキュメントの「 Client-Side Configuration for Encrypted Connections
MySQL 5.7 または MySQL 8.0 クライアントを使用しているとき、次の例のように、--ssl-mode
オプションに VERIFY_CA
または VERIFY_IDENTITY
を指定した場合、TLS 接続にはサーバー CA 証明書に対する検証が必要です。
mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/
ssl-cert.pem
--ssl-mode=VERIFY_CA
MySQL 5.6 クライアントを使用するとき、次の例のように、--ssl-verify-server-cert
オプションを指定する場合、SSL 接続にはサーバー CA 証明書に対する検証が必要です。
mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/
ssl-cert.pem
--ssl-verify-server-cert
アプリケーション信頼ストアの更新
MySQL アプリケーションの信頼ストアの更新については、MySQL ドキュメントの「Installing SSL Certificates
注記
信頼ストアを更新するとき、新しい証明書を追加できるだけでなく、古い証明書を保持できます。
JDBC のアプリケーション信頼ストアの更新
TLS 接続に JDBC を使用するアプリケーションの信頼ストアを更新できます。
ルート証明書のダウンロードについては、SSL/TLS を使用した DB クラスターへの接続の暗号化 を参照してください。
証明書をインポートするサンプルスクリプトについては、証明書を信頼ストアにインポートするためのサンプルスクリプト を参照してください。
アプリケーションで mysql JDBC ドライバーを使用している場合は、アプリケーションで以下のプロパティを設定します。
System.setProperty("javax.net.ssl.trustStore",
certs
); System.setProperty("javax.net.ssl.trustStorePassword", "password
");
注記
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。
アプリケーションを起動するとき、以下のプロパティを設定します。
java -Djavax.net.ssl.trustStore=
/path_to_truststore/MyTruststore.jks
-Djavax.net.ssl.trustStorePassword=my_truststore_password
com.companyName.MyApplication
TLS 接続を確立するための Java コードの例
次のコード例では、JDBC を使用してサーバー証明書を検証する SSL 接続のセットアップ方法を示します。
public class MySQLSSLTest { private static final String DB_USER = "
user name
"; private static final String DB_PASSWORD = "password
"; // This key store has only the prod root ca. private static final String KEY_STORE_FILE_PATH = "file-path-to-keystore
"; private static final String KEY_STORE_PASS = "keystore-password
"; public static void test(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); System.setProperty("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); System.setProperty("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); Properties properties = new Properties(); properties.setProperty("sslMode", "VERIFY_IDENTITY"); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD); Connection connection = DriverManager.getConnection("jdbc:mysql://jagdeeps-ssl-test.cni62e2e7kwh.us-east-1.rds.amazonaws.com:3306",properties); Statement stmt=connection.createStatement(); ResultSet rs=stmt.executeQuery("SELECT 1 from dual"); return; } }
重要
データベース接続で TLS を使用することを決定し、アプリケーションの信頼ストアを更新したら、rds-ca-rsa2048-g1 証明書を使用するようにデータベースを更新できます。ステップについては、「DB インスタンスの変更による CA 証明書の更新」のステップ 3 を参照してください。