설명
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 권한도 함께 확인하세요.