[アクションが必要]SSL/TLS 証明書を更新してください 【RDS】

Blog-Thumbnail_KUDs-01

はじめに

こんにちは、KUDs です。

先日、以下のメールを受信しました。

[アクションが必要です] 2024 年 8 月 22 日までに Amazon RDS と Amazon Aurora SSL/TLS 証明書を更新してください

このメッセージを受け取っているのは、お客様の AWS アカウントに、2024 年 8 月 22 日に有効期限が切れる SSL/TLS 証明書を使用する Amazon RDS または Amazon Aurora データベースインスタンスが AP-NORTHEAST-1 リージョンに 1 つ以上あるためです。

Amazon Web Services, Inc. [email protected]

なるほど。「SSL/TLS 証明書の有効期限が切れるから更新しましょう」という内容のようです。

今回の記事では、証明書更新について影響の有無や対応方法を確認していきます。
「SSL/TLS は使用してないから問題ないはず。。。!」
という方も、一度ご確認いただくと良いかと思います。

メールの内容確認

この章では、メールを一行一行ちゃんと読んでいきましょう。

通知の対象リソースはどれ?

影響を受けるリソースのリストは、AWS Health Dashboard の [影響を受けるリソース](Affected resources) タブにあります。

Amazon Web Services, Inc. [email protected]

AWS Health Dashboard のイベントログから確認可能だよ」とのことです。
実際に確認すると、イベントログには以下のようなテーブルがあります。

イベント状態イベントのカテゴリリージョン/ゾーン開始時刻最終更新日時影響を受けるリソース
RDS planned lifecycle event今後予定された変更ap-northeast-12024年8月22日 午後 4:00:00 UTC+92024年3月5日 午前 9:06:24 UTC+9
イベントログ

ここでは、RDS planned lifecycle event というイベントが該当の通知です。
「影響を受けるリソース」を確認すると、対象が確認できます。

リソース ID/ARNリソースステータス最終更新時刻
arn:aws:rds:ap-northeast-1:123456789012:db:kuds-rds保留中4ヶ月前
影響を受けるリソース

更新対応は完了済みなのに通知されたのはなぜ?

これは SSL/TLS CA 認証の有効期限切れに関するフォローアップ通知です。もしこの対応を完了しているにも関わらず、本通知を受け取っている場合は、2019 CA を使用して新しいインスタンスを作成したことが原因と考えられます。2024 年 1 月 25 日以降、別の CA を明示的に指定せずに新しく作成されたインスタンスはすべて、「rds-ca-rsa2048-g1」CA を使用します。アカウントレベルの CA オーバーライドの設定については、modify-certificates API ドキュメント [1] を参照してください。

[1] https://docs.aws.amazon.com/cli/latest/reference/rds/modify-certificates.html

Amazon Web Services, Inc. [email protected]

2024/1/25 以前に CA を指定せずにインスタンス作成した場合は対象になるかもよ」とのこと。
そのため、「対応済みなのに通知されたんだけどなんで!?」って方はこれに該当してないか確認しましょう。

SSL/TLS の利用有無による対応要否は?

アプリケーションが SSL/TLS プロトコルを使用してこれらのインスタンスに接続する場合、既存のデータベースインスタンスへの接続障害を防ぐために、2024 年 8 月 22 日までにアクションを実行する必要があります。現在接続に SSL を使用していない場合でも、データベースサーバー証明書の有効期限が切れると影響を受ける可能性があるため、CA を更新することをお勧めします。

Amazon Web Services, Inc. [email protected]

SSL/TLS の利用有無に関わらず CA は更新しましょうよ」ってことですね。

SSL を使用している場合は接続障害が起きる
SSL を使用していない場合もなんらかの影響を受ける可能性がある

とのことです。

SSL/TLS を使用しているかわからない

という方は、確認手順をまとめておきますので後述の章をご参照ください。

なぜ証明書の更新が必要なの?

メールには以下の記載があります。

データベースインスタンスとの通信を保護するために、CA は期限付きの証明書を生成します。この証明書は、情報を交換する前にデータベースクライアントソフトウェアによって確認され、データベースインスタンスの認証が行われます。AWS は業界のベストプラクティスに従い、お客様の接続が今後何年にもわたって適切に保護されるよう、CA を更新し、定期的に新しい証明書を作成します。AP-NORTHEAST-1 リージョン現在の CA は 2024 年 8 月 22 日に失効します。この日までに、DB サーバー証明書を更新する必要があります。これを行う一般的なプロセスを次にご案内します。

Amazon Web Services, Inc. [email protected]

ざっくり要約すると以下です。

  • AWS はベストプラクティスに従い CA を定期的に更新している
  • 東京リージョンの CA 失効日は 2024/08/22

証明書の更新 (アプリケーションクライアント)

まず、アプリケーションクライアントを新しい証明書で更新します。アプリケーションクライアントがトラストストアを使用している場合は、新しい CA 証明書をクライアントアプリケーションのトラストストアに追加します。RDS では、ユーザーガイド [2] に CA 証明書へのダウンロードリンクが記載されています。クライアントアプリケーションのトラストストアを更新する詳細な手順については、[3] を参照してください。

[2] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesAllRegions
[3] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL-certificate-rotation.html#UsingWithRDS.SSL-certificate-rotation-updating

Amazon Web Services, Inc. [email protected]

トラストストアを使用している場合の手順が記載されています。
そもそも SSL/TLS 使用していない人は無視しましょう。

証明書の更新 (データベースインスタンス)

rds-ca-rsa2048-g1 かそれ以外か

次に、影響を受けるすべてのデータベースインスタンスの証明書を、新しく発行された CA のいずれかに更新します。アルゴリズム変更がないため、「rds-ca-rsa2048-g1」がデフォルトの推奨 CA です。他の CA は新しいキーアルゴリズムを使用しているため、互換性を確認するためにクライアントセットアップをさらにテストする必要があります。新しい CA の詳細については、[4] を参照してください。

さらに、デフォルトの「rds-ca-rsa2048-g1」とは異なる CA を使用する場合は、アカウントレベルの CA オーバーライドを設定して、新しいインスタンスが任意の CA を使用するようにする必要があります。これを行うために、modify-certificates API を使用できます。これにより、新しく作成されたデータベースインスタンスのデフォルト CA を古い CA または新しい CA のいずれかにオーバーライドできます。このオーバーライドは、オーバーライド先の CA が有効な場合にのみ適用されます。この API を使用するには、AWS CLI バージョン 1.17 以降である必要があります。詳細については、証明書の修正 API ドキュメント [1] を参照してください。describe-certificates API [5] もあります。これは、現在のデフォルト CA オーバーライドが設定されている場合にそれを示します。インスタンスの作成時に特定の CA を設定するには、create-db-instance API の ca-certificate-identifier オプションを使用して、特定の CA を持つ DB インスタンスを作成します。詳細については、create-db-instance API ドキュメント [6] を参照してください。

[4] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.RegionCertificateAuthorities
[5] https://docs.aws.amazon.com/cli/latest/reference/rds/describe-certificates.html
[6] https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-instance.html

Amazon Web Services, Inc. [email protected]

要するに以下です。

  • rds-ca-2019 の更新先証明書としては、アルゴリズム変更がない rds-ca-rsa2048-g1 が推奨
  • rds-ca-rsa2048-g1 以外を使用する場合は考慮事項がいろいろあるよ

そのため、rds-ca-rsa2048-g1 以外を使用する人は熟読しましょう。
私はデフォルト推奨の rds-ca-rsa2048-g1 を使用するため、無視します。

証明書の更新手順について

これらの更新を実行する方法の詳細については、Amazon RDS インスタンス [7] と Amazon Aurora インスタンス [8] のドキュメントを参照してください。

[7] https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL-certificate-rotation.html
[8] https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.SSL-certificate-rotation.html

Amazon Web Services, Inc. [email protected]

ドキュメント読みなはれ」とのこと。
実際にやってみた手順は後述します。

その他の留意事項

次のタイムラインに注意してください。

  1. できるだけ早く: クライアントトラストストアを更新する必要があります。そうすれば、インスタンスサーバー証明書を新しい CA のいずれかによって生成された証明書に更新できます。
  2. 2024 年 1 月 26 日以降: 新しいデータベースインスタンスはデフォルトで ‘rds-ca-rsa2048-g1’ 証明書を使用するようになります。新しいインスタンスで別の証明書を使用したい場合は、使用する証明書を AWS コンソールまたは AWS CLI で指定できます。詳細については、create-db-instance API ドキュメンテーション [6] を参照してください。
  3. 2024 年 8 月 22 日以降: 「rds-ca-2019」の有効期限が切れます。既存のデータベースインスタンスへの接続障害を防ぐために、2024 年 8 月 22 日までに対策を講じる必要があります。

詳細については、当社のブログ [9] を参照してください。質問や懸念がある場合は、AWS サポート [10] にお問い合わせください。

[9] https://aws.amazon.com/blogs/aws/rotate-your-ssl-tls-certificates-now-amazon-rds-and-amazon-aurora-expire-in-2024/
[10] https://console.aws.amazon.com/support/home

Amazon Web Services, Inc. [email protected]

タイムラインには注意して、早いこと対応しましょう」ということです。

「DB 接続時の SSL/TLS の利用状況を確認したい」

この章では、SSL/TLS の利用状況を確認する方法について確認します。

前述の通り、「利用有無に関わらず更新した方が良い」というのは前提です。
しかし、利用有無がわからないという状況も、それはそれで問題なので確認しておきたいところです。

MySQL の場合

まず、MySQL に接続します。
※ user, password, host はそれぞれのユーザ、パスワード、RDS エンドポイントを指定してください

$ mysql --user=kuds-user --password="kuds-password" --host kuds-rds.ap-northeast-1.rds.amazonaws.com

次に、MySQL の場合、以下のクエリで確認可能です。

mysql> SELECT id, user, host, connection_type 
       FROM performance_schema.threads pst 
       INNER JOIN information_schema.processlist isp 
       ON pst.processlist_id = isp.id;   
+----+-----------------+------------------+-----------------+
| 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)            

上記の出力例では、 admin, webapp1 で SSL/TLS が使用されています。

AWS 公式ドキュメントにも記載がありますのでご参照ください。

新しい SSL/TLS 証明書を使用して MySQL DB インスタンスに接続するようにアプリケーションを更新する - Amazon Relational Database Service
SSL/TLS 証明書のローテーションのために RDS for MySQL DB インスタンスに接続するようにアプリケーションを更新します。

Aurora PostgreSQL DB の場合

Aurora PostgreSQL DB の場合は以下のクエリで確認可能です。

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';
 datname  | usename | ssl | client_addr
----------+---------+-----+-------------
 benchdb  | pgadmin | t   | 53.95.6.13
 postgres | pgadmin | t   | 53.95.6.13
(2 rows)

こちらは、クエリ実行時点の接続情報のみを表示します。そのため、「結果が表示されない = アプリケーションは SSL/TLS 接続を使用していない」ではないことをご注意ください。たまたま接続がない時間帯だったというだけかもしれないということです。

こちらも AWS 公式の資料があるのでご参照ください。

新しい SSL/TLS 証明書を使用して Aurora PostgreSQL DB クラスターに接続するようにアプリケーションを更新する - Amazon Aurora
SSL/TLS 証明書のローテーションのために Aurora PostgreSQL DB クラスターに接続するようにアプリケーションを更新します。

実際に証明書を更新してみた

この章では、実際にデータベースインスタンスの証明書更新をする手順を確認します。

先ほどメールにて案内があったドキュメントの手順を確認しましょう。

  1. SSL/TLS を使用した DB インスタンスへの接続の暗号化」の説明に従って、新しい SSL/TLS 証明書をダウンロードします。
  2. 新しい SSL/TLS 証明書を使用するようにアプリケーションを更新します。
  3. DB インスタンスを変更して、CA を rds-ca-2019 から rds-ca-rsa2048-g1 に変更します。CA 証明書を更新するためにデータベースの再起動が必要かどうかを確認するには、describe-db-engine-versions コマンドを使用して、SupportsCertificateRotationWithoutRestart フラグをチェックします。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL-certificate-rotation.html#UsingWithRDS.SSL-certificate-rotation-updating

ここで、1, 2, は前述の通りアプリケーションクライアントの更新に関するものなので、スキップします。
データベースインスタンスの更新である、3 の手順を詳細に確認しましょう。

再起動の要否を確認

まずは、証明書の更新にあたってデータベースの再起動が必要かを確認しましょう。
SupportsCertificateRotationWithoutRestart フラグをチェックします。

$ aws rds describe-db-engine-versions --engine mysql --engine-version 8.0.35 --query 'DBEngineVersions[].SupportsCertificateRotationWithoutRestart' --output text
True

mysql 8.0.35 の場合は True なので、再起動なしで更新が可能です。

一覧が欲しい方もいらっしゃると思うので、MySQL, Aurora PostgreSQL それぞれ確認しておきます。

MySQL の場合

$ aws rds describe-db-engine-versions --engine mysql --query 'DBEngineVersions[].[EngineVersion,SupportsCertificateRotationWithoutRestart]' --output table
--------------------------
|DescribeDBEngineVersions|
+------------+-----------+
|  5.7.37    |  False    |
|  5.7.38    |  False    |
|  5.7.39    |  False    |
|  5.7.40    |  False    |
|  5.7.41    |  False    |
|  5.7.42    |  False    |
|  5.7.43    |  False    |
|  5.7.44    |  False    |
|  8.0.28    |  True     |
|  8.0.31    |  True     |
|  8.0.32    |  True     |
|  8.0.33    |  True     |
|  8.0.34    |  True     |
|  8.0.35    |  True     |
|  8.0.36    |  True     |
+------------+-----------+

Aurora PostgreSQL DB の場合

$ aws rds describe-db-engine-versions --engine aurora-postgresql --query 'DBEngineVersions[].[EngineVersion,SupportsCertificateRotationWithoutRestart]' --output table
--------------------------
|DescribeDBEngineVersions|
+-----------+------------+
|  11.9     |  True      |
|  11.21    |  True      |
|  11.21    |  False     |
|  12.9     |  True      |
|  12.11    |  True      |
|  12.12    |  True      |
|  12.13    |  True      |
|  12.14    |  True      |
|  12.15    |  True      |
|  12.16    |  True      |
|  12.17    |  True      |
|  13.7     |  True      |
|  13.8     |  True      |
|  13.9     |  True      |
|  13.10    |  True      |
|  13.11    |  True      |
|  13.12    |  True      |
|  13.12    |  False     |
|  13.13    |  True      |
|  14.3     |  True      |
|  14.4     |  True      |
|  14.5     |  True      |
|  14.6     |  True      |
|  14.7     |  True      |
|  14.8     |  True      |
|  14.9     |  True      |
|  14.10    |  True      |
|  15.2     |  True      |
|  15.3     |  True      |
|  15.4     |  True      |
|  15.5     |  True      |
|  16.1     |  True      |
+-----------+------------+

証明書の更新

いよいよ実際に更新してみましょう。

まず、AWS マネジメントコンソールを開きましょう。
RDS サービスを選択すると、左ペインに「証明書の更新」タブがあるので開きます。
対象の RDS が確認できたら、選択して右上の「Apply update now」をクリックします。

RDS コンソール「証明書の更新が必要なデータベース」
RDS コンソール「証明書の更新が必要なデータベース」

すると、以下のウィンドウが表示されます。

証明書の更新を今すぐ確認「rds-ca-rsa2048-g1」
証明書の更新を今すぐ確認「rds-ca-rsa2048-g1」

ここでは、更新先の CA が正しいか確認し、「確認」をクリックします。
※ デフォルト推奨は rds-ca-rsa2048-g1
(超余談: May 26, 2061 って自分何歳だ?って一瞬気になりました)

kuds-rds を変更しています。この処理には数分かかる場合があります。

(数分後)

kuds-rds が正常に変更されました。

完了しました!

さいごに

今回は SSL/TLS 証明書の更新手順について確認しました。

最後に、簡単に内容のサマリを書いておきます。

  • rds-ca-2019 を使用している人に通知が飛んでます
  • rds-ca-2019 は 2024/08/22 に失効します
  • SSL/TLS の利用有無に関わらず影響が出る可能性があるので、更新することをお勧めします
  • 更新先のおすすめは rds-ca-rsa2048-g1 です
  • 更新方法の詳細はドキュメントを読みましょう

以上です。

コメント