ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

【証明書更新】アプリケーションがSSLを使用してAmazon RDSに通信しているかどうかの確認方法

こんにちは。フォージビジョンの藤川と申します。

2023年8月末に、AWSよりAmazon RDS認証局証明書rds-ca-2019の有効期限に関する通知がありました。メール本文にも記載がありましたが、SSL/TLS 証明書のローテーションに関する情報は以下のAWS公式サイトに記載があります。

docs.aws.amazon.com

通知内容には、

RDS DBインスタンスへの接続に証明書検証付きの Secure Sockets Layer(SSL)またはTransport Layer Security(TLS)使用しているか、使用する予定がある場合は、新しいCA証明書rds-ca-rsa2048-g1、rds-ca-rsa4096-g1、またはrds-ca-ecc384-g1のいずれかの使用を検討する必要があります。

と記載がありますが、そもそもSSL/TLS通信を使用しているかが分からないし、どうやってSSL/TLS通信を使用しているかを確認すればよいのか?という疑問が生まれました。 このため、アプリケーションがSSLを使用してAmazon RDSに通信しているかどうかの確認方法について記載させていただきたいと思います。

概要

このため、本記事では、

  1. AWSよりAmazon RDS認証局証明書rds-ca-2019の有効期限に関する通知の概要
  2. 新しいAmazon RDS 認証局証明書に関する概要
  3. SSL/TLS通信を使用している覚えがないのにAmazon RDS認証局証明書がある理由
  4. アプリケーションがSSLを使用してAmazon RDSに通信しているかどうかの確認方法

について、記載させていただきたいと思います。

1. RDS 認証局証明書の有効期限に関する通知の概要

1.1 SSL/TLS通信と有効期限を設ける理由

データベースインスタンスとの通信を保護するため、認証局 (CA) は期限付きの証明書を生成し、SSL/TLS通信を実施することができます。

SSL/TLS通信に使用される証明書には、通常、設定されたライフタイムがあります。このためAWSでは業界のベストプラクティスに従って、CAを更新し、定期的に新しい証明書を作成します。

1.2 今回対象の認証局証明書の有効期限

今回対象のAmazon RDSの認証局証明書は、rds-ca-2019です。
rds-ca-2019の有効期限は2024年8月22日となります。

1.3 対象のリソース

・メール本文で確認する方法

対象のリソースを利用中のAWSアカウントに対し、以下の件名でメールが通知されています。

[Action required] Update Your Amazon RDS and Amazon Aurora SSL/TLS Certificates by August 22, 2024 [AWS Account: {AWSアカウントID}] [{対象リソースのリージョン名}]

メール本文の中にThe following is a list of your affected resources(影響を受けるリソースのリスト)として、対象リソースの記載があります。

・AWS Health Dashboardから確認する方法

AWS Health Dashboardコンソールのその他の通知にアクセスいただき、対象のRDS operational notificatiomのリンクにアクセスいただき、影響を受けるリソースタブをクリックいただくことで確認することができます。

1.4 対応内容

対象のリソースをお持ちの場合、有効期限よりも前にまずクライアントアプリケーションのトラストストアに新しいCA証明書を追加し、次にデータベースインスタンスの証明書を最新の発行バージョンに更新する必要があります。

1.4.1 更新手順

更新手順については、

  1. 新しいSSL/TLS証明書をダウンロードします
  2. 新しいSSL/TLS証明書を使用するようにアプリケーションを更新します
  3. DBインスタンスを変更して、CAをrds-ca-2019からrds-ca-rsa2048-g1に変更します

となっています。
対応方法の詳細については、AWS公式サイトに記載がありますので、以下をご確認ください。

1.4.1.1 Amazon RDSインスタンスの対応方法の詳細

docs.aws.amazon.com

1.4.1.2 Amazon Auroraインスタンスの対応方法の詳細

docs.aws.amazon.com

1.5 対応しない場合の影響

SSL/TLS通信を使用していた場合、証明書の有効期限が切れると、RDS DBインスタンスまたはAurora DBクラスターへの接続が失われる可能性があります。

2. 新しいAmazon RDS認証局証明書に関する概要

Amazon RDS認証局証明書の更新先ですが、2023年1月に、AWSよりAmazon RDSが新しいSSL/TLS証明書と証明書管理サポートを開始に関する発表がありました。

aws.amazon.com

2.1 新しいSSL/TLS証明書の詳細

前回のAmazon RDS 認証局証明書の更新が2020年3月でした。 aws.amazon.com

このため、4年周期くらいのペースで更新が必要と考えていましたが、この度AWS発表された新しいSSL/TLS証明書については、以下のように有効期限が40年と100年となっており、かなり半永久と言って良いほどの期間となっています。

  • rds-ca-ecc384-g1:有効期限40年
  • rds-ca-rsa4096-g1:有効期限100年
  • rds-ca-rsa2048-g1:有効期限100年

今回の更新作業を乗り切れば、Amazon RDS認証局証明書の更新作業は、考えなくて良さそうです。

3. SSL/TLS通信を使用している覚えがないのにAmazon RDS認証局証明書がある理由

Amazon RDSの作成時にSSL/TLS通信を利用する予定がなく、Amazon RDS認証局証明書を付与した覚えがないのに、なぜ作成されてしまっているのか疑問に思う方も少なくないかと思います。

Amazon RDSの作成時画面を見てみると、認証機関の設定箇所は以下のようになっています。

このことから、SSL/TLS通信を利用する予定がなくても、Amazon RDSの作成するとAmazon RDS認証局証明書が付与されるようです。
また、Amazon Auroraの作成画面では、認証機関の設定箇所は表示されませんが、Amazon RDS認証局証明書は付与されていました。

4. アプリケーションがSSLを使用してAmazon RDSに通信しているかどうかの確認方法

有効期限が長くなったりと改善は進んでいますが、結局2024年8月22日までにAmazon RDS認証局証明書rds-ca-2019が付与されている場合には、Amazon RDS認証局証明書の更新が必要なことには変わりありません。
冒頭にも記載しましたが、そもそも現在利用しているAmazon RDSでSSL/TLS通信を使用しているかが分からないし、どうやってSSL/TLS通信を使用しているかを確認すればよいのか?という疑問が生まれました。

4.1 確認方法

確認方法については、AWS公式サイトに記載がありました。本記事ではRDS for MySQLとRDS for PostgreRDS for PostgreSQLの確認方法について記載したいと思います。

4.1.1 アプリケーションがSSLを使用してMySQL DBインスタンスに接続しているかどうかの確認

Amazon RDS for MySQLバージョン5.7または8.0を使用しており、Performance Schemaが有効になっている必要がありますが、次のクエリを実行することで、SSL/TLS通信が使用されているかどうかを確認できます。

mysql> SELECT id, user, host, connection_type 
       FROM performance_schema.threads pst 
       INNER JOIN information_schema.processlist isp 
       ON pst.processlist_id = isp.id;            

以下の出力例では、adminとwebapp1ユーザーでSSL/TLS通信が使用されていることが分かります。

詳細については、以下のAWS公式サイトに記載されておりますので、ご参照ください。

docs.aws.amazon.com

4.1.2 アプリケーションがSSLを使用してPostgreSQL DBインスタンスに接続しているかどうかの確認

4.1.2.1 クエリでの確認

RDS PostgreSQLバージョン9.5以降のメジャーバージョンを使用しており、rds.force_ssl が 0(FALSE)に設定されている場合、pg_stat_sslビューに対してクエリを実行してSSLを使用している接続を確認することができます。

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通信を使用する接続のみが、接続に関する情報とともに表示されます。

このクエリでは、クエリ実行時点の接続のみが表示されるため、結果が表示されない場合でも、クエリ実行時点でたまたまSSL/TLS通信による接続がなかったという可能性がありますのでご注意ください。

4.1.2.2 rds.force_sslパラメータでの確認

DBインスタンスの設定でrds.force_sslパラメータの値を確認し、rds.force_sslパラメータが 1(TRUE)に設定されている場合には、クライアントは強制的にSSL/TLS通信を接続に使用する必要があるため、SSL/TLS通信を使用しているということになります。該当のAmazon RDSで設定されているパラメータグループのパラメータを検索し、確認してください。

また、PosrgreSQLのバージョンによってデフォルトの設定値が異なりますので、PosrgreSQLのバージョンも確認してみてください。

  • PostgreSQLバージョン15以前:rds.force_sslのデフォルトが 0(FALSE)
  • PostgreSQLバージョン15以降:rds.force_sslのデフォルトが 1(TRUE)

詳細については、以下のAWS公式サイトに記載されておりますので、ご参照ください。

docs.aws.amazon.com

最後に

本記事が皆様のAmazon RDSの運用に少しでもお役立ちできますと幸いです。これからも皆様のAWS運用に役立つ情報を提供できるように精進して参ります。