Amazon RDS データベースシークレットのローテーションを有効にする - AWS Secrets Manager

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon RDS データベースシークレットのローテーションを有効にする

シークレットのローテーションを有効にして、サポートされている Amazon RDS データベースを使用するにはAWS Secrets Manager コンソール、AWS CLI、または AWS SDK のいずれかです。

警告

ローテーションを有効にした場合は、シークレットを保存するとすぐにシークレットが一度ローテーションされます。ローテーションを有効にする前に、Secrets Manager からシークレットを取得するために、このシークレット認証情報を使用するすべてのアプリケーションを更新してください。初期ローテーション後は、元の認証情報は使用できない場合があります。更新に失敗したアプリケーションは、古い認証情報が無効になるとすぐに中断されます。

前提条件: ローテーションを有効にするためのネットワーク要件

ローテーションを有効にするには、ネットワーク環境を正しく設定する必要があります。

  • Lambda 関数は、データベースと通信できる必要があります。 RDS データベースインスタンスをVPCでは、同じ VPC で実行するように Lambda 関数を設定することをお勧めします。これにより、ローテーション関数とサービス間の直接接続が有効になります。これを設定するには、Lambda 関数の詳細ページで、[ネットワーク] セクションに移動し、[VPCドロップダウンリストから、インスタンスと一致させます。また、インスタンスにアタッチされた EC2 セキュリティグループが、インスタンスと Lambda 間での通信が有効かを確認する必要があります。

  • Lambda 関数は、Secrets Manager サービスエンドポイントと通信できる必要があります。 Lambda ローテーション関数を VPC 内で実行するように設定していないか、またはその VPC に接続 NAT ゲートウェイであれば、を使用できます。Secrets Manager で使用可能なパブリックエンドポイント。あるいは、インターネットに接続されていない VPC で実行されるように Lambda 関数が設定されている場合は、プライベートSecrets Manager サービスエンドポイントで VPC を設定する

サポートされている Amazon RDS データベースシークレットのローテーションを有効化、設定する

以下のいずれかのタブのステップに従ってください。

Using the AWS Management Console
最小限必要なアクセス権限

コンソールでローテーションを有効にして設定するには、次の管理ポリシーで提供されるアクセス権限が必要です。

  • SecretsManagerReadWrite— Secrets Manager、Lambda、AWS CloudFormation のすべてのアクセス許可を提供します。

  • IAMFullAccess— ロールを作成し、そのロールにアクセス権限ポリシーをアタッチするために必要な IAM アクセス権限を提供します。

  1. AWS Secrets Manager コンソール (https://console.aws.amazon.com/secretsmanager/

  2. ローテーションを有効化するシークレットの名前を選択します。

  3. [Configure automatic rotation(自動ローテーションの設定)] セクションで、[Enable automatic rotation(自動ローテーションを有効化する)] を選択します。 これにより、このセクションの他のコントロールが有効になります。

  4. を使用する場合ローテーション間隔を選択[] で、事前定義された値の 1 つを選択するか、[Custom] を選択し、ローテーション間の日数を入力します。コンプライアンス要件を満たすためにシークレットを更新する場合、この値をコンプライアンスに義務付けられた間隔から 1 日を引いた値に設定することをお勧めします。

    Secrets Manager は、前のローテーションが完了したときに次のローテーションをスケジュールします。Secrets Manager は、最後のローテーションの実際の日付にローテーションの間隔 (日数) を追加して、日付をスケジュールします。サービスは、その 24 時間の日付の枠内で時間をランダムに選択します。分もいくらかランダムに選択されますが、正時に向かって重み付けされ、負荷を分散させるのに役立つさまざまな要素に影響されます。

    注記

    Secrets Manager で提供されるLambda 関数を使用して 2 人のユーザーを切り替える場合は、コンソールはこのテンプレートを使用します。次のステップで 2 番目の「マスターシークレット」オプションを選択した場合、ローテーション期間をコンプライアンスで指定された最小期間の半分に設定します。Secrets Manager は、1 つの追加のローテーションサイクルで、アクティブに使用されていない場合、古い認証情報を利用できます。Secrets Manager は、2 回目のローテーション後に新しいパスワードでユーザーを更新した後にのみ、古い認証情報を無効にします。

    ローテーション関数を変更し、新しいシークレットがアクティブになったら直ちに古い認証情報を無効にする場合は、コンプライアンスで義務付けられた最小値までローテーション間隔を延長できます。AWSPREVIOUS ステージングラベルを使用し、1 つの追加のサイクルについて古い認証情報をアクティブなままにすると、高速復旧に使用できる最後の既知の正常な認証情報のセットが提供されます。エラーが発生して現在の認証情報が中断された場合、AWSCURRENT ステージングラベルを AWSPREVIOUS ラベルがあるバージョンに簡単に移動できます。これで、顧客は再度リソースにアクセスできます。詳細については、「既存の 2 人のユーザーを切り替えることで AWS Secrets Manager シークレットを更新する」を参照してください。

  5. 次のいずれかのオプションを選択します。

    • 新しい Lambda ローテーション関数を作成する

      1. [新しい Lambda 関数を作成してローテーションを実行する] を選択します。

      2. を使用する場合Lambda 関数の名前に、Secrets Manager によって作成される Lambda 関数に割り当てる名前を入力します。

      3. このローテーション関数で使用できる認証情報を使用してシークレットを指定します。認証情報には、保護されたデータベースでユーザー名とパスワードを更新するためのアクセス許可が含まれている必要があります。

        • このシークレットを使用する: このシークレットの認証情報にデータベース内でパスワードを変更するアクセス許可がある場合は、このオプションを選択します。このオプションを選択すると、Secrets Manager は 1 人のユーザーでシークレットをローテーションし、ローテーションごとにパスワードを変更します。

          Considerations

          Secrets Manager は、このオプションを「低可用性」オプションとして提供します。ログインの失敗は、ローテーションによって古いパスワードが削除されてから、更新されたパスワードがシークレットの新しいバージョンとしてアクセス可能になるまでの間に発生する可能性があります。この時間枠は、非常に短く、1 秒以下です。このオプションを選択した場合は、クライアントアプリケーションが、コード内で適切な「バックオフとジッターで再試行」戦略を実装していることを確認してください。サインインが長時間にわたって何度か失敗した場合にのみ、アプリケーションがエラーを生成します。

        • AWS Secrets Manager] (AWS シークレットマネージャーで以前に保存したシークレットを使用): 現在のシークレットの認証情報に認証情報を更新するアクセス許可がない場合、またはシークレットの高可用性が必要な場合は、このオプションを選択します。このオプションを選択するには、このシークレットの認証情報を更新するアクセス許可を持つ認証情報がある別のマスターシークレットを作成する必要があります。次に、リストからマスターシークレットを選択します。

          このオプションを選択すると、Secrets Manager は、ローテーションごとに新しいユーザーとパスワードを作成し、古いユーザーを非推奨にすることによってシークレットを更新する Lambda 関数を作成します。

          Considerations

          Secrets Manager は、このオプションを「高可用性」オプションとして提供します。これは、新しいバージョンの準備とテスト中に、古いバージョンのシークレットが引き続き動作し、サービスリクエストを処理するためです。Secrets Manager は、クライアントが新しいバージョンに切り替えるまで古いバージョンを非推奨にしません。このため、バージョン間の変更中にダウンタイムが発生しません。

          このオプションを使用するには、Lambda 関数を使用して、元のユーザーのアクセス権限を複製し、新しいユーザーに適用する必要があります。すると、この関数は、ローテーションごとに二人のユーザーを交互に切り替えます。

          ユーザーに付与されたアクセス許可を変更する必要がある場合は、両方のユーザーのアクセス許可を変更するようにしてください。

    • 別のシークレット用にすでに作成済みの Lambda 関数を使用する

      1. 選択既存の Lambda 関数を使用してローテーションを実行する

      2. ドロップダウンリストから Lambda 関数を選択します。

      3. ローテーション関数のタイプを指定します。

        • シングルユーザー回転: パスワードを変更するアクセス許可があるユーザーの認証情報を保存するシークレットで使用するローテーション関数。Secrets Manager は、このオプションを選択すると、これが関数のタイプを作成します。このシークレットを使用する

        • マルチユーザー回転: パスワードを変更できないユーザーの認証情報を保存するシークレットで使用するローテーション関数。この関数には、このシークレットのユーザーの認証情報を変更するアクセス許可を持つユーザーの認証情報を格納する別のマスターシークレットが必要です。Secrets Manager は、オプションを選択すると、このタイプの関数を作成します。AWS Secrets Manager] (AWS シークレットマネージャーで以前に保存したシークレットを使用)

      4. 2 番目の「マスターシークレット」オプションを指定した場合は、マスターユーザーの認証情報を提供するシークレットも選択する必要があります。マスターシークレットの認証情報には、このシークレットに保存されている認証情報を更新するアクセス許可が必要です。

  6. [保存] を選択して、変更を保存するシークレットキーの初回の更新がトリガーされるようにします。

シークレットに割り当てられた Lambda 関数の ARN がない場合、Secrets Manager はその関数を作成し、必要なすべてのアクセス権限を割り当て、関数がデータベースで動作するように構成します。Secrets Manager は、ローテーション間隔で指定された日数をカウントダウンします。間隔がゼロに達すると、Secrets Manager はシークレットを再びローテーションし、次のサイクルの間隔をリセットします。このローテーションを無効にするまで継続されます。

Using the AWS CLI or SDK Operations
最小限必要なアクセス権限

コンソールでローテーションを有効にして設定するには、次の管理ポリシーで提供されるアクセス権限を持っている必要があります。

  • SecretsManagerReadWrite— Secrets Manager、Lambda、AWS CloudFormation のすべてのアクセス許可を提供します。

  • IAMFullAccess— ロールを作成し、そのロールにアクセス権限ポリシーをアタッチするために必要な IAM アクセス権限を提供します。

次の Secrets Manager コマンドを使用して、サポートされている Amazon RDS データベースの既存のシークレットのローテーションを設定できます。

また、AWS CloudFormation と AWS Lambda のコマンドも使用する必要があります。次のコマンドの詳細については、各サービスのドキュメントを参照してください。

重要

ローテーション関数は、このシークレットを使用して回転関数によってシークレットで使用されるシークレット値の正確な形式を決定します。各回転関数でシークレット値に必要なものの詳細については、想定されるSecretString 値エントリを、関連する回転関数の下にLambda ローテーション関数の作成に使用できる AWS テンプレート

AWS Serverless Application Repository テンプレートを使用した Lambda ローテーション関数の作成

コンソールベースのローテーション設定と同等なものを実行する AWS CLI セッションの以下の例は、AWS マネジメントコンソールの使用タブ。AWS CloudFormation 変更セットを使用して関数を作成します。次に、作成される関数を必要なアクセス許可で設定します。最後に、完成した関数の ARN でシークレットを設定し、1 回更新してテストします。

次の例では汎用テンプレートを使用するため、テンプレートは先に示した最後の ARN を使用します。

最初のコマンドは、Secrets Manager から提供されたテンプレートに基づいて設定された AWS CloudFormation 変更セットをセットアップします。

データベースまたはサービスが Amazon VPC で提供される VPC に存在する場合、その VPC と通信するように関数を設定する、次の 4 番目のコマンドを含める必要があります。VPC がない場合は、コマンドをスキップできます。

また、VPC にパブリックインターネットへのアクセスがない場合、Secrets Manager のプライベートサービスエンドポイントを使用して VPC を設定する必要があります。次のコマンドの 5 番目がそれを行います。

使用するテンプレートを指定するには、--application-id パラメータを使用します。この値は、テンプレートの ARN です。AWS とその ARN で提供されるテンプレートのリストについては、「Lambda ローテーション関数の作成に使用できる AWS テンプレート 」を参照してください。

また、このテンプレートには、次に示す例のように、--parameter-overrides で指定される追加のパラメータも必要です。ローテーションテンプレートには、ローテーション関数の作成に影響するテンプレートに、名前と値のペアとして 2 つの情報を送信するパラメータが必要です。

  • エンドポイント— ローテーション関数でクエリを実行するサービスエンドポイントの URL。通常、この名前は https://secretsmanager.region.amazonaws.com です。

  • 関数名— このプロセスによって作成され、完成した Lambda ローテーション関数の名前です。

$ aws serverlessrepo create-cloud-formation-change-set \ --application-id arn:aws:serverlessrepo:us-east-1:297356227824:applications/SecretsManagerRotationTemplate \ --parameter-overrides '[{"Name":"endpoint","Value":"https://secretsmanager.region.amazonaws.com"},{"Name":"functionName","Value":"MyLambdaRotationFunction"}]' \ --stack-name MyLambdaCreationStack { "ApplicationId": "arn:aws:serverlessrepo:us-west-2:297356227824:applications/SecretsManagerRDSMySQLRotationSingleUser", "ChangeSetId": "arn:aws:cloudformation:us-west-2:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE", "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/aws-serverless-repository-MyLambdaCreationStack/EXAMPLE3-90ab-cdef-fedc-ba987EXAMPLE" }

次のコマンドは、先ほど作成した変更セットを実行します。change-set-name パラメータは、前のコマンドの ChangeSetId 出力から得られます。このコマンドでは何も出力されません。

$ aws cloudformation execute-change-set --change-set-name arn:aws:cloudformation:us-west-2:123456789012:changeSet/EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE/EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE

次のコマンドは、関数を呼び出すアクセス許可を Secrets Manager サービスに付与します。出力は、ロールの信頼ポリシーに追加されたアクセス許可を示します。

$ aws lambda add-permission \ --function-name MyLambdaRotationFunction \ --principal secretsmanager.amazonaws.com \ --action lambda:InvokeFunction \ --statement-id SecretsManagerAccess { "Statement": "{\"Sid\":\"SecretsManagerAccess\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"secretsmanager.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-west-2:123456789012:function:MyLambdaRotationFunction\"}" }

Secrets Manager では、VPC でデータベースを実行する場合のみ、次のコマンドが必要です。VPC でデータベースを実行しない場合は、このコマンドをスキップします。Amazon RDS コンソールまたは Amazon RDS コンソールのいずれかを使用して、Amazon RDS DB インスタンスの VPC 情報を調べます。aws rds describe-instancesCLI コマンド。続いて、次のコマンドに情報を追加して実行します。

$ aws lambda update-function-configuration \ --function-name arn:aws:lambda:us-west-2:123456789012:function:MyLambdaRotationFunction \ --vpc-config SubnetIds=<COMMA SEPARATED LIST OF VPC SUBNET IDS>,SecurityGroupIds=<COMMA SEPARATED LIST OF SECURITY GROUP IDs>

データベースインスタンスを持つ VPC および Lambda ローテーション関数がインターネットアクセスを持たない場合、Secrets Manager のプライベートサービスエンドポイントを持つ VPC を設定する必要があります。これにより、ローテーション関数は VPC 内のエンドポイントで Secrets Manager にアクセスできます。

$ aws ec2 create-vpc-endpoint --vpc-id <VPC ID> / --vpc-endpoint-type Interface / --service-name com.amazonaws.<region>.secretsmanager / --subnet-ids <COMMA SEPARATED LIST OF VPC SUBNET IDS> / --security-group-ids <COMMA SEPARATED LIST OF SECURITY GROUP IDs> / --private-dns-enabled

マスターシークレットを必要とするテンプレートを使用して関数を作成した場合は、次のステートメントを関数のロールポリシーに追加する必要があります。これによりマスターシークレットのシークレット値を取得するローテーション関数にアクセス許可を付与します。詳細な手順については、「別のマスターシークレットにアクセスするためのローテーション関数権限の付与」を参照してください。

{ "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:region:123456789012:secret:MyDatabaseMasterSecret", "Effect": "Allow" },

最後に、シークレットにローテーション設定を適用し、最初のローテーションを実行します。

$ aws secretsmanager rotate-secret \ --secret-id production/MyAwesomeAppSecret \ --rotation-lambda-arn arn:aws:lambda:us-west-2:123456789012:function:aws-serverless-repository-SecretsManagerRDSMySQLRo-10WGBDAXQ6ZEH \ --rotation-rules AutomaticallyAfterDays=7

サポートされている Amazon RDS データベースの Lambda ローテーション関数を独自に作成する場合は、SecretsManagerRotationTemplateAWS CloudFormation テンプレート。Secrets Manager は、ほとんどのアクセス許可と構成設定のセットアップを行います。