説明
SQS キューポリシーで Principal に * を指定して操作を広く許可すると、不要なメッセージ送信やアクセスにつながるおそれがあります。実際のアクセス範囲は Action、Resource、条件、明示的な拒否、適用される権限によって異なります。
SendMessage の許可は、メッセージの読み取りや削除も許可するものではありません。また、サーバー側暗号化が有効なキューは匿名の SendMessage と ReceiveMessage を拒否しますが、暗号化は適切な権限制御の代わりにはなりません。
想定される影響
- 不要なメッセージでバックエンド処理が妨げられたり、コストが増えたりする可能性があります。
- 読み取りや削除も過剰に許可すると、メッセージ内容の漏えいや処理の損失につながるおそれがあります。
対処方法
Principal、Action、Resource を、承認済みの主体とキュー、必要な操作に限定してください。SNS からの配信には sns.amazonaws.com サービスプリンシパルと、承認済みトピックを指定する aws:SourceArn 条件を使ってください。必要な送受信リクエストが成功し、未承認のリクエストが拒否されることを試験してください。
例
同じキューに別のポリシーリソースを関連付け、キュー ARN の自己参照を避けています。SNS トピックの定義は省略しています。実際に承認したトピックを参照してください。
変更前
hcl
resource "aws_sqs_queue" "app_queue" {
name = "examplequeue"
}
resource "aws_sqs_queue_policy" "app_queue" {
queue_url = aws_sqs_queue.app_queue.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "sqs:SendMessage",
"Resource": "${aws_sqs_queue.app_queue.arn}"
}
]
}
POLICY
}
広い範囲の主体に SendMessage を許可します。この許可だけでメッセージを読み取ったり削除したりすることはできません。
変更後
hcl
resource "aws_sqs_queue" "app_queue" {
name = "examplequeue"
}
resource "aws_sqs_queue_policy" "app_queue" {
queue_url = aws_sqs_queue.app_queue.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"Service": "sns.amazonaws.com"},
"Action": "sqs:SendMessage",
"Resource": "${aws_sqs_queue.app_queue.arn}",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "${aws_sns_topic.notifications.arn}"
}
}
}
]
}
POLICY
}
SNS サービスと特定のトピック ARN 条件で送信を制限します。他のキューポリシーや関連する IAM・KMS 権限も確認してください。