Action과 Principal에 와일드카드를 지정한 S3 버킷 정책

S3 버킷 정책에서 작업과 주체를 모두 와일드카드로 허용하면 과도한 접근 권한이 생길 수 있습니다. 필요한 주체, 작업과 리소스만 허용하세요.

설명

S3 버킷 정책의 허용 구문에서 Action과 Principal을 모두 *로 지정하면, 모든 주체에 광범위한 작업 권한을 부여할 수 있습니다. 실제 접근은 대상 리소스, 조건, 명시적 거부와 Block Public Access 설정에 따라 달라집니다. 내부 데이터에 대한 접근은 업무에 필요한 주체와 작업으로 제한해야 합니다.

정책의 Effect는 허용 또는 거부를 명시하는 필수 요소입니다. 이를 생략하는 것은 접근 권한을 부여하거나 정책을 제한하는 방법이 아닙니다.

잠재적 영향

  • 의도하지 않은 주체에게 객체 읽기가 허용되면 데이터가 노출될 수 있습니다.
  • 쓰기나 삭제까지 허용되면 객체 추가, 변경 또는 삭제로 서비스와 운영 데이터가 영향을 받을 수 있습니다.
  • 광범위한 허용 구문을 남겨 둔 채 다른 보호 설정을 완화하면 접근 범위가 의도보다 넓어질 수 있습니다.

해결 방법

  • 불필요한 와일드카드 허용을 제거하고 필요한 계정, 역할 또는 서비스와 작업을 명시하세요. s3:*도 모든 S3 작업을 포함하므로 최소 권한 조치로 간주하지 마세요.
  • s3:GetObject, s3:PutObject 등 필요한 작업에 맞는 버킷 또는 객체 ARN을 지정하세요. 조건과 다른 허용·거부 구문을 함께 검토하고, 내부용 버킷에는 Block Public Access를 유지하세요.
  • 필요한 접근은 유지되고 불필요한 접근은 거부되는지 검증하세요. 의도하지 않은 공개 접근이 있었다면 접근을 제한하고 관련 로그와 변경 이력을 확인하세요.

예시

다음 예제에는 참조하는 DOC-EXAMPLE-BUCKET의 정의가 없습니다. 실제 버킷 정의와 작업에 맞는 리소스 ARN을 사용해야 하며, 두 예제를 그대로 최소 권한 배포 구성으로 사용해서는 안 됩니다.

모든 주체에 광범위한 작업 허용

yaml
Resources:
  SampleBucketPolicy3:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref DOC-EXAMPLE-BUCKET
      PolicyDocument:
        Statement:
          - Action: "*"
            Effect: Allow
            Resource: "*"
            Principal: "*"

주체와 작업을 제한하지 않는 허용 구문입니다. 정책이 유효하게 적용되고 다른 접근 제어가 막지 않으면 필요한 범위를 넘는 권한이 부여될 수 있습니다.

GetObject 명시적 거부

yaml
Resources:
  SampleBucketPolicy1:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref DOC-EXAMPLE-BUCKET
      PolicyDocument:
        Statement:
          - Action:
              - "s3:GetObject"
            Effect: Deny
            Resource: "*"
            Principal: "*"

이 구문은 모든 주체에 s3:GetObject를 명시적으로 거부하므로 정상적인 객체 조회도 막을 수 있습니다. s3:GetObjectVersion이나 쓰기·삭제 작업까지 거부하지는 않습니다. 적용 전에 실제 대상 객체 ARN과 정상 사용에 미칠 영향을 확인하세요.

참조