アクセス主体にワイルドカードを指定したSNSトピックポリシー

SNSトピックのアクセス主体と発行・サブスクリプション・管理の権限を必要な範囲に限定し、サービス連携の条件を確認してください。

説明

SNSトピックポリシーでワイルドカードのアクセス主体に権限を付与すると、意図しないアクセスを許可する可能性があります。実際に適用される権限は、Action、Resource、条件、ほかの関連ポリシーによって異なります。発行、サブスクリプション、管理の権限をそれぞれ確認する必要があります。

想定される影響

  • 発行権限が不要な主体にsns:Publishが許可されると、不要なメッセージがトピックに送信される可能性があります。後続システムがそれを信頼すると、誤った通知や意図しない自動処理につながる場合があります。
  • 過剰なサブスクリプション権限や管理権限は、情報の配信範囲やトピックの運用に影響する可能性があります。

対処方法

  • 必要な発行者と運用主体を明示し、それぞれに必要な操作とトピックARNだけを許可してください。アカウントの:root ARNはそのアカウントへの権限委任であり、ルートユーザーだけを指すものではありません。
  • サービス連携では、対応する条件キーと正確な値を使ってください。aws:SourceAccountはサービス間のリクエストを発生させた元のリソースの所有アカウントを示し、通常の発行者のアカウントを常に示すわけではありません。aws:ResourceAccountもリソース所有者を示すため、呼び出し元の制限とは異なります。
  • モジュールを使う場合は、そのバージョンのポリシー選択とマージ方法を確認してください。最終的なポリシーが必要なリクエストを許可し、承認していないリクエストを拒否することをテストしてください。

例

以下は、広い権限を承認済みロールの発行権限に限定する例です。topic_nameと、実際の発行ロールのARNを示すpublisher_role_arn変数を定義してください。既存トピックを変更する場合はTerraformの状態と計画を確認し、同じポリシーをインライン設定と独立したポリシーリソースで二重に管理しないでください。

変更前

hcl
resource "aws_sns_topic" "public_topic" {
  name = var.topic_name
  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Action": "*",
      "Principal": {
        "AWS": "*"
      },
      "Resource": "*"
    }
  ]
}
EOF
}

ワイルドカードのアクセス主体に、広い範囲の操作とリソースを許可しています。実際に適用される権限は、SNSが対応する操作とほかの関連ポリシーによって異なります。

変更後

hcl
resource "aws_sns_topic" "public_topic" {
  name = var.topic_name
}

resource "aws_sns_topic_policy" "restricted_policy" {
  arn = aws_sns_topic.public_topic.arn

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Sid       = "AllowApprovedPublisher"
      Effect    = "Allow"
      Principal = { AWS = var.publisher_role_arn }
      Action    = "sns:Publish"
      Resource  = aws_sns_topic.public_topic.arn
    }]
  })
}

承認済みロールが、このトピックにメッセージを発行できる設定です。必要なサブスクリプションや管理の権限は別途構成し、実際のリクエストで確認してください。

参考資料