説明
SNSトピックポリシーでワイルドカードのアクセス主体に権限を付与すると、意図しないアクセスを許可する可能性があります。実際に適用される権限は、Action、Resource、条件、ほかの関連ポリシーによって異なります。発行、サブスクリプション、管理の権限をそれぞれ確認する必要があります。
想定される影響
- 発行権限が不要な主体に
sns:Publishが許可されると、不要なメッセージがトピックに送信される可能性があります。後続システムがそれを信頼すると、誤った通知や意図しない自動処理につながる場合があります。 - 過剰なサブスクリプション権限や管理権限は、情報の配信範囲やトピックの運用に影響する可能性があります。
対処方法
- 必要な発行者と運用主体を明示し、それぞれに必要な操作とトピックARNだけを許可してください。アカウントの
:rootARNはそのアカウントへの権限委任であり、ルートユーザーだけを指すものではありません。 - サービス連携では、対応する条件キーと正確な値を使ってください。
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
}]
})
}
承認済みロールが、このトピックにメッセージを発行できる設定です。必要なサブスクリプションや管理の権限は別途構成し、実際のリクエストで確認してください。