翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Lambda ローテーション関数
ではLambda 関数によるローテーション、Lambda 関数がシークレットをローテーションする作業を行います。ローテーション中、Secrets Manager はステージングラベルを使用して、シークレットのバージョンにラベル付けを行います。
Secrets Manager がシークレットのタイプにローテーション関数テンプレートを提供していない場合は、ローテーション関数を作成できます。ローテーション関数を作成するときは、各ステップのガイダンスに従ってください。
独自のローテーション関数を記述するためのヒント
-
汎用ローテーションテンプレートを開始点として使用して、独自のローテーション関数を記述します。
-
関数を記述する場合、デバッグステートメントまたはロギングステートメントの記述に細心の注意を払ってください。これらのステートメントにより、関数内の情報が Amazon に書き込まれる可能性があるため CloudWatch、開発中に収集された機密情報がログに含まれていないことを確認する必要があります。
ログステートメントの例については、AWS Secrets Manager ローテーション関数テンプレート のソースコードを参照してください。
-
セキュリティ上の理由から、Secrets Manager では、Lambda ローテーション関数が直接シークレットをローテーションすることのみを許可しています。ローテーション関数では、2 つ目の Lambda 関数を呼び出してシークレットをローテーションすることはできません。
-
デバッグの提案については、「サーバーレスアプリケーションのテストとデバッグ」を参照してください。
-
例えば、外部バイナリとライブラリを使用してリソースに接続する場合は、パッチ適用を管理し、 を維持する必要があります up-to-date。
-
ローテーション関数は、必要な依存関係と共に ZIP ファイル [
my-function.zip
] に保存します。
ローテーション関数の 4 つのステップ
トピック
create_secret
: シークレットの新しいバージョンを作成する
メソッドはcreate_secret
まず、渡された get_secret_value
ClientRequestToken
。シークレットがない場合は、 create_secret
VersionId
。次に、 を使用して新しいシークレット値を生成しますget_random_password
put_secret_value
。新しいシークレット値を AWSPENDING
に格納することで、冪等性を確保することができます。何らかの理由でローテーションが失敗した場合は、その後の呼び出しでそのシークレット値を参照できます。詳細については、「Lambda 関数を冪等にするにはどうすればよいですか?AWSPENDING
独自のローテーション関数を記述するためのヒント
新しいシークレット値に、データベースまたはサービスに有効な文字のみが含まれていることを確認します。
ExcludeCharacters
のパラメータを使用して文字を除外します。関数をテストするときは、 を使用してバージョンステージを確認します。 AWS CLI を呼び出し
describe-secret
て を確認しますVersionIdsToStages
。-
Amazon RDS MySQL の場合、交代ユーザーのローテーションでは、Secrets Manager は 16 文字以下の名前でクローンされたユーザーを作成します。ローテーション関数を変更して、長いユーザー名を許可することができます。MySQL バージョン 5.7 以降では最大 32 文字のユーザー名がサポートされていますが、Secrets Manager ではユーザー名の末尾に「_clone」(6 文字) が追加されるため、ユーザー名は最大 26 文字にする必要があります。
set_secret
: データベースまたはサービスの認証情報を変更する
メソッドは、シークレットAWSPENDING
のバージョンの新しいシークレット値と一致するように、データベースまたはサービスの認証情報set_secret
を変更します。
独自のローテーション関数を記述するためのヒント
-
データベースなどのステートメントを解釈するサービスにステートメントを渡す場合は、クエリパラメータ化を使用します。詳細については、OWASP ウェブサイトの「Query Parameterization Cheat Sheet
」を参照してください。 -
ローテーション機能は、Secrets Manager のシークレットとターゲットリソースの両方にある顧客認証情報にアクセスして変更する権限を持つ特権的な代理プログラムです。混乱した代理攻撃を防ぐには、攻撃者がこの関数を使用して他のリソースにアクセスできないようにする必要があります。認証情報を更新する前に:
シークレットの
AWSCURRENT
バージョンの認証情報が有効であることを確認してください。AWSCURRENT
の認証情報が有効でない場合は、ローテーションの試行を中止してください。AWSCURRENT
とAWSPENDING
のシークレット値が同じリソース用であることを確認してください。ユーザー名とパスワードについては、AWSCURRENT
とAWSPENDING
のユーザー名が同じであることを確認してください。送信先のサービスリソースが同じであることを確認してください。データベースの場合、
AWSCURRENT
とAWSPENDING
のホスト名が同じであることを確認してください。
-
まれに、データベースの既存のローテーション関数をカスタマイズすることもできます。例えば、交代ユーザーローテーションの場合、Secrets Manager は最初のユーザーのランタイム設定パラメータ
をコピーしてクローンユーザーを作成します。さらに属性を追加したり、クローンユーザーに付与する属性を変更したりする場合は、 set_secret
関数のコードを更新する必要があります。
test_secret
: 新しいシークレットバージョンをテストする
次に、Lambda ローテーション関数は、データベースまたはサービスにアクセスすることで、シークレットの AWSPENDING
バージョンをテストします。ローテーション関数のテンプレート に基づくローテーション関数では、読み取りアクセスを使用して、新しいシークレットをテストします。
finish_secret
: ローテーションを完了する
最後に、Lambda ローテーション関数はラベル AWSCURRENT
を以前のシークレットバージョンからこのバージョンに移動します。これにより、同じ API コール内の AWSPENDING
ラベルも削除されます。Secrets Manager は、以前のバージョンに対しステージングラベル AWSPREVIOUS
を付加します。これにより、シークレットの最後の有効なバージョンが保持されます。
メソッドは finish_secret
を使用してupdate_secret_version_stage
AWSCURRENT
から新しいシークレットバージョンに移動します。Secrets Manager は、以前のバージョンに対しステージングラベル AWSPREVIOUS
を自動的に付加します。これにより、シークレットの最後の有効なバージョンが保持されます。
独自のローテーション関数を記述するためのヒント
この時点より
AWSPENDING
前に を削除しないでください。また、別の API コールを使用して削除しないでください。これは、ローテーションが正常に完了しなかったことを Secrets Manager に示す可能性があるためです。Secrets Manager は、以前のバージョンに対しステージングラベルAWSPREVIOUS
を付加します。これにより、シークレットの最後の有効なバージョンが保持されます。
ローテーションが成功すると、AWSPENDING
ステージングラベルは AWSCURRENT
バージョンと同じバージョンにアタッチされるか、どのバージョンにもアタッチされない可能性があります。AWSPENDING
ステージングラベルは存在するが、AWSCURRENT
と同じバージョンにアタッチされていない場合、それ以降に呼び出されたローテーションでは、以前のローテーションリクエストがまだ進行中であるとみなされ、エラーが返されます。ローテーションに失敗すると、AWSPENDING
ステージングラベルはバージョンが空のシークレットにアタッチされる可能性があります。詳細については、「 におけるローテーションのトラブルシューティング」を参照してください。