설명
SQS 큐 정책의 와일드카드 Principal은 불특정 주체에게 권한을 줄 수 있습니다. 실제 허용 범위는 Action, Resource, 정책 조건과 다른 권한 통제에 달려 있으므로, 공개 주체만 보고 모든 요청이 허용된다고 단정하면 안 됩니다.
IP 조건은 접속 경로를 제한하지만 주체 자체를 특정하지는 않습니다. 승인된 생산자·소비자를 명시하고 저장 시 암호화와 필요한 KMS 권한을 유지하세요. 암호화된 큐는 익명 SendMessage와 ReceiveMessage를 거부합니다.
잠재적 영향
- 허용된 메시지 작업이 오용되면 불필요한 작업이 큐에 들어가거나 메시지가 유출·삭제될 수 있습니다.
- 공유 출발지 주소만으로 허용 대상을 구분하면 같은 경로를 쓰는 불필요한 주체도 허용될 수 있습니다.
해결 방법
- Principal을 필요한 계정·역할·서비스로 제한하고 메시지 작업도 업무에 맞게 줄이세요.
- 공개 엔드포인트의 IP 조건에는 실제 외부 출발지 주소를 사용하세요. VPC 엔드포인트 경로라면 해당 경로에 맞는 조건을 검토하세요.
- 큐 정책과 생산자·소비자 및 키 권한을 함께 확인하고 정상 처리와 미승인 접근 거부를 시험하세요.
예시
참조 큐는 별도로 정의하세요. 203.0.113.0/24는 문서용 주소이므로 실제 승인된 외부 출발지 대역으로 바꾸고, 역할 ARN도 실제 값으로 바꾸세요.
변경 전
hcl
resource "aws_sqs_queue_policy" "example" {
queue_url = aws_sqs_queue.q.id
policy = <<EOF
{
"Version": "2012-10-17",
"Id": "Queue1_Policy_UUID",
"Statement": [{
"Sid":"Queue1_AnonymousAccess_AllActions_AllowlistIP",
"Effect": "Allow",
"Principal": "*",
"Action": "sqs:*",
"Resource": "${aws_sqs_queue.q.arn}",
"Condition" : {
"IpAddress" : {
"aws:SourceIp":"203.0.113.0/24"
}
}
}]
}
EOF
}
전체 주체를 허용하지만 IP 조건도 적용됩니다. 따라서 모든 인터넷 주소에 공개된 정책은 아니며, 해당 경로에서 불필요한 주체가 접근할 수 있는지 검토해야 합니다.
변경 후
hcl
resource "aws_sqs_queue_policy" "example" {
queue_url = aws_sqs_queue.q.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Id": "Queue1_Policy_UUID",
"Statement": [{
"Sid":"Queue1_AnonymousAccess_AllActions_AllowlistIP",
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::111122223333:role/queue-client"},
"Action": "sqs:*",
"Resource": "${aws_sqs_queue.q.arn}",
"Condition" : {
"IpAddress" : {
"aws:SourceIp":"203.0.113.0/24"
}
}
}]
}
POLICY
}
주체를 지정한 역할로 좁히고 같은 IP 조건을 유지합니다. sqs:*는 여전히 광범위하므로 실제 필요한 메시지 작업만 허용하세요.