SSL/TLS 証明書のローテーション - Amazon Aurora

SSL/TLS 証明書のローテーション

Amazon RDS 認証局証明書 rds-ca-2019 は、2024 年 8 月に期限切れになるように設定されています。RDS DB インスタンスへの接続に証明書検証付きの Secure Sockets Layer (SSL) または Transport Layer Security (TLS) を使用しているか、使用する予定がある場合は、新しい CA 証明書 rds-ca-rsa2048-g1 の使用を検討してください。現在、証明書検証付きで SSL/TLS を使用していない場合でも、CA 証明書の有効期限が切れている可能性があり、証明書検証付きで SSL/TLS を使用して RDS データベースに接続する予定がある場合は、新しい CA 証明書に更新する必要があります。

更新を行うには、次の手順に従います。新しい CA 証明書を使用するように DB インスタンスを更新する前に、RDS データベースに接続するクライアントまたはアプリケーションを必ず更新します。

Amazon RDS では、AWS セキュリティのベストプラクティスとして、新しい CA 証明書を提供しています。新しい証明書およびサポートしている AWS リージョンに関する詳細は、「SSL/TLS を使用した DB クラスターへの接続の暗号化」を参照してください。

注記

Amazon RDS Proxy および Aurora Serverless v1 は AWS Certificate Manager (ACM) の証明書を使用します。RDS Proxy を使用している場合は、SSL/TLS 証明書を更新するときに、RDS Proxy 接続を使用するアプリケーションを更新する必要はありません。詳細については、「RDS Proxy での TLS/SSL の使用」を参照してください。

Aurora Serverless v1 を使用している場合は、Amazon RDS 証明書をダウンロードする必要はありません。詳細については、「Aurora Serverless v1 での TLS/SSL の使用」を参照してください。

注記

2020 年 7 月 28 日より前に作成された、または rds-ca-2019 証明書にアップデートされた DB インスタンスで Go バージョン 1.15 アプリケーションを使用している場合は、証明書を再度更新する必要があります。エンジンに応じて、証明書を rds-ca-rsa2048-g1、rds-ca-rsa4096-g1、または rds-ca-ecc384-g1 に更新してください。新しい CA 証明書識別子を使用して、DB インスタンスの場合は modify-db-instance コマンド実行します。describe-db-engine-versions コマンドを使用すると、特定の DB エンジンと DB エンジンのバージョンで使用できる CA を検索できます。

2020 年 7 月 28 日以降にデータベースを作成したか、その証明書を更新した場合、必要なアクションはありません。詳細については、Go GitHub issue #39568 を参照してください。

DB インスタンスの変更による CA 証明書の更新

次の例では、CA 証明書を RDS CA-2019 から rds-ca-rsa2048-g1 に更新します。別の証明書を選択できます。詳細については、認証局 をご参照ください。

アプリケーションの信頼ストアを更新して、CA 証明書の更新に関連するダウンタイムを短縮します。CA 証明書のローテーションに関連する再起動の詳細については、「サーバー証明書の自動ローテーション」を参照してください。

DB インスタンスを変更して CA 証明書を更新するには
  1. SSL/TLS を使用した DB クラスターへの接続の暗号化」の説明に従って、新しい SSL/TLS 証明書をダウンロードします。

  2. 新しい SSL/TLS 証明書を使用するようにアプリケーションを更新します。

    新しい SSL/TLS 証明書のアプリケーションを更新する方法は、特定のアプリケーションにより異なります。アプリケーション開発者と協力して、アプリケーションの SSL/TLS 証明書を更新します。

    SSL/TLS 接続の確認および各 DB エンジン用アプリケーションの更新については、以下のトピックを参照してください。

    Linux オペレーティングシステムの信頼ストアを更新するサンプルスクリプトについては、「証明書を信頼ストアにインポートするためのサンプルスクリプト」を参照してください。

    注記

    証明書バンドルには古い CA と新しい CA の両方の証明書が含まれます。そのため、アプリケーションを安全に更新し、移行期間に接続を維持することができます。AWS Database Migration Service を使用してデータベースを DB クラスターに移行する場合は、移行中の接続を確保するために証明書バンドルを使用することをお勧めします。

  3. DB インスタンスを変更して、CA を rds-ca-2019 から rds-ca-rsa2048-g1 に変更します。CA 証明書を更新するためにデータベースの再起動が必要かどうかを確認するには、describe-db-engine-versions コマンドを使用して、SupportsCertificateRotationWithoutRestart フラグをチェックします。

    注記

    CA 証明書を更新するように変更した後に Babelfish クラスターを再起動します。

    重要

    証明書の有効期限が切れた後に接続の問題が発生した場合は、コンソールで [すぐに適用] を指定するか、--apply-immediately を使用して AWS CLI オプションを指定します。デフォルトで、このオペレーションは次のメンテナンスウィンドウの間に実行するようスケジュールされています。

    デフォルト RDS CA と異なる cluster CA のオーバーライドを設定するには、modify-certificates CLI コマンドを使用します。

AWS Management Console または AWS CLI を使用して、DB インスタンスの CA 証明書を rds-ca-2019 から rds-ca-rsa2048-g1 に変更できます。

  1. AWS Management Console にサインインし、Amazon RDS コンソール https://console.aws.amazon.com/rds/ を開きます。

  2. ナビゲーションペインで、[データベース] を選択し、変更する DB インスタンスを選択します。

  3. Modify を選択します。

    DB インスタンスを変更する
  4. [接続] セクションで、[rds-ca-rsa2048-g1] を選択します。

    CA 証明書の選択
  5. [Continue] を選択して、変更の概要を確認します。

  6. 変更をすぐに反映させるには、[Apply immediately] を選択します。

  7. 確認ページで、変更内容を確認します。変更内容が正しい場合は、[DB インスタンスを変更] を選択して変更を保存します。

    重要

    このオペレーションをスケジュールする場合は、必ずクライアント側の信頼ストアを事前に更新します。

    または、[戻る] を選択して変更を編集するか、[キャンセル] を選択して変更をキャンセルします。

AWS CLI を使用して DB インスタンスの CA を rds-ca-2019 から rds-ca-rsa2048-g1 に変更するには、modify-db-instance または modify-db-cluster コマンドを呼び出します。DB インスタンス識別子および --ca-certificate-identifier オプションを指定します。

--apply-immediately パラメータを使用して更新を直ちに適用します。デフォルトで、このオペレーションは次のメンテナンスウィンドウの間に実行するようスケジュールされています。

重要

このオペレーションをスケジュールする場合は、必ずクライアント側の信頼ストアを事前に更新します。

次の例では、CA 証明書を rds-ca-rsa2048-g1 に設定することにより、mydbinstance を変更しています。

Linux、macOS、Unix の場合:

aws rds modify-db-instance \ --db-instance-identifier mydbinstance \ --ca-certificate-identifier rds-ca-rsa2048-g1

Windows の場合:

aws rds modify-db-instance ^ --db-instance-identifier mydbinstance ^ --ca-certificate-identifier rds-ca-rsa2048-g1
注記

インスタンスを再起動する必要がある場合、modify-db-instance CLI コマンドを使用して、--no-certificate-rotation-restart オプションを指定できます。

メンテナンスの適用による CA 証明書の更新

メンテナンスを適用して CA 証明書を更新するには、次のステップを実行します。

メンテナンスを適用して CA 証明書を更新するには
  1. AWS Management Console にサインインし、Amazon RDS コンソール https://console.aws.amazon.com/rds/ を開きます。

  2. ナビゲーションペインで [証明書の更新] を選択します。

    ナビゲーションペインの証明書の更新オプション

    [証明書の更新が必要なデータベース] ページが表示されます。

    データベースの CA 証明書の更新
    注記

    このページには、現在の AWS リージョン リージョンの DB インスタンスのみが表示されます。複数の AWS リージョン にデータベースがある場合は、このページを AWS リージョン ごとにチェックし、古い SSL/TLS 証明書を使用しているすべての DB インスタンスを確認します。

  3. 更新する DB インスタンスを選択します。

    [スケジュール] を選択すると、次のメンテナンスウィンドウでの証明書の更新をスケジュールできます。[今すぐ適用] を選択して、直ちに更新を適用します。

    重要

    証明書の有効期限が切れた後に接続の問題が発生した場合は、[今すぐ適用] オプションを使用します。

    1. [スケジュール] を選択すると、CA 証明書のローテーションの確認を求められます。このプロンプトには、アップデートのスケジュール期間も記載されています。

      証明書の更新の確認
    2. [今すぐ適用] を選択すると、CA 証明書のローテーションの確認を求められます。

      証明書の更新の確認
    重要

    データベースでの CA 証明書の更新をスケジュールする前に、SSL/TLS とサーバー証明書を接続に使用するクライアントアプリケーションを更新します。これらの更新は、DB エンジンに固有です。これらのクライアントアプリケーションを更新したら、CA 証明書の更新を確認できます。

    続行するには、チェックボックスをオンにし、[確認] を選択します。

  4. 更新する DB インスタンスごとに、ステップ 3 と 4 を繰り返します。

サーバー証明書の自動ローテーション

CA がサーバー証明書の自動ローテーションをサポートしている場合、RDS は DB サーバー証明書のローテーションを自動的に処理します。RDS はこの自動ローテーションに同じルート CA を使用するため、新しい CA バンドルをダウンロードする必要はありません。「認証局」を参照してください。

DB サーバー証明書のローテーションと有効期間は DB エンジンによって異なります。

  • DB エンジンが再起動なしのローテーションをサポートしている場合、ユーザーによるアクションがなくても、RDS は DB サーバー証明書を自動的にローテーションします。RDS は、DB サーバー証明書の半減期になった時点で、希望するメンテナンス期間に DB サーバー証明書のローテーションを試みます。新しい DB サーバー証明書は、12 か月間有効です。

  • DB エンジンが再起動なしのローテーションをサポートしていない場合、RDS は DB サーバー証明書の有効期限が切れる少なくとも 6 か月前にメンテナンスイベントについて通知します。新しい DB サーバー証明書は、36 か月間有効です。

describe-db-engine-versions コマンドを使用して、SupportsCertificateRotationWithoutRestart フラグを点検することで、再起動なしで DB エンジンバージョンが証明書のローテーションをサポートするかどうかを特定します。詳細については、「データベースに CA を設定する」を参照してください。

証明書を信頼ストアにインポートするためのサンプルスクリプト

次のサンプルシェルスクリプトでは、証明書バンドルを信頼ストア内にインポートします。

各サンプルシェルスクリプトでは、Java 開発キット (JDK) の一部である keytool が使用されます。JDK のインストールの詳細については、「JDK インストールガイド」を参照してください。

Linux で証明書をインポートするためのサンプルスクリプト

Linux オペレーティングシステムで、証明書バンドルを信頼ストアにインポートするサンプルシェルスクリプトを次に示します。

mydir=tmp/certs if [ ! -e "${mydir}" ] then mkdir -p "${mydir}" fi truststore=${mydir}/rds-truststore.jks storepassword=changeit curl -sS "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" > ${mydir}/global-bundle.pem awk 'split_after == 1 {n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1}{print > "rds-ca-" n+1 ".pem"}' < ${mydir}/global-bundle.pem for CERT in rds-ca-*; do alias=$(openssl x509 -noout -text -in $CERT | perl -ne 'next unless /Subject:/; s/.*(CN=|CN = )//; print') echo "Importing $alias" keytool -import -file ${CERT} -alias "${alias}" -storepass ${storepassword} -keystore ${truststore} -noprompt rm $CERT done rm ${mydir}/global-bundle.pem echo "Trust store content is: " keytool -list -v -keystore "$truststore" -storepass ${storepassword} | grep Alias | cut -d " " -f3- | while read alias do expiry=`keytool -list -v -keystore "$truststore" -storepass ${storepassword} -alias "${alias}" | grep Valid | perl -ne 'if(/until: (.*?)\n/) { print "$1\n"; }'` echo " Certificate ${alias} expires in '$expiry'" done

macOS で証明書をインポートするためのサンプルスクリプト

macOS で証明書バンドルを信頼ストアにインポートするサンプルシェルスクリプトを次に示します。

mydir=tmp/certs if [ ! -e "${mydir}" ] then mkdir -p "${mydir}" fi truststore=${mydir}/rds-truststore.jks storepassword=changeit curl -sS "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" > ${mydir}/global-bundle.pem split -p "-----BEGIN CERTIFICATE-----" ${mydir}/global-bundle.pem rds-ca- for CERT in rds-ca-*; do alias=$(openssl x509 -noout -text -in $CERT | perl -ne 'next unless /Subject:/; s/.*(CN=|CN = )//; print') echo "Importing $alias" keytool -import -file ${CERT} -alias "${alias}" -storepass ${storepassword} -keystore ${truststore} -noprompt rm $CERT done rm ${mydir}/global-bundle.pem echo "Trust store content is: " keytool -list -v -keystore "$truststore" -storepass ${storepassword} | grep Alias | cut -d " " -f3- | while read alias do expiry=`keytool -list -v -keystore "$truststore" -storepass ${storepassword} -alias "${alias}" | grep Valid | perl -ne 'if(/until: (.*?)\n/) { print "$1\n"; }'` echo " Certificate ${alias} expires in '$expiry'" done