Secrets Manager のシークレットアクセスポリシーの確認

シークレットにアクセスする主体と操作を必要な範囲に限定してください。

説明

Secrets Manager のリソースポリシーで主体や操作を広く許可すると、パスワード、トークン、API キーへの不要なアクセスが可能になるおそれがあります。取得権限と変更・削除などの管理権限を分け、必要なロールだけを許可してください。

実際のアクセスには、ポリシー条件、他の権限制御、必要な KMS 権限も関係します。シークレットに関連付けたリソースポリシーの Resource: "*" はそのシークレットを指し、この値だけでアカウント内の全シークレットへの権限を意味するわけではありません。

想定される影響

  • 不要な取得権限でシークレットが漏えいすると、接続先のデータベースや他のサービスにも影響する可能性があります。
  • 過剰な変更・削除権限は、利用するサービスの停止や認証失敗につながるおそれがあります。

対処方法

  • Principal を承認済みのロールに限定し、取得・ローテーション・管理の目的に必要な操作だけを許可してください。
  • リソースポリシーと IAM・KMS 権限を合わせて確認し、必要なアクセス条件を設定してください。
  • 正規の利用と未承認のアクセスの拒否を確認してください。シークレットの漏えいが確認された場合は、値をローテーションして利用するサービスも更新してください。

例

同じシークレットのリソースポリシーを絞る抜粋です。ロール ARN は実際の承認済みロールに置き換えてください。値の保存と必要な KMS 権限は別途設定してください。

変更前

hcl
resource "aws_secretsmanager_secret" "app_secret" {
  name = "not_secure_secret"
}

resource "aws_secretsmanager_secret_policy" "app_secret_policy" {
  secret_arn = aws_secretsmanager_secret.app_secret.arn

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "secretsmanager:*",
      "Resource": "*"
    }
  ]
}
POLICY
}

すべての AWS 主体に secretsmanager:* を許可しています。実際に適用される他の制御も確認し、不要な許可を削除してください。

変更後

hcl
resource "aws_secretsmanager_secret" "app_secret" {
  name = "not_secure_secret"
}

resource "aws_secretsmanager_secret_policy" "app_secret_policy" {
  secret_arn = aws_secretsmanager_secret.app_secret.arn

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:role/app-runtime"
      },
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "*"
    }
  ]
}
POLICY
}

同じシークレットについて、指定ロールの GetSecretValue だけを許可しています。このポリシー以外の権限とキーへのアクセスも確認してください。

参考資料