Principal에 와일드카드가 있거나 Principal이 누락된 SNS 주제 정책

SNS 주제의 접근 주체, 허용 작업과 서비스 연동 조건을 확인하여 의도하지 않은 메시지 발행을 제한합니다.

설명

SNS 주제 정책은 주제에 접근할 수 있는 계정, 역할 또는 서비스 주체와 허용 작업을 지정합니다. 허용 구문의 Principal에 와일드카드를 사용한다면 조건을 포함한 전체 정책이 접근 범위를 충분히 제한하는지 확인해야 합니다. Principal을 생략한 불완전한 정책이 기본적으로 모든 접근을 허용하는 것은 아닙니다.

실제 권한은 Action, Resource, 조건과 다른 정책의 제한에 따라 달라집니다. 조건 키는 그 의미와 요청에서의 사용 가능 여부에 맞게 선택해야 합니다. 예를 들어 aws:ResourceAccount는 리소스 소유 계정을 나타냅니다. aws:SourceAccount는 해당 키가 제공되는 AWS 서비스 간 요청에서 원본 리소스의 소유 계정을 제한하며, 일반 IAM 요청자의 계정을 제한하는 조건이 아닙니다.

잠재적 영향

  • 메시지 발행 권한이 필요 없는 주체에게 실제로 sns:Publish가 허용되면 원치 않는 메시지가 주제와 구독 대상에 전달될 수 있습니다.
  • 구독 대상이 수신 메시지로 자동화를 실행한다면 의도하지 않은 작업이나 잘못된 알림으로 이어질 수 있습니다.
  • 조건의 의미를 잘못 이해하면 접근 범위를 의도보다 넓게 허용하거나 필요한 서비스 연동을 차단할 수 있습니다.

해결 방법

  • 필요한 계정, 역할 또는 서비스 주체를 확인하고 Principal, 작업, 실제 주제 ARN을 그 용도에 맞게 제한하세요.
  • 조건은 키 이름뿐 아니라 연산자, 값, 요청에 해당 키가 제공되는지를 검토하세요. aws:SourceAccount를 일반 IAM 요청자의 계정을 제한하는 조건으로 사용하지 마세요.
  • AWS 서비스 연동에는 해당 서비스의 지침에 따라 서비스 주체와 적절한 aws:SourceArn 또는 aws:SourceAccount 조건을 사용하세요. 새 연동에는 더 이상 권장되지 않는 aws:SourceOwner를 사용하지 말고, 변경 후 필요한 메시지 발행과 전달이 정상 동작하는지 테스트하세요.

예시

아래 발췌는 와일드카드 주체와 계정 조건을 비교하는 예시이며, 그대로 배포할 수 있는 완성된 정책이 아닙니다. 첫 예시의 Version: "2022-05-02"는 지원되지 않는 정책 언어 버전이고, Publish에는 서비스 접두사가 없으며 Resource도 빠져 있습니다. 실제 정책에는 2012-10-17, sns:Publish와 대상 주제의 ARN을 사용하세요. 두 번째 예시의 ARN과 계정 번호도 실제 환경에 맞게 검증해야 합니다.

변경 전

yaml
- name: Create alarm SNS topic community
  community.aws.sns_topic:
    name: "alarms"
    state: present
    display_name: "alarm SNS topic"
    policy:
      Version: "2022-05-02"
      Statement:
        - Action: Publish
          Effect: Allow
          Principal:
            AWS: "*"

변경 후

yaml
- name: Create SNS topic with safe policy
  community.aws.sns_topic:
    name: secure-topic
    display_name: "Secure SNS Topic"
    state: present
    policy:
      Id: secure-topic-policy
      Version: "2012-10-17"
      Statement:
        - Sid: AllowPublishFromSpecificAccount
          Effect: Allow
          Resource: "arn:aws:sns:*:*:secure-topic"
          Principal: "*"
          Action: sns:Publish
          Condition:
            StringEquals:
              aws:SourceAccount: "123456789012"

설명:

  • 첫 번째 예시: Principal.AWS: "*"는 접근 주체를 특정 계정이나 역할로 제한하지 않습니다. 위의 문법 문제를 고치고, 접근이 필요한 주체와 허용 범위를 명시하세요.
  • 두 번째 예시: aws:SourceAccount 조건의 계정 번호는 해당 AWS 서비스 요청에서 원본 리소스를 소유하는 계정이어야 합니다. 실제 서비스 연동에 맞는 주체와 조건을 선택하고, ARN의 리전·계정 와일드카드를 대상 주제의 값으로 바꾸세요. 이 조건만으로 모든 IAM 요청자를 특정 계정으로 제한할 수는 없습니다.

참조