설명
public-read나 public-read-write 같은 공개 ACL은 익명 사용자를 포함해 불특정 사용자에게 S3 리소스 접근을 허용할 수 있습니다. 공개할 필요가 없는 데이터에는 이런 ACL을 사용하지 마세요.
공개 ACL을 지정했다는 사실만으로 버킷의 모든 객체가 공개되었다고 판단할 수는 없습니다. 버킷 ACL의 READ는 객체 목록 조회를, 객체 ACL의 READ는 해당 객체의 내용 읽기를 허용합니다. Block Public Access가 공개 ACL을 거부하거나 무시할 수 있으며, Object Ownership이 Bucket owner enforced이면 ACL에 따른 권한 부여가 비활성화됩니다.
잠재적 영향
- 공개 읽기 ACL이 실제로 적용되면 대상에 따라 객체 목록이나 객체 내용이 의도하지 않은 사용자에게 공개될 수 있습니다.
- 버킷의 공개
WRITE권한이 실제로 적용되면 외부 사용자의 새 객체 업로드로 저장 공간과 요청 비용이 늘어날 수 있습니다. 이 권한만으로 버킷과 기존 객체 어느 쪽의 소유자도 아닌 사용자가 기존 객체를 덮어쓰거나 삭제할 수는 없습니다.
해결 방법
- 공개 ACL이 필요하지 않다면 이를 제거하세요. 기존에 필요한 접근을 정책으로 구성한 뒤 ACL을 비활성화하세요. ACL을 계속 사용해야 한다면 필요한 계정에만 권한을 부여하세요.
- Block Public Access, Object Ownership, 버킷 정책, 객체 ACL을 함께 확인해 실제 접근 범위를 판단하세요. 데이터를 의도적으로 공개하더라도 필요한 리소스에 대한 읽기 접근만 허용하세요.
- 현재 Ansible 컬렉션에서는 버킷 관리에
amazon.aws.s3_bucket을 사용하세요. 변경 후 실제 ACL과 정책을 확인하고, 필요한 접근은 유지되며 원치 않는 접근은 거부되는지 검증하세요.
예시
아래는 레거시 amazon.aws.aws_s3 모듈을 사용한 예제입니다. 현재 문서는 amazon.aws.s3_object로 연결되며, 이 모듈의 버킷 생성·삭제 기능은 컬렉션 6.0.0에서 제거되었습니다. 아래 mode: create 구문을 현재 컬렉션의 버킷 생성 방법으로 사용하지 마세요.
변경 전
yaml
- name: Create an empty bucket
amazon.aws.aws_s3:
bucket: mybucket
mode: create
permission: public-read
- name: Create an empty bucket
amazon.aws.aws_s3:
bucket: mybucket-logs
mode: create
permission: public-read-write
변경 후
yaml
- name: Create an empty bucket
amazon.aws.aws_s3:
bucket: mybucket
mode: create
permission: private
설명:
- 첫 번째 예시: 버킷에 적용되는
public-read는 객체 목록 조회를,public-read-write는 여기에 새 객체 업로드까지 허용할 수 있습니다. 실제 권한은 ACL 활성화 여부와 다른 접근 제어 설정에 따라 달라집니다. - 두 번째 예시:
privateACL은 공개 권한을 부여하지 않습니다. 다만 버킷 정책이나 객체 ACL이 별도로 허용하는 접근도 확인해야 합니다. 기존 버킷에 필요한 변경이 실제로 적용되었는지 검증하세요.