データベースクライアントのSSL/TLS証明書の利用を確認する方法 【Amazon RDSの証明書「rds-ca-2019」の期限切れに伴う証明書更新対応】

2024年8月22日にAmazon RDSのCA証明書(rds-ca-2019)が期限切れとなり、新しい証明書(rds-ca-rsa2048-g1)への更新対応が必要となります。

利用しているAWSアカウント内に、有効期限が切れる証明書を使用しているAmazon RDSやAmazon Auroraデータベースが存在する場合、以下メール内容にて通知が届いているとのことです。

本記事では、Amazon RDSのCA証明書更新対応におけるデータベース(以下、DB)クライアント側での対応内容のうち、DBクライアントからSSL/TLS証明書を使用した暗号化接続を行っているかどうかの確認方法について記載します。

概要

2024年8月22日にAmazon RDSのCA証明書(rds-ca-2019)が期限切れとなり、新しい証明書(rds-ca-rsa2048-g1)への更新対応が必要となります。

それに伴い、DBクライアントやアプリケーションからの接続の際にSSL/TLS接続による暗号化を実施している、かつ接続時にCA証明書の検証が必要な場合は、DBクライアント側のCA証明書も更新対応が必要となります。

よって、更新対応を実施する前に現状DBクライアントからの接続方法を確認し、条件が当てはまる場合は更新対応を実施する形となります。

いずれにしても、RDSのCA証明書更新対応は期限までに必要となります。未対応の方は、以下記事にて対応方法を記載しているのでご参照ください!
blog.jbs.co.jp

※ DBクライアントからRDSへの接続において、SSL/TLS接続による暗号化を実施していない場合や、接続時にCA証明書の検証を実施していない場合はDBクライアント側での対応は不要となります。

DBクライアントからDBインスタンスへの接続方法の確認

RDSのSSL/TLS証明書更新に伴うDBクライアント側の更新対応が必要かどうか、確認する手順について記載します。

DBクライアントからRDSへSSL/TLS通信を行っている、かつ接続の際にCA証明書の検証が必要な場合は、新しいCA証明書のインストールや、接続文字列内で指定するCA証明書の更新等の対応が必要となります。

更新対応の事前確認として、接続するDBインスタンスのエンジンごとに以下確認をしてください。

MariaDBインスタンスの場合

DBインスタンスへのSSL/TLS通信の使用確認

DBクライアントからDBインスタンスへの接続の際にSSL/TLS通信を使用しているかどうかについて、以下クエリを実行して確認します。

確認内容 コマンド
MariaDB インスタンス側がSSL/TLSを有効化しているか MariaDB [(none)]> SHOW VARIABLES LIKE 'have_ssl';
接続時にSSL/TLSを使用しているか MariaDB [(none)]> SHOW SESSION STATUS LIKE 'Ssl_cipher';

以下出力例となります。

現在の通信に対して、have_SSLの値が[YES]と表示される場合、Maria DBインスタンスにてSSL/TLSが有効化されているということになります。

 MariaDB [(none)]> SHOW VARIABLES LIKE 'have_ssl';
 +---------------+-------+
 | Variable_name | Value |
 +---------------+-------+
 | have_ssl | YES |
 +---------------+-------+
 1 row in set (0.001 sec)

Ssl_cipherの値が空でない場合、接続においてはSSL/TLSを使用しているということになります。

 MariaDB [(none)]> SHOW SESSION STATUS LIKE 'Ssl_cipher';
 +---------------+-----------------------------+
 | Variable_name | Value |
 +---------------+-----------------------------+
 | Ssl_cipher | ECDHE-RSA-AES256-GCM-SHA384 |
 +---------------+-----------------------------+
 1 row in set (0.001 sec)

CA証明書の検証要否の確認

Maria DBインスタンスへ接続する際に、CA証明書の検証が必要かについての確認方法を記載します。

JDBCクライアントを使用する場合と、MySQLクライアントを使用する場合とで接続文字列が異なるのでそれぞれ記載します。

【JDBCクライアントを使用して接続している場合】

以下の接続文字列の例のように、「sslmode」の値を[VERIFY_CA]または[VERIFY_IDENTITY]と設定している場合、SSL/TLS接続にはCA証明書の検証が必要となります。

 Properties properties = new Properties();
 properties.setProperty("sslMode"、 "VERIFY_IDENTITY");
 properties.put("user"、 DB_USER);
 properties.put("password"、 DB_PASSWORD);

【MySQLクライアントを使用して接続している場合】

以下の接続文字列の例のように、「--ssl-mode」オプションにて[VERIFY_CA]または[VERIFY_IDENTITY]を指定する場合、SSL/TLS 接続にはCA証明書の検証が必要となります。

 mysql -h RDSのエンドポイント -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-mode=VERIFY_CA

また、以下のように、「--ssl-verify-server-cert」オプションを指定する場合、SSL 接続にはサーバー CA 証明書に対する検証が必要となります。

 mysql -h RDSのエンドポイント -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-verify-server-cert

その他詳細については、以下AWS公式ドキュメントにてご確認ください
docs.aws.amazon.com

Microsoft SQL Server DBインスタンスの場合

Microsoft SQL Server DBインスタンスへ接続する際にSSL/TLS通信を行っているか、また接続の際にCA証明書の検証が必要かについての確認方法を記載します。

DBインスタンスへのSSL/TLS通信の使用確認

以下クエリを実行してDBインスタンスへの接続に対する暗号化オプションを取得します。

接続が暗号化されている場合、ENCRYPT_OPTIONは[TRUE]を返します。

 select ENCRYPT_OPTION from SYS.DM_EXEC_CONNECTIONS where SESSION_ID = @@SPID


CA証明書の検証要否の確認

接続において使用するクライアントごとに、CA証明書の検証が必要となる接続文字列を記載します。

【SQL Server Management Studio】

以下手順にて、接続時に暗号化が実行されているかを確認します。
1. SQL Server Management Studio を起動する
2. [Connect to Server]にて、サーバー情報、ログインユーザー名、パスワードを入力する
3. [Options >>]を選択する
4. 項目「Encryption」にて[Mandatory]が選択されていることを確認する

【Sqlcmd】

以下例のように、接続を暗号化するために-Nコマンドの値が[true]となっている場合、CA証明書に対する検証が必要となります。

 $ sqlcmd -S RDSのエンドポイント -N true -U admin -P password

【ADO.NET】

以下の例では、CA証明書の検証が必要となります。

 using SQLC = Microsoft.Data.SqlClient;
 ...
  static public void Main()
  {
  using (var connection = new SQLC.SqlConnection(
  "Server=tcp:RDSのエンドポイント;" +
  "Database=ExampleDB;User ID=LOGIN_NAME;" +
  "Password=YOUR_PASSWORD;" +
 "Encrypt=True;TrustServerCertificate=False;"
  ))
  {
  connection.Open();
  ...
 }

【Java】

以下の例では、CA証明書の検証が必要となります。

 String connectionUrl =
  "jdbc:sqlserver://dbinstance.rds.amazon.com;" +
 "databaseName=ExampleDB;integratedSecurity=true;" +
  "encrypt=true;trustServerCertificate=false";

その他詳細については、以下AWS公式ドキュメントにてご確認ください。
docs.aws.amazon.com

MySQL DBインスタンス(Aurora MySQL DBインスタンス)の場合

MySQL DBインスタンス(Aurora MySQL DBインスタンス)へ接続する際にSSL/TLS通信を行っているか、また接続の際にCA証明書の検証が必要かについての確認方法を記載します。

DBインスタンスへのSSL/TLS通信の使用確認

以下クエリを実行してMySQL DBインスタンスへのセッション情報を確認します。

確認内容 コマンド
MySQL DBインスタンスへのセッション情報の取得 mysql> SELECT id, user, host, connection_typ
   FROM performance_schema.threads pst
   INNER JOIN information_schema.processlist isp
   ON pst.processlist_id = isp.id;

以下出力例になります。
connection_typeにて、[SSL/TLS]と返されたセッションでは接続時にSSL/TLSが使用されています。
接続の際に使用しているユーザーのconnection_typeを確認してください。

 +----+-----------------+--------------------+-----------------+
 | id | user | host | connection_type |
 +----+-----------------+--------------------+-----------------+
 | 8 | rdsadmin | localhost | Socket |
 | 9 | rdsadmin | localhost | Socket |
 | 76 | admin | xx.xx.xx.xx:xxxxx | SSL/TLS |
 | 5 | event_scheduler | localhost | NULL |
 +----+-----------------+--------------------+-----------------+
 4 rows in set、 1 warning (0.00 sec)

CA証明書の検証要否の確認

CA証明書の検証が必要かどうかの確認については、MariaDBインスタンスの場合と確認内容同じとなりますので上記ご参照ください。
その他詳細については、以下AWS公式ドキュメントにてご確認ください。
docs.aws.amazon.com

PostgreSQL DBインスタンス(Aurora PostgreSQL DBインスタンス)の場合

PostgreSQL DBインスタンス(Aurora PostgreSQL DBインスタンス)へ接続する際にSSL/TLS通信を行っているか、また接続の際にCA証明書の検証が必要かについての確認方法を記載します。

DBインスタンスへのSSL/TLS通信の使用確認

Amazon RDSコンソールにてDBインスタンスのパラメータグループより「rds.force_ssl」の値を確認します。

「rds.force_ssl」パラメータが[1](オン)に設定されている場合は、クライアントは接続においてSSL/TLSを使用する必要があります。

また、RDS PostgreSQLバージョン9.5以降のメジャーバージョンを使用していて、「rds.force_ssl」パラメータの値が[1](オン)に設定されていない場合、以下クエリを実行して接続を確認します。

このクエリでは、SSL/TLS接続、およびSSL/TLSを使用するクライアントに関する情報のみを返します。

 SELECT datname、 usename、 ssl、 client_addr
 FROM pg_stat_ssl INNER JOIN pg_stat_activity ON pg_stat_ssl.pid = pg_stat_activity.pid
 WHERE ssl is true and usename<>'rdsadmin';

以下出力例になります。接続時にSSL/TLSを使用する行のみが表示されます。

 datname | usename | ssl | client_addr
 ----------+---------+-----+-------------
  benchdb | pgadmin | t | xx.xx.xx.xx
  postgres | pgadmin | t | xx.xx.xx.xx
 (2 rows)

CA証明書の検証要否の確認

DBクライアント上のCA証明書が検証されるのは、接続文字列内のsslmodeオプションの値が[verify-ca]、または[verify-full]に設定されていて、sslrootcertオプションの値にてCA証明書のパスが指定されている場合のみです。

以下、接続文字列の例となります。

 PGSSLMODE=verify-full PGSSLROOTCERT=/fullpath/ssl-cert.pem psql -h pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com -U masteruser -d postgres

 psql "host=pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com sslmode=verify-full sslrootcert=/full/path/ssl-cert.pem user=masteruser dbname=postgres"

その他詳細については、以下AWS公式ドキュメントにてご確認ください。
docs.aws.amazon.com

DBクライアントでの証明書更新対応について

上記確認の中で、DBクライアントからSSL/TLS通信を実施していることが分かった場合、DBクライアントの証明書更新の対応が必要となります。

Windows OSとLinux OSとで証明書更新の対応方法が異なり、それぞれの対応方法やその後の接続確認方法についてこちらの記事に記載していますので、ぜひご覧ください!
blog.jbs.co.jp

まとめ

本記事では、DBクライアントからDBインスタンスへ接続する際に、SSL/TLS通信を実施しているかどうかの確認について、各エンジンごとに記載しました。

エンジンごとに接続文字列や確認箇所が異なるため、使用されているエンジンごとに確認いただければと思います。

執筆担当者プロフィール
徐 一静

徐 一静(日本ビジネスシステムズ株式会社)

クラウドソリューション本部所属。主にAWSに関連する設計、構築を担当しています。Azureでも設計/構築経験ありです。 趣味はお笑いライブに行くことです。

担当記事一覧