Amazon RDS、Amazon Aurora、Amazon DocumentDB、Amazon Redshift のシークレットで自動ローテーションを設定にする - AWS Secrets Manager

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

Amazon RDS、Amazon Aurora、Amazon DocumentDB、Amazon Redshift のシークレットで自動ローテーションを設定にする

このチュートリアルでは、データベースシークレットに Lambda 関数によるローテーション を設定する方法について説明します。ローテーションとは、シークレットを定期的に更新するためのプロセスのことです。シークレットのローテーションを行うと、シークレットとデータベースの両方で認証情報が更新されます。Secrets Manager では、データベースシークレットの自動ローテーションを設定できます。

コンソールを使用してローテーションを設定するには、まずローテーション戦略を選択する必要があります。次に、ローテーションのシークレットを設定します。これにより、もしまだ未作成の場合は Lambda ローテーション関数が作成されます。コンソールは Lambda 関数実行ロールのアクセス権限も設定します。最後のステップとして、Lambda ローテーション関数が Secrets Manager とデータベースの両方にネットワーク経由でアクセスできることを確認する必要があります。

警告

自動ローテーションを有効にするには、Lambda ローテーション関数用に IAM 実行ロールを作成し、そのロールにアクセス権限ポリシーをアタッチするアクセス許可が必要です。iam:CreateRole 許可と iam:AttachRolePolicy 許可の両方が必要です。これらのアクセス許可を付与すると、アイデンティティは自身に任意の許可を付与できるようになります。

ステップ 1: ローテーション戦略を選択し、オプションでスーパーユーザーシークレットを作成する

Secrets Manager が提供する戦略の詳細については、「Lambda 関数のローテーション戦略」を参照してください。

交代ユーザー戦略を選択する場合は、シークレットを作成する して、データベースのスーパーユーザーの認証情報をそこに保存する必要があります。ローテーションでは最初のユーザーのクローンが作成されますが、ほとんどのユーザーにはその権限がないため、スーパーユーザーの認証情報を含むシークレットが必要です。Amazon RDS Proxy は、ユーザー交代戦略をサポートしていないことに注意してください。

ステップ 2: ローテーションの設定とローテーション関数の作成

Amazon RDS、Amazon DocumentDB、または Amazon Redshift のシークレットでローテーションを有効にするには
  1. Secrets Manager コンソール (https://console.aws.amazon.com/secretsmanager/) を開きます。

  2. [Secrets] (シークレット) ページで、自分のシークレットを選択します。

  3. シークレットの詳細ページで、[Rotation configuration] (ローテーション設定) セクションの [Edit rotation] (ローテーションの編集) を選択します。

  4. [Edit rotation configuration] (ローテーション設定の編集) ダイアログボックスで、次の操作を行います。

    1. [Automatic rotation] (自動ローテーション) を有効化します。

    2. [Rotation schedule] (ローテーションスケジュール) において、UTC タイムゾーンで [Schedule expression builder] (スケジュール式ビルダー) にスケジュールを入力するか、[Schedule expression] (スケジュール式) としてスケジュールを入力します。Secrets Manager は、スケジュールを rate() 式または cron() 式として保存します。[Start time] (開始時刻) を指定しない限り、ローテーションウィンドウは午前 0 時に自動的に開始されます。シークレットが 4 時間ごとにローテーションされるように設定できます。詳細については、「ローテーションスケジュール」を参照してください。

    3. (オプション) [Window duration] (ウィンドウ期間) では、Secrets Manager がシークレットをローテーションするウィンドウの長さを選択します (3 時間のウィンドウの場合は 3h など)。ウィンドウが次のローテーションウィンドウに重ならないようにしてください。時間単位のローテーションスケジュールでは、ウィンドウ期間を指定しない場合、ウィンドウは 1 時間後に自動的に終了します。日数単位のローテーションスケジュールの場合、ウィンドウは 1 日の終わりに自動的に終了します。

    4. (オプション) 変更を保存したときにシークレットをローテーションするには、[Rotate immediately when the secret is stored] (シークレットが保存されたときにすぐにローテーションする) を選択します。チェックボックスをオフにすると、最初のローテーションは設定したスケジュールから開始されます。

      手順 3 と 4 がまだ完了していないなどの理由でローテーションが失敗した場合、Secrets Manager はローテーションプロセスを複数回再試行します。

    5. [Rotation function] (ローテーション関数) で、次のいずれかを行います。

      • [Create a new Lambda function] (新しい Lambda 関数の作成) を選択し、新しい関数の名前を 1 つ入力します。Secrets Manager は、関数名の先頭に「SecretsManager」を追加します。Secrets Manager は適切なテンプレートに基づいて関数を作成し、Lambda 実行ロールに必要なアクセス権限を設定します。

      • [Use an existing Lambda function] (既存の Lambda 関数を使用する) を選択して、別のシークレットに使用したローテーション関数を再利用します。推奨 VPC 設定に記載されているローテーション関数は、データベースと同じ VPC とセキュリティグループを持つため、関数がデータベースにアクセスしやすくなっています。

    6. [ローテーション戦略] では、[単一ユーザー] または [代替ユーザー] 戦略を選択します。詳細については、「ステップ 1: ローテーション戦略を選択し、オプションでスーパーユーザーシークレットを作成する」を参照してください。

  5. [Save] を選択します。

ステップ 3: (オプション) ローテーション関数に追加のアクセス許可条件を設定する

ローテーション関数のリソースポリシーには、Lambda が混乱した代理プログラムとして使用されることを防ぐために、コンテキストキー「aws:SourceAccount」を含めることを推奨します。AWS はいくつかの AWS サービスにおいて、混乱した代理プログラムの問題を避けるために、「aws:SourceArn」と「aws:SourceAccount」のグローバルコンテキストキーを両方使用することを推奨しています。ただし、ローテーション関数のポリシーに aws:SourceArn の条件を含めると、その ARN で指定されたシークレットだけをローテーションさせるためにローテーション関数を使用することができます。コンテキストキーのみを含めることをお勧めしますaws:SourceAccount複数のシークレットに対して回転関数を使用できるようにする。

ローテーション関数のリソースポリシーを更新するには
  1. Secrets Manager のコンソールでシークレットを選択し、詳細ページの [Rotation configuration] (ローテーション設定) で、Lambda ローテーション関数を選択します。Lambda コンソールが開きます。

  2. Lambda のリソースベースのポリシーを使用する」 の指示に従って aws:sourceAccount の条件を追加します。

    "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" } },

AWS マネージドキー aws/secretsmanager 以外の KMS キーを使用しシークレットを暗号化する場合、Secrets Manager は Lambda の実行ロールに対し、そのキーの使用に関するアクセス許可を付与します。SecretArn 暗号化コンテキストを使用して復号化関数の使用を制限できます。この場合、ローテーション関数ロールには、ローテーションに使用するシークレットを復号化するアクセスのみが許可されます。

ローテーション関数の実行ロールを更新するには
  1. Lambda ローテーション関数で [設定] を選択し、次に [実行ロール] で [ロール名] を選択します。

  2. ロールのアクセス許可ポリシーの変更」の指示に従って、kms:EncryptionContext:SecretARN 条件を追加します。

    "Condition": { "StringEquals": { "kms:EncryptionContext:SecretARN": "SecretARN" } },

ステップ 4: ローテーション関数用のネットワークアクセスを設定する

詳細については、「Lambda ローテーション関数へのネットワークアクセス」を参照してください。

次のステップ

AWS Secrets Manager におけるローテーションのトラブルシューティング」を参照してください。