Amazon Web Services ブログ
AWS Secrets Manager に保存されたシークレットのローテーションウィンドウを設定する方法
本記事は How to configure rotation windows for secrets stored in AWS Secrets Manager を翻訳したものです。
AWS Secrets Manager で、保存されている各シークレットに対してローテーションウィンドウを指定できるようになりました。この機能により、定期的にローテーションを行うベストプラクティスに従いながら、お好みの時間帯を指定することができます。
Secrets Manager を使用すると、データベース認証情報、API キー、およびその他のシークレットに対して、管理・取得・ローテーションをすることが可能です。ローテーションウィンドウ機能では、ローテーションウィンドウを指定することで、クリティカルなビジネスを行っていない時間帯や定期的なメンテナンスの時間帯にシークレットをローテーションすることができます。ローテーションには、AWS が提供する Lambda ローテーション関数、またはカスタムの Lambda ローテーション関数を使用することができます。
以前は、自動ローテーションの設定においてローテーション間隔を日数で指定することのみが可能でした。AWS Secrets Manager は、スケジュールされたローテーション間隔の最後の 24 時間以内にシークレットをローテーションしていました。ベストプラクティスとして、シークレットキャッシュを実装することがありますが、アプリケーションの使用量がピークに達しているときにシークレットをローテーションすると、シークレットキャッシュの更新やシークレット取得の再試行が発生することで、アプリケーションの処理に影響を与える可能性があります。これに対して、カスタムローテーションウィンドウ機能を使用すると、ローテーションを行うタイミングをより柔軟に制御することができます。これにより、Secrets Manager を使用したシークレットのローテーションがより簡単になり、運用もシンプルになります。
Secrets Manager では、ローテーションウィンドウでローテーションの頻度を指定する方法として、よく知られた cron 式と rate 式をサポートしています。このブログ記事では、シークレットをローテーションさせる際にカスタムローテーションウィンドウを指定する 2 つの方法と、既存のシークレットにカスタムローテーションウィンドウを設定する方法について説明します。この記事では、以下の設定について説明します。
- インタラクティブなスケジュール式ビルダーを使用してローテーションウィンドウを設定する
- cron 式を直接指定してローテーションウィンドウを設定する
- 既存のシークレットに対して、カスタムローテーションウィンドウを有効化する
前提条件
このブログ記事で説明する手順を開始する前に、以下の手順を完了する必要があります。
- ローテーション戦略に対応する1人以上のユーザーを作成したうえで、Amazon RDS DB インスタンスを構成します。ローテーション戦略の詳細については、ローテーション戦略を参照してください。
- SecretsManagerReadWrite 権限を持つロールを使用して、AWS マネジメントコンソールにサインインします。
- 以前のブログ記事の手順に従って、Amazon RDS データベースと Secrets Manager に接続するための Lambda 関数を設定します。
ユースケース 1: スケジュール式ビルダーを使用したローテーションウィンドウの設定
このブログ記事では、お客様の組織がアプリケーションのデータベース認証情報を含むシークレットをローテーションするというベストプラクティスに従っていて、負荷の低い時にこれらのシークレットをローテーションすることでアプリケーションのダウンタイムを回避したいと考えていることを想定しています。カスタムローテーション機能を使用すると、平日の指定された時間枠内でローテーションを行うように制限することができます。
対象のアプリケーションの使用量は、UTC の午前 3 時から午前 5 時の間が最も少ないことが分かっており、組織のローテーションポリシーでは、月に 1 回シークレットをローテーションする必要があります。この要件に対応するために、毎月第 2 月曜日の午前 3 時から午前 5 時 (UTC) の間にローテーションウィンドウを指定することができます。
この例では、スケジュール式ビルダーを使用します。これは、一般的なローテーションウィンドウのパターンに基づいてローテーションウィンドウを作成することができるインタラクティブな機能です。そして、あなたに代わってそれを cron 式に変換します。
スケジュール式ビルダーを使用してローテーションウィンドウを設定する方法
- AWS マネジメントコンソールにログインし、RDS インスタンスを起動したリージョンで、Secrets Manager コンソールに移動します。
- 新しいシークレットを保存するを選択します。
- 新しいシークレットを保存するの画面で、Amazon RDS DB インスタンスとの接続に使用する Amazon RDS のデータベース認証情報を入力します。暗号化キーと Amazon RDS DB インスタンスを選択し、次を選択します。
- 任意のシークレット名を入力します。オプションでシークレットの説明を記載したり、タグを作成したり、シークレットにリソースのアクセス許可を追加することができます。オプションで、以前のブログ記事の手順に従って、組織のディザスタリカバリ要件を満たすために、シークレットを別のリージョンに複製することもできます。
- 次を選択します。
- 自動ローテーションをオンにして、シークレットのローテーションを有効にします。
- ローテーションスケジュールで、スケジュール式ビルダーを選択します。
- 時間単位に月を選択し、値として 1 を入力します。
- 開始日は、ドロップダウンメニューから 2 番目を選択し、値フィールドに月曜日を入力します。
- 開始時刻に 3 を入力します。これにより、毎月第 2 月曜日の午前 3 時 (UTC) までローテーションが開始されないようにします。
- ウィンドウ期間フィールドに 2h と入力します。これにより、Secrets Manager はシークレットをローテーションするために 2 時間の時間枠を設けます。ローテーションウィンドウは午前 5 時 (UTC) に終了します。
- この例では、チェックボックスをマークして、シークレットをすぐにローテーションします。セキュリティ上の理由から、手動で入力したパスワードはすぐにローテーションすることをお勧めします。ローテーションの設定をしている時間帯が、アプリケーションの負荷が高い時間帯と重なっている場合は、即時のローテーションをスキップするように選択することができます。最初のローテーションをスキップした場合でも、Secrets Manager はローテーションの設定と権限をテストしますが、実際にシークレットがローテーションされるのは、次に予定されているローテーションウィンドウになります。
- ローテーション関数で、ドロップダウンメニューから Lambda ローテーション関数を選択します。
- 次を選択します。
- シークレットのレビュー画面では、シークレットの概要が表示されます。シークレットを確認し、ローテーションスケジュールセクションまでスクロールダウンします。
- 設定したローテーションスケジュールと次回のローテーション日が要件を満たしていることを確認します。スケジュール式ビルダーに入力された値は、cron 式に変換されます。
- 保存を選択します。
- このシークレットのローテーション構成を表示するには、作成したシークレットを選択します。
- シークレットの詳細画面で、ローテーション構成セクションまでスクロールします。ローテーションステータスは有効、ローテーションスケジュールは cron(0 3 ? 1/1 2#2 *) となっています。Lambda ローテーション関数には、カスタムローテーションに使用する Lambda 関数の ARN が表示されます。
これで、インタラクティブなスケジュール式ビルダーを使用して、ローテーションの要件に合うようにシークレットを保存することに成功しました。このオプションは、cron 式の予備知識は必要なく、簡単に使用することができます。
ユースケース 2 では、より複雑なローテーション間隔を設定するために、スケジュール式を使用して直接 cron 式を入力します。
ユースケース 2: cron 式を使用したカスタムローテーションウィンドウの設定
スケジュール式オプションは、6 つの入力文字列を使用してcron 式を直接入力することができます。cron 式は、スケジュール式ビルダー機能の制約を受けるようなローテーションスケジュールを定義する際に、柔軟性があります。
例えば、組織内に、他のシークレットほど頻繁にローテーションする必要がないシークレットがあるとします。そのため、このシークレットについては、アプリケーションのダウンタイムを避けるために、UTC の午前 1 時から午前 4 時までの負荷の低い時間に、四半期ごとの最終日曜日にローテーションを設定することになりました。要件が複雑なため、このユースケースを実施するためには、スケジュール式オプションを使用して cron ジョブを記述する必要があります。
cron 式は、空白で区切られた次の 6 つの必須フィールドで構成されています。分、時間、日、月、曜日、年です。各必須フィールドは、表1に示すように、構文 cron(fields) を使用して次の値を持ちます。
フィールド | 値 | ワイルドカード |
分 | 0 | |
時間 | 0-23 | |
日 | 1 – 31 | , – * ? / L |
月 | 1-12 or JAN-DEC | , – * / |
曜日 | 1-7 or SUN-SAT | , – * ? L # |
年 | * | accepts * only |
表1: Secrets Manager がサポートする cron 式フィールドと値
ワイルドカード | 説明 |
, | ワイルドカードの , (カンマ) は、追加の値を含みます。月フィールドの JAN,FEB,MAR は 1 月、2 月、3 月を含みます。 |
– | ワイルドカードの – (ダッシュ) は範囲を指定します。日フィールドの場合、1-15 は指定した月の 1 日から 15 日までを含みます。 |
* | ワイルドカードの * (アスタリスク) は、フィールド内のすべての値を含みます。月フィールドの場合、* はすべての月を含みます。 |
/ | ワイルドカードの / (フォワードスラッシュ) は、増分を指定するものです。つまり、1/3 は 1 月、4 月、7 月、10 月を指定します。 |
? | ワイルドカードの ? (クエスチョンマーク) は、任意を意味します。日フィールドに 7 を入力し、7 日が何曜日であってもかまわない場合、曜日フィールドに ? を入力することができます。 |
L | 日フィールドまたは曜日フィールドの L ワイルドカードは、その月または週の最終日を指定します。例えば、日-土の週では、5L と記述すると、その月の最後の木曜日を指定することができます。 |
# | 曜日フィールドの # ワイルドカードは、月の指定された曜日の特定のインスタンスを指定します。例えば、3#2 は、その月の第 2 火曜日を意味します。3 は週の 3 番目の日であるため火曜日を示し、2 はその月のそのタイプの 2 番目の日を示します。 |
表2: cron 式においてサポートされるワイルドカードの説明
ユースケースとして、四半期の最終日曜日の午前 1 時から午前 4 時(UTC)の間にカスタムローテーションウィンドウを設定するためには、次の手順を実行する必要があります。
cron を使用してカスタムローテーションを設定する方法
- Secrets Manager に新しいシークレットを保存するには、ユースケース 1 のステップ 1~6 を実施します。
- 新しいシークレットを保存する画面のスケジュールのローテーションセクションで、自動ローテーションをクリックしてシークレットのローテーションを有効にします。
- ローテーションスケジュールで、スケジュール式を選択します。
- スケジュール式フィールドボックスに、cron(0 1 ? 3/3 1L *) と入力します。以下の表3は、この式の詳細について説明しています。
フィールド 値 説明 分 0 このユースケースには、分についての特定の要件はありません。 時間 1 ローテーションウィンドウが午前1時(UTC)から始まるようにします。 日 ? このユースケースには、月の特定の日にローテーションする要件はありません。 月 3/3 四半期の最終月にローテーションするように設定します。 曜日 1L 毎月の最終日曜日にローテーションを行うようにします。 年 * ローテーションウィンドウのパターンが毎年繰り返されるように設定します。 表3: cron式を使用したローテーション要件の実現
- ローテーション関数セクションで、ドロップダウンメニューから Lambda ローテーション関数を選択します。
- 次を選択します。
- シークレットのレビュー画面で、シークレットを確認し、ローテーションスケジュールのセクションまでスクロールします。設定したローテーションスケジュールと次回のローテーション日が要件を満たしていることを確認します。
- 保存を選択します。
- このシークレットのローテーション構成を表示するには、シークレット画面からそのシークレットを選択します。
- シークレットの詳細画面で、ローテーション構成セクションまでスクロールダウンします。ローテーションステータスは有効、ローテーションスケジュールは cron(0 1 ? 3/3 1L *) となっています。Lambda ローテーション関数には、カスタムローテーションに使用する Lambda 関数の ARN が表示されます。
ユースケース 3: 既存のシークレットに対するカスタムローテーションウィンドウの設定
組織のシークレットを保存しローテーションする方法として、既に AWS Secrets Manager を使用している場合、既存のシークレットに対してカスタムスケジュールのローテーションを実施したいと思うかもしれません。ビジネスニーズを満たすために、シークレットは隔週で、毎週土曜日の午前 12 時から午前 5 時までの間にローテーションする必要があるとします。
カスタムローテーションウィンドウを有効にする方法
- Secrets Manager コンソールのシークレット画面で、ローテーションを設定する既存のシークレットを選択します。
- シークレットの詳細画面でローテーション構成セクションまでスクロールし、ローテーションを編集を選択します。
- ローテーション設定を編集するのポップアップウィンドウで、自動ローテーションをオンにして、シークレットのローテーションを有効にします。
- ローテーションスケジュールでスケジュール式ビルダーを選択します(オプションとして、ユースケース 2 で説明したように、スケジュール式を選択してカスタムローテーションウィンドウを設定することもできます)。
- 時間単位は週を選択し、値は 2 を入力します。
- 曜日は、ドロップダウンメニューから土曜日を選択します。
- 開始時刻には、00 を入力します。これにより、UTC の午前 0 時 00 分までローテーションが開始されないようになります。
- ウィンドウ期間のフィールドに 5h と入力します。これにより、Secrets Manager は 5 時間の枠でシークレットをローテーションさせることになります。
- この例では、チェックボックスをオンにしたまま、すぐにシークレットをローテーションさせるようにします。
- ローテーション関数で、シークレットのローテーションに使用する Lambda 関数を選択します。
- 保存を選択します。
- シークレットの詳細画面で、ローテーション構成セクションまでスクロールダウンします。ローテーションステータスは有効、ローテーションスケジュールは cron(0 00 ? * 7#2,7#4 *) となっており、カスタムローテーションに使用する Lambda 関数の ARN が表示されていることが確認できます。
まとめ
シークレットの定期的なローテーションは Secrets Manager のベストプラクティスであり、コンプライアンス要件 (例えば、PCI DSS では 90 日ごとにアプリケーションのシークレットのローテーションを義務付けている) を満たし、データベースやその他あらゆる種類の認証情報のセキュリティを向上させることに役立ちます。ローテーションウィンドウ機能により、このベストプラクティスを遵守しながら、組織の要件に合ったローテーションウィンドウを柔軟に選択することができます。また、アプリケーションの使用率が低いときに指定したウィンドウでローテーションが行われるため、アプリケーションが継続的にシークレットキャッシュを更新したり、ローテーションされたシークレットを取得する際の再試行を管理したりする必要もなくなります。
このブログ記事では、シークレットを作成する際に、スケジュール式ビルダーとスケジュール式機能の両方を使用して、ローテーションウィンドウを設定する方法を紹介しました。ユースケースでは、cron 式を作成するためのスケジュール式ビルダーオプションから、より具体的な要件を実現するためのスケジュール式の使用まで、組織における異なるローテーション要件を実現するために各機能がどのように使用できるかを示しました。
この機能は、AWS Secrets Manager コンソール、AWS Command Line Interface (AWS CLI)、AWS SDK、または AWS CloudFormation から使い始めることができます。この機能の詳細については、AWS Secrets Manager のドキュメントを参照してください。
このブログ記事についてフィードバックがある場合は、以下のコメント欄でコメントを送信してください。このブログ記事について質問がある場合は、AWS Secrets Manager re:Post で新しいスレッドを立ち上げるか、AWS Support に連絡してください。
AWS Security のニュースをもっと知りたい場合は、Twitter で私たちをフォローしてください。
翻訳は Security Specialist TAM の飯島 卓也が担当しました。原文はこちらです。