SSL/TLS 証明書のローテーション
Amazon RDS 認証局証明書 rds-ca-2019 は、2024 年 8 月に期限切れになるように設定されています。RDS DB インスタンスまたはマルチ AZ DB クラスターへの接続に証明書検証付きの Secure Sockets Layer (SSL) または Transport Layer Security (TLS) を使用しているか、使用する予定がある場合は、新しい CA 証明書 rds-ca-rsa2048-g1、rds-ca-rsa4096-g1、または rds-ca-ecc384-g1 のいずれかの使用を検討してください。 現在、証明書検証付きで SSL/TLS を使用していない場合でも、CA 証明書の有効期限が切れている可能性があり、証明書検証付きで SSL/TLS を使用して RDS データベースに接続する予定がある場合は、新しい CA 証明書に更新する必要があります。
更新を行うには、次の手順に従います。新しい CA 証明書を使用するように DB インスタンスまたはマルチ AZ DB クラスターを更新する前に、RDS データベースに接続するクライアントまたはアプリケーションを必ず更新する必要があります。
Amazon RDS では、AWS セキュリティのベストプラクティスとして、新しい CA 証明書を提供しています。新しい証明書およびサポートしている AWS リージョンに関する詳細は、「SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化」を参照してください。
注記
Amazon RDS Proxy は AWS Certificate Manager (ACM) の証明書を使用します。RDS Proxy を使用している場合は、SSL/TLS 証明書を更新するときに、RDS Proxy 接続を使用するアプリケーションを更新する必要はありません。詳細については、「RDS Proxy での TLS/SSL の使用」を参照してください。
注記
2020 年 7 月 28 日以前に rds-ca-2019 証明書を使用するように作成または更新された DB インスタンスまたはマルチ AZ DB クラスターで Go バージョン 1.15 アプリケーションを使用している場合は、証明書を再度更新する必要があります。エンジンに応じて、証明書を rds-ca-rsa2048-g1、rds-ca-rsa4096-g1、または rds-ca-ecc384-g1 に更新してください。新しい CA 証明書識別子を使用して、DB インスタンスの場合は modify-db-instance
コマンド、マルチ AZ DB クラスターの場合は modify-db-cluster
コマンドを実行します。describe-db-engine-versions
コマンドを使用すると、特定の DB エンジンと DB エンジンのバージョンで使用できる CA を検索できます。
2020 年 7 月 28 日以降に、証明書を使用するようにデータベースを作成したか、更新した場合には、アクションは不要です。詳細については、Go GitHub issue #39568
トピック
DB インスタンスまたはクラスターを変更して CA 証明書を更新する
次の例では、CA 証明書を RDS CA-2019 から rds-ca-rsa2048-g1 に更新します。別の証明書を選択できます。詳細については、認証局 をご参照ください。
DB インスタンスまたはクラスターを変更して CA 証明書を更新するには
-
「SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化」の説明に従って、新しい SSL/TLS 証明書をダウンロードします。
-
新しい SSL/TLS 証明書を使用するようにアプリケーションを更新します。
新しい SSL/TLS 証明書のアプリケーションを更新する方法は、特定のアプリケーションにより異なります。アプリケーション開発者と協力して、アプリケーションの SSL/TLS 証明書を更新します。
SSL/TLS 接続の確認および各 DB エンジン用アプリケーションの更新については、以下のトピックを参照してください。
Linux オペレーティングシステムの信頼ストアを更新するサンプルスクリプトについては、「証明書を信頼ストアにインポートするためのサンプルスクリプト」を参照してください。
注記
証明書バンドルには古い CA と新しい CA の両方の証明書が含まれます。そのため、アプリケーションを安全に更新し、移行期間に接続を維持することができます。AWS Database Migration Service を使用してデータベースを DB インスタンスまたはクラスターに移行する場合は、移行中の接続を確保するために証明書バンドルを使用することをお勧めします。
-
DB インスタンスまたはマルチ AZ DB クラスターを変更して、CA を [rds-ca-2019] から [rds-ca-rsa2048-g1] に変更します。CA 証明書を更新するためにデータベースの再起動が必要かどうかを確認するには、describe-db-engine-versions コマンドを使用して、
SupportsCertificateRotationWithoutRestart
フラグをチェックします。重要
証明書の有効期限が切れた後に接続の問題が発生した場合は、コンソールで [すぐに適用] を指定するか、
--apply-immediately
を使用して AWS CLI オプションを指定します。デフォルトで、このオペレーションは次のメンテナンスウィンドウの間に実行するようスケジュールされています。デフォルト RDS CA と異なる インスタンス CA のオーバーライドを設定するには、modify-certificates CLI コマンドを使用します。
DB インスタンスまたはマルチ AZ DB クラスター の CA 証明書を [rds-ca-2019] から [rds-ca-rsa2048-g1] に変更するには、AWS Management Console または AWS CLI を使用できます。
AWS Management Console にサインインし、Amazon RDS コンソール https://console.aws.amazon.com/rds/
を開きます。 -
ナビゲーションペインで、[データベース] を選択して、変更する DB インスタンスまたはマルチ AZ DB クラスターを選択します。
-
Modify を選択します。
-
[接続] セクションで、[rds-ca-rsa2048-g1] を選択します。
-
[Continue] を選択して、変更の概要を確認します。
-
変更をすぐに反映させるには、[Apply immediately] を選択します。
-
確認ページで、変更内容を確認します。適切であれば、[DB インスタンスを変更] または [クラスターを変更] をクリックして変更を保存します。
重要
このオペレーションをスケジュールする場合は、必ずクライアント側の信頼ストアを事前に更新します。
または、[戻る] を選択して変更を編集するか、[キャンセル] を選択して変更をキャンセルします。
DB インスタンスまたはマルチ AZ DB クラスターの CA を AWS CLI を使用して [rds-ca-2019] から [rds-ca-rsa2048-g1] に変更するには、modify-db-instance コマンドまたは modify-db-cluster コマンドを呼び出します。DB インスタンスまたはクラスターの識別子と --ca-certificate-identifier
オプションを指定します。
--apply-immediately
パラメータを使用して、更新を直ちに適用します。デフォルトで、このオペレーションは次のメンテナンスウィンドウの間に実行するようスケジュールされています。
重要
このオペレーションをスケジュールする場合は、必ずクライアント側の信頼ストアを事前に更新します。
DB インスタンス
次の例では、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
オプションを指定できます。
マルチ AZ DB クラスター
次の例では、CA 証明書を rds-ca-rsa2048-g1
に設定して、mydbcluster
を更新します。
Linux、macOS、Unix の場合:
aws rds modify-db-cluster \ --db-cluster-identifier
mydbcluster
\ --ca-certificate-identifier rds-ca-rsa2048-g1
Windows の場合:
aws rds modify-db-cluster ^ --db-cluster-identifier
mydbcluster
^ --ca-certificate-identifier rds-ca-rsa2048-g1
メンテナンスの適用による CA 証明書の更新
メンテナンスを適用して CA 証明書を更新するには、次のステップを実行します。
メンテナンスを適用して CA 証明書を更新するには
AWS Management Console にサインインし、Amazon RDS コンソール https://console.aws.amazon.com/rds/
を開きます。 -
ナビゲーションペインで、[証明書の更新] を選択します。
[証明書の更新が必要なデータベース] ページが表示されます。
注記
このページには、現在の AWS リージョン リージョンでの DB インスタンスとクラスターのみが表示されます。複数の AWS リージョン リージョンに DB インスタンスがある場合は、このページを AWS リージョン リージョンごとに調べ、古い SSL/TLS 証明書を使用している DB インスタンスをすべて確認します。
-
更新する DB インスタンスまたはマルチ AZ DB クラスターを選択します。
[スケジュール] を選択すると、次のメンテナンスウィンドウでの証明書の更新をスケジュールできます。[今すぐ適用] を選択して、直ちに更新を適用します。
重要
証明書の有効期限が切れた後に接続の問題が発生した場合は、[今すぐ適用] オプションを使用します。
-
-
[スケジュール] を選択すると、CA 証明書のローテーションの確認を求められます。このプロンプトには、アップデートのスケジュール期間も記載されています。
-
[今すぐ適用] を選択すると、CA 証明書のローテーションの確認を求められます。
重要
データベースでの CA 証明書の更新をスケジュールする前に、SSL/TLS とサーバー証明書を接続に使用するクライアントアプリケーションを更新します。これらの更新は、DB エンジンに固有です。これらのクライアントアプリケーションを更新したら、CA 証明書の更新を確認できます。
続行するには、チェックボックスをオンにし、[確認] を選択します。
-
-
更新する 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