Put 작업의 Principal이 와일드카드인 S3 버킷 정책

S3 버킷의 업로드와 설정 변경 권한을 필요한 주체로 제한하여 원치 않는 콘텐츠 저장과 운영 변경을 방지합니다.

설명

S3 버킷 정책에서 Principal: "*"에 쓰기 작업을 허용하면, 적절한 접근 제한이 없는 경우 신뢰하지 않는 주체도 데이터를 저장하거나 설정을 변경할 수 있습니다. 각 작업이 필요한 서비스나 운영 역할에만 해당 권한을 부여해야 합니다.

s3:PutObject는 객체 업로드 권한이며, 다른 Put 작업은 버킷이나 객체의 설정을 변경할 수 있습니다. 실제 허용 범위는 작업, 대상 리소스, 조건, 명시적 거부 및 S3 Block Public Access 설정에 따라 달라집니다. 업로드와 관리 권한을 구분하여 검토하세요.

잠재적 영향

  • 실제로 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: "PutObject"
            Effect: Allow
            Resource: "*"
            Principal: "*"

PutObject에는 필요한 서비스 접두사가 없어 유효한 AWS 정책 작업 이름이 아닙니다. s3:PutObject로 수정하더라도 모든 주체에게 업로드를 허용하려는 범위는 별도로 제한해야 합니다. 필요한 주체와 객체 경로를 구체적으로 지정하세요.

객체 업로드의 명시적 거부

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

유효한 정책에서 Effect: Deny는 지정된 리소스의 s3:PutObject를 모든 주체에게 명시적으로 거부하므로 정상 업로드도 차단할 수 있습니다. 다른 Put 작업 전체를 거부하는 것은 아닙니다. 필요한 업로드를 유지할 수 있도록 허용·거부 구문과 대상 리소스를 함께 설계하세요.

참조