와일드카드 주체를 사용하는 SNS 토픽 정책

SNS 토픽의 접근 주체와 게시·구독·관리 권한을 필요한 범위로 제한하고 서비스 연동 조건을 확인하세요.

설명

SNS 토픽 정책에서 와일드카드 주체에 권한을 허용하면 의도하지 않은 주체까지 접근할 수 있습니다. 실제 허용 범위는 Action, Resource, 조건과 다른 적용 정책에 따라 달라집니다. 게시, 구독과 관리 권한을 각각 검토해야 합니다.

잠재적 영향

  • 게시 권한이 필요 없는 주체에게 sns:Publish가 허용되면 원치 않는 메시지가 들어올 수 있습니다. 이를 신뢰하는 후속 시스템은 잘못된 알림이나 자동화 작업을 실행할 수 있습니다.
  • 구독이나 관리 권한이 과도하면 정보 전달 범위와 토픽 운영에 영향을 줄 수 있습니다.

해결 방법

  • 필요한 게시자와 운영 주체를 명시하고 각자 필요한 작업과 토픽 ARN만 허용하세요. 계정의 :root ARN은 그 계정에 권한을 위임하며 루트 사용자만을 뜻하지 않습니다.
  • 서비스 연동에는 지원되는 조건 키와 정확한 값을 사용하세요. 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
    }]
  })
}

승인된 역할이 이 토픽에 메시지를 게시하도록 제한합니다. 필요한 구독이나 관리 권한은 별도로 구성하고 실제 요청으로 검증하세요.

참조