Secrets Manager の定期的なシークレットのローテーション設定について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、SecurityHubで検出される「[SecretsManager.4] Secrets Manager のシークレットは、指定された日数以内にローテーションする必要があります」について解説します。

ポリシーの説明
[SecretsManager.4] Secrets Manager のシークレットは、指定された日数以内にローテーションする必要があります
Secrets Manager の Security Hub コントロール – AWS Security Hub
このコントロールは、AWS Secrets Manager が指定された期間内に少なくとも 1 回ローテーションされているかどうかを確認します。シークレットを少なくともこの頻度でローテーションしないと、コントロールは失敗します。ローテーション期間に対してカスタムパラメータ値を指定しない限り、Security Hub はデフォルト値の 90 日を使用します。
リスク: AWS Secrets Managerに保存されているデータベース認証情報、APIキー、パスワードなどのシークレットが、組織で定められた期間内にローテーションされていない場合、以下のようなセキュリティリスクが高まります。
- 侵害リスクの増大: シークレットが長期間変更されない場合、その間に漏洩したり、不正アクセスによって取得されたりするリスクが高まります。特に、システムやアプリケーションの脆弱性を悪用された場合、古いシークレットが長期間悪用される可能性があります。
- インシデント発生時の影響範囲の拡大: 万が一シークレットが侵害された場合、ローテーションされていない古いシークレットは、より広範囲のシステムやリソースへの不正アクセスを許してしまう可能性があります。
- 監査とコンプライアンスへの非準拠: 多くのセキュリティ基準やコンプライアンス要件では、定期的なシークレットのローテーションが義務付けられています。ローテーションが行われていない場合、監査での指摘やコンプライアンス違反につながる可能性があります。
- 復旧作業の複雑化: 長期間ローテーションされていないシークレットが侵害された場合、影響を受けたシステム全体で古いシークレットを特定し、更新する必要があり、復旧作業が複雑化し、時間を要する可能性があります。
対策: Secrets Managerのシークレットに対して、適切なローテーションを設定し、指定された期間内に確実にローテーションされるように管理することが重要です。
- ローテーション設定の確認: Secrets Managerに保存されている各シークレットの設定を確認し、ローテーションが有効になっているか、またローテーション間隔が組織のポリシーに準拠しているかを確認します。
- ローテーションの有効化と設定: ローテーションが有効になっていないシークレットに対して、適切なローテーションスケジュール(ローテーション間隔、ローテーションに使用するLambda関数など)を設定します。
- ローテーション間隔の最適化: シークレットの種類やリスクレベルに応じて、適切なローテーション間隔を設定します。機密性の高いシークレットほど、短いローテーション間隔を設定することを推奨します。
- ローテーションの監視とアラート: Secrets Managerのローテーションのステータスを監視し、ローテーションが失敗した場合や、次回のローテーション予定日が近づいている場合にアラートを通知する仕組みを構築します。
- ローテーション機能のテスト: 設定したローテーション機能が正常に動作することを定期的にテストします。
修復方法
AWSコンソール上での修復手順
AWSコンソールを用いて、Secrets Managerのシークレットのローテーション設定を確認し、必要に応じて有効化または修正します。
- AWSコンソールにログインします。
- ナビゲーションペインから Secrets Manager を選択します。
- シークレットのリストから、確認または編集したいシークレットの名前をクリックします。
- シークレットの詳細ページで、ローテーション設定 セクションを確認します。

- ローテーションが無効になっている場合は、ローテーションを編集 ボタンをクリックし、ローテーションを有効にします。
- ローテーション間隔(ローテーション頻度)が組織のポリシーに準拠していない場合は、適切な値に修正します。
- ローテーションに使用するLambda関数が正しく設定されていることを確認します。必要に応じて、ローテーション関数を選択または新規作成します。

- 保存 ボタンをクリックして変更を適用します。
Terraformでの修復手順
TerraformでSecrets Managerのシークレットのローテーションを設定するには、aws_secretsmanager_secret_rotation
リソースを使用します。まず、aws_secretsmanager_secret
リソースでシークレットを作成または管理している必要があります。
resource "aws_secretsmanager_secret" "example" {
name = "my-database-credentials"
recovery_window_in_days = 7
}
resource "aws_lambda_function" "rotation_function" {
# ローテーションロジックを実装した Lambda 関数の定義
# ...
}
resource "aws_secretsmanager_secret_rotation" "example" {
secret_id = aws_secretsmanager_secret.example.id
rotation_rules {
automatically_after_days = 90 # ローテーション間隔を90日に設定
}
rotation_lambda_arn = aws_lambda_function.rotation_function.arn
}
上記の例では、aws_secretsmanager_secret_rotation
リソースで、aws_secretsmanager_secret.example
というシークレットに対して、90日ごとにローテーションを行う設定をしています。rotation_lambda_arn
には、ローテーション処理を行うLambda関数のARNを指定します。
既存のシークレットのローテーション設定を変更する場合は、該当する aws_secretsmanager_secret_rotation
リソースを修正し、terraform apply
を実行します。ローテーションを有効にする場合は、このリソースを追加し、ローテーションを無効にする場合は、このリソースを削除します。
最後に
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。