설명
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
}]
})
}
승인된 역할이 이 토픽에 메시지를 게시하도록 제한합니다. 필요한 구독이나 관리 권한은 별도로 구성하고 실제 요청으로 검증하세요.