설명
AccessControl: PublicRead 버킷 ACL이 유효하면 익명 사용자를 포함한 모든 사용자에게 버킷 안의 객체 목록 조회를 허용할 수 있습니다. 버킷 수준의 READ는 객체 내용을 읽는 권한과 다르며, 각 객체의 읽기 권한도 따로 확인해야 합니다.
새 버킷은 기본적으로 ACL이 비활성화되고 퍼블릭 액세스가 차단됩니다. 실제 공개 여부는 Object Ownership, 계정·버킷의 퍼블릭 액세스 차단과 전체 정책에 따라 달라집니다.
잠재적 영향
- 객체 이름과 경로를 통해 내부 구조나 보관 데이터에 관한 정보가 드러날 수 있습니다.
- 객체 읽기도 별도로 허용되어 있다면 외부 사용자가 내용을 가져갈 수 있습니다.
해결 방법
- 필요한 기존 접근을 정책으로 먼저 구성한 뒤
BucketOwnerEnforced로 ACL을 비활성화하세요. - 공개할 필요가 없는 버킷은 퍼블릭 액세스 차단을 유지하고, 버킷 정책과 기존 객체 ACL도 함께 검토하세요.
- 정상 사용자의 접근은 유지되고 원치 않는 익명 목록 조회와 읽기는 차단되는지 확인하세요.
예시
같은 버킷의 대안 구성입니다. 전역에서 고유한 BucketName을 제공하세요. 첫 예시는 공개 ACL이 작동하는 조건을 보여 주며 권장 구성이 아닙니다. 계정이나 조직의 공개 접근 차단이 우선할 수 있으므로 실행을 위해 그 보호를 해제하지 마세요.
변경 전
yaml
Parameters:
BucketName:
Type: String
Resources:
JenkinsArtifacts01:
Type: AWS::S3::Bucket
Properties:
AccessControl: PublicRead
BucketName: !Ref BucketName
OwnershipControls:
Rules:
- ObjectOwnership: ObjectWriter
PublicAccessBlockConfiguration:
BlockPublicAcls: false
IgnorePublicAcls: false
BlockPublicPolicy: true
RestrictPublicBuckets: true
Tags:
- Key: CostCenter
Value: ITEngineering
ACL을 활성화하고 공개 ACL을 허용하는 버킷 설정입니다. 다른 제한이 없다면 익명 목록 조회를 허용할 수 있습니다.
변경 후
yaml
Parameters:
BucketName:
Type: String
Resources:
JenkinsArtifacts01:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref BucketName
OwnershipControls:
Rules:
- ObjectOwnership: BucketOwnerEnforced
PublicAccessBlockConfiguration:
BlockPublicAcls: true
IgnorePublicAcls: true
BlockPublicPolicy: true
RestrictPublicBuckets: true
VersioningConfiguration:
Status: Enabled
Tags:
- Key: CostCenter
Value: ITEngineering
- Key: Type
Value: CICD
ACL을 비활성화하고 네 가지 퍼블릭 액세스 차단을 켭니다. 기존 접근을 정책으로 옮긴 후 적용하세요. 버전 관리는 별도의 복구 기능이며 공개 접근을 차단하는 설정은 아닙니다.