설명
S3 버킷 정책에서 Principal: "*"에 쓰기 작업을 허용하면, 적절한 접근 제한이 없는 경우 신뢰하지 않는 주체도 데이터를 저장하거나 설정을 변경할 수 있습니다. 각 작업이 필요한 서비스나 운영 역할에만 해당 권한을 부여해야 합니다.
s3:PutObject는 객체 업로드 권한이며, 다른 Put 작업은 버킷이나 객체의 설정을 변경할 수 있습니다. 실제 허용 범위는 작업, 대상 리소스, 조건, 명시적 거부 및 S3 Block Public Access 설정에 따라 달라집니다. 업로드와 관리 권한을 구분하여 검토하세요.
잠재적 영향
- 실제로
s3:PutObject가 필요한 범위보다 넓게 허용되면, 업로드 권한이 필요 없는 주체도 새 객체를 추가하거나 기존 키로 새 내용을 저장할 수 있습니다. 버전 관리가 활성화되면 같은 키의 업로드는 이전 버전을 남기고 새 버전을 만듭니다. - 이렇게 추가된 객체를 웹 서비스나 데이터 처리 시스템이 사용하면 의도하지 않은 콘텐츠가 제공되거나 처리될 수 있습니다. 설정 변경 작업이 허용된 경우에는 해당 작업에 맞는 영향을 따로 평가해야 합니다.
- 불필요한 업로드가 실제로 허용되면 저장 비용과 처리 부하가 증가할 수 있습니다.
해결 방법
- 불필요한 공개 쓰기 허용을 제거하고, 필요한 작업은 지정된 역할이나 계정에만 부여하세요.
- 업로드 권한과 관리용 설정 변경 권한을 구분하여 유효한 작업 이름과 구체적인 버킷·객체 ARN을 지정하세요. 조건과 다른 정책, Block Public Access까지 함께 확인하세요.
- 업로드 감시와 파일 검사를 운영 요구에 맞게 구성하세요. 이런 보완 조치는 접근 권한 제한을 대신하지 않습니다.
예시
다음 발췌는 업로드 허용 구문과 명시적 거부 구문을 비교합니다. DOC-EXAMPLE-BUCKET의 정의가 없으며, 배포 전에 작업에 맞는 버킷 또는 객체 ARN도 지정해야 합니다.
불완전한 업로드 허용 구문
Resources:
SampleBucketPolicy3:
Type: "AWS::S3::BucketPolicy"
Properties:
Bucket: !Ref DOC-EXAMPLE-BUCKET
PolicyDocument:
Statement:
- Action: "PutObject"
Effect: Allow
Resource: "*"
Principal: "*"
PutObject에는 필요한 서비스 접두사가 없어 유효한 AWS 정책 작업 이름이 아닙니다. s3:PutObject로 수정하더라도 모든 주체에게 업로드를 허용하려는 범위는 별도로 제한해야 합니다. 필요한 주체와 객체 경로를 구체적으로 지정하세요.
객체 업로드의 명시적 거부
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 작업 전체를 거부하는 것은 아닙니다. 필요한 업로드를 유지할 수 있도록 허용·거부 구문과 대상 리소스를 함께 설계하세요.