AWS SQS キューポリシーのアクセス範囲の確認

承認済みの送信元と受信側に必要な SQS 権限だけを許可してください。

説明

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 権限も確認してください。

参考資料