非データベースの AWS Secrets Manager シークレットの自動ローテーションを設定する - AWS Secrets Manager

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

非データベースの AWS Secrets Manager シークレットの自動ローテーションを設定する

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

データベースシークレットについては、「データベースシークレットの自動ローテーション (コンソール)」を参照してください。

警告

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

ステップ 1: 汎用ローテーション関数を作成する

最初に、Lambda ローテーション関数を作成します。シークレットをローテーションするためのコードが含まれないため、後のステップで記述します。ローテーション関数の機能の詳細については、「Lambda ローテーション関数」を参照してください。

サポートされているリージョンでは、AWS Serverless Application Repository を使用してテンプレートから関数を作成できます。サポートされているリージョンの一覧は、「AWS Serverless Application Repository FAQs」を参照してください。他のリージョンでは、関数を最初から作成し、テンプレートコードを関数にコピーします。

汎用ローテーション関数を作成するには
  1. リージョンで AWS Serverless Application Repository がサポートされているかどうかを確認するには、「AWS General Reference」の「AWS Serverless Application Repository endpoints and quotas」を参照してください。

  2. 次のいずれかを行います。

    • AWS Serverless Application Repository がリージョンでサポートされている場合:

      1. Lambda コンソールで、[アプリケーション][アプリケーション作成] の順に選択します。

      2. [アプリケーションの作成] ページで、[サーバーレスアプリケーション] タブを選択します。

      3. [パブリックアプリケーション] の検索ボックスに、「SecretsManagerRotationTemplate」と入力します。

      4. [カスタム IAM ロールまたはリソースポリシーを作成するアプリを表示する] を選択します。

      5. SecretsManagerRotationTemplate」タイルを選択します。

      6. [確認、設定、デプロイ] ページの [アプリケーション設定] タイルで、必須フィールドに入力します。

        • [エンドポイント] には、https:// を含むリージョンのエンドポイントを入力します。; エンドポイントのリストについては、「AWS Secrets Manager エンドポイント」を参照してください。

        • Lambda 関数を VPC に配置するには、[vpcSecurityGroupIds][vpcSubnetIds] を含めます。

      7. [デプロイ] を選択します。

    • AWS Serverless Application Repository があなたのリージョンでサポートされていない場合:

      1. Lambda コンソールから、[関数][関数の作成] の順に選択します。

      2. [関数の作成] ページで、次の操作を実行します。

        1. Author from scratch (製作者を最初から) を選択します。

        2. [Function name] (関数名) には、関数の名前を入力します。

        3. [Runtime] (ランタイム) では、[Python 3.9] を選択します。

        4. [Create function (関数の作成)] を選択します。

ステップ 2: ローテーション関数コードを記述する

このステップでは、シークレットを更新するコードと、シークレットの対象となるサービスまたはデータベースを記述します。独自のローテーション関数を記述するためのヒントなど、ローテーション関数の動作については、「Lambda ローテーション関数」を参照してください。次の ローテーション関数のテンプレート をリファレンスとして使用できます。

ステップ 3: シークレットのローテーションを設定する

このステップでは、シークレットのローテーションスケジュールを設定し、ローテーション関数をシークレットに接続します。

ローテーションを設定して空のローテーション関数を作成するには
  1. Secrets Manager コンソール (https://console.aws.amazon.com/secretsmanager/) を開きます。

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

  3. シークレットの詳細ページで、[Rotation configuration] (ローテーション設定) セクションの [Edit rotation] (ローテーションの編集) を選択します。[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] (シークレットが保存されたときにすぐにローテーションする) を選択します。チェックボックスをオフにすると、最初のローテーションは設定したスケジュールから開始されます。

    5. [ローテーション関数] で、ステップ 1 で作成した [Lambda 関数] を選択します。

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

ステップ 4: ローテーション関数が Secrets Manager とデータベースまたはサービスにアクセスすることを許可する

Lambda ローテーション関数には、Secrets Manager のシークレットにアクセスする権限と、データベースまたはサービスにアクセスする権限が必要です。このステップでは、これらのアクセス権限を Lambda 実行ロールに付与します。AWS マネージドキー aws/secretsmanager 以外の KMS キーを使用しシークレットを暗号化する場合は、そのキーの使用に関するアクセス許可を、Lambda の実行ロールに付与する必要があります。SecretArn 暗号化コンテキストを使用して復号化関数の使用を制限できます。この場合、ローテーション関数ロールには、ローテーションに使用するシークレットを復号化するアクセスのみが許可されます。IAM ポリシーの例については、「ローテーションへのアクセス許可」を参照してください。

手順については、AWS Lambda 開発者ガイドの「Lambda 実行ロール」を参照してください。

ステップ 5: Secrets Manager がローテーション関数を呼び出すことを許可する

Secrets Manager が設定したローテーションスケジュールで、ローテーション関数を呼び出すことができるようにするには、Lambda 関数のリソースポリシーで Secrets Manager サービスプリンシパルに lambda:InvokeFunction アクセス許可を付与する必要があります。

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

Lambda 関数にリソースポリシーをアタッチするには、「リソースベースのポリシーを使用する」を参照してください。

以下のポリシーによって、Secrets Manager は Lambda 関数を呼び出すことが可能になります。

{ "Version": "2012-10-17", "Id": "default", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "secretsmanager.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Condition": { "StringEquals": { "AWS:SourceAccount": "123456789012" } }, "Resource": "LambdaRotationFunctionARN" } ] }

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

このステップでは、ローテーション関数が Secrets Manager とそのシークレットの対象となるサービスまたはデータベースの両方に接続できるようにします。シークレットをローテーションするために、ローテーション関数が両方にアクセスできる必要があります。「Lambda ローテーション関数へのネットワークアクセス」を参照してください。

次のステップ

ステップ 3 でローテーションを設定する際に、シークレットをローテーションするスケジュールを設定します。スケジュール時にローテーションが失敗した場合、Secrets Manager はローテーションを複数回試行します。また、すぐにシークレットをローテーションする の手順に従って、直ちにローテーションを開始することもできます。

ローテーションが失敗した場合は、「ローテーションのトラブルシューティング」を参照してください。