설명
S3 버킷 정책에서 Principal: "*"은 주체를 특정 사용자나 역할로 제한하지 않습니다. 삭제 작업을 허용하는 구문에 이 값을 사용하고 적절한 접근 제한이 없다면, 삭제 권한이 필요 없는 주체도 데이터나 설정을 삭제할 수 있습니다.
실제 권한은 허용된 작업, 대상 Resource, Condition, 명시적 거부 및 S3 Block Public Access 설정에 따라 달라집니다. 객체 삭제와 버킷 설정 삭제는 서로 다른 작업이므로 필요한 권한을 각각 검토해야 합니다.
잠재적 영향
- 실제 정책 평가에서 삭제 권한이 필요 없는 주체에게 객체 삭제가 허용되면 데이터 손실이나 서비스 중단이 발생할 수 있습니다.
- 로그나 백업이 삭제되거나 일반 조회에서 사라지면 조사와 복구가 어려워질 수 있습니다. 버전 관리가 활성화된 버킷에서 버전 ID 없는 삭제는 보통 삭제 마커를 추가하며, 특정 버전의 영구 삭제에는
s3:DeleteObjectVersion권한이 필요합니다. - 버킷 설정을 삭제하는 권한까지 허용하면 해당 설정에 의존하는 운영이나 보호 기능이 영향을 받을 수 있습니다.
해결 방법
- 불필요한 삭제 허용 구문을 제거하고, 필요한 삭제 권한은 특정 운영 역할이나 계정에만 부여하세요.
- 유효한 작업 이름과 정확한 버킷·객체 ARN을 사용하여 범위를 제한하세요. 조건, 다른 허용·거부 정책 및 Block Public Access를 함께 검토하세요.
- 복구 요구에 맞게 버전 관리와 백업을 구성하고 복구 절차를 검증하세요. 버전 관리는 삭제 권한을 제한하는 기능을 대신하지 않습니다.
예시
다음 발췌는 허용 구문과 명시적 거부 구문을 비교합니다. 참조하는 DOC-EXAMPLE-BUCKET의 정의가 빠져 있으며, 실제 배포에는 작업에 맞는 버킷 또는 객체 ARN을 지정해야 합니다.
불완전한 삭제 허용 구문
yaml
Resources:
SampleBucketPolicy3:
Type: "AWS::S3::BucketPolicy"
Properties:
Bucket: !Ref DOC-EXAMPLE-BUCKET
PolicyDocument:
Statement:
- Action: "DeleteObject"
Effect: Allow
Resource: "*"
Principal: "*"
이 구문은 모든 주체에 대한 삭제 허용을 의도하지만, DeleteObject에 필요한 s3: 접두사가 없어 유효한 AWS 정책 예시가 아닙니다. 작업 이름을 수정하더라도 주체와 대상 리소스를 필요한 범위로 제한해야 합니다.
객체 삭제의 명시적 거부
yaml
Resources:
SampleBucketPolicy1:
Type: "AWS::S3::BucketPolicy"
Properties:
Bucket: !Ref DOC-EXAMPLE-BUCKET
PolicyDocument:
Statement:
- Action:
- "s3:DeleteObject"
Effect: Deny
Resource: "*"
Principal: "*"
유효한 정책에서 Effect: Deny는 지정된 리소스의 s3:DeleteObject를 모든 주체에게 명시적으로 거부하므로 정상 운영에도 영향을 줄 수 있습니다. 이 구문은 s3:DeleteObjectVersion 등 다른 작업까지 거부하지 않습니다. 필요한 운영 작업과 복구 절차를 확인한 뒤 적용하세요.