설명
S3 버킷 정책에서 와일드카드 주체에게 조회 권한을 실제로 허용하면 익명 요청을 포함한 의도하지 않은 접근이 가능해질 수 있습니다. s3:GetObject는 객체 내용을 읽는 권한이며, 다른 Get 작업은 버킷 설정이나 객체의 특정 정보를 조회할 수 있습니다. 조회 권한 자체가 객체 수정이나 삭제 권한을 주는 것은 아닙니다.
실제 접근은 작업, 리소스, 조건, 명시적 거부와 퍼블릭 액세스 차단 설정을 함께 고려해야 합니다. 공개 웹 자산처럼 의도적으로 공개하는 데이터도 필요한 읽기 범위만 허용하세요.
잠재적 영향
- 객체 읽기가 허용되면 문서, 로그나 백업의 내용이 외부에 유출될 수 있습니다.
- 허용된 조회 작업에 따라 버킷 구성이나 객체 정보가 드러날 수 있습니다.
해결 방법
- 불필요한 공개 허용을 제거하고 필요한 역할이나 서비스에만 해당 조회 권한을 부여하세요.
- 객체 작업에는 필요한 객체 ARN을, 버킷 작업에는 해당 버킷 ARN을 지정하고 조건을 검토하세요.
- 비공개 버킷은 퍼블릭 액세스 차단을 적용하고 다른 정책과 ACL도 확인하세요. 정상 읽기는 가능하고 의도하지 않은 읽기는 거부되는지 시험하세요.
예시
BucketName에 관리할 기존 버킷의 이름을 입력합니다. 예제는 객체 ARN을 사용하며, 공개 정책은 상위 계정이나 버킷의 퍼블릭 액세스 차단에 의해 거부될 수 있습니다. 예제를 적용하려고 기존 보호 설정을 해제하지 마세요.
변경 전
yaml
Parameters:
BucketName:
Type: String
Resources:
SampleBucketPolicy3:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref BucketName
PolicyDocument:
Version: '2012-10-17'
Statement:
- Action: s3:GetObject
Effect: Allow
Resource: !Sub 'arn:${AWS::Partition}:s3:::${BucketName}/*'
Principal: '*'
이 구문은 버킷의 객체에 대한 s3:GetObject를 모든 주체에게 허용합니다. 실제 공개 여부는 나머지 접근 제어에도 달려 있습니다.
변경 후
yaml
Parameters:
BucketName:
Type: String
Resources:
SampleBucketPolicy3:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref BucketName
PolicyDocument:
Version: '2012-10-17'
Statement:
- Action:
- s3:GetObject
Effect: Deny
Resource: !Sub 'arn:${AWS::Partition}:s3:::${BucketName}/*'
Principal: '*'
이 명시적 거부는 필요한 사용자에게도 s3:GetObject를 차단할 수 있습니다. 일부 사용자에게 읽기가 필요하다면 전체 거부를 그대로 적용하지 말고 공개 허용을 제거한 뒤 필요한 권한만 부여하세요.