웹사이트 접근 권한 설정
웹사이트 접근 권한 설정
버킷을 정적 웹사이트로 구성할 때 웹사이트를 공개하려면 공개 읽기 접근을 부여할 수 있어요. 버킷을 공개적으로 읽을 수 있게 만들려면 버킷의 공개 액세스 차단 설정을 비활성화하고, 공개 읽기 접근을 부여하는 버킷 정책을 작성해야 해요. 버킷에 버킷 소유자가 소유하지 않은 객체가 있다면, 모두에게 읽기 접근을 부여하는 객체 ACL(접근 제어 목록)을 추가해야 할 수도 있어요.
출처: 문서
본문
버킷의 공개 액세스 차단 설정을 비활성화하고 싶지 않아도 웹사이트를 공개하고 싶다면, 정적 웹사이트를 제공하도록 Amazon CloudFront 배포를 만들 수 있어요. 자세한 내용은 Amazon CloudFront로 웹사이트 속도 높이기 또는 Amazon Route 53 Developer Guide의 Amazon CloudFront 배포로 정적 웹사이트 제공을 참고하세요.
참고 웹사이트 엔드포인트에서 사용자가 존재하지 않는 객체를 요청하면 Amazon S3는 HTTP 응답 코드
404 (Not Found)를 반환해요. 객체는 존재하지만 읽기 권한을 부여하지 않았다면 웹사이트 엔드포인트는 HTTP 응답 코드403 (Access Denied)를 반환해요. 사용자는 이 응답 코드로 특정 객체가 존재하는지 추론할 수 있어요. 이런 동작을 원하지 않는다면 버킷에서 웹사이트 지원을 활성화하지 않아야 해요.
1단계: S3 Block Public Access 설정 편집 (Step 1: Edit S3 Block Public Access settings)
공개 접근이 있는 정적 웹사이트로 기존 버킷을 구성하려면 해당 버킷의 Block Public Access 설정을 편집해야 해요. 계정 수준의 Block Public Access 설정도 편집해야 할 수 있어요. Amazon S3는 버킷 수준과 계정 수준의 공개 액세스 차단 설정 중 가장 제한적인 조합을 적용해요.
예를 들어 버킷에 공개 접근을 허용해도 계정 수준에서 모든 공개 액세스를 차단한다면, Amazon S3는 계속해서 버킷에 대한 공개 접근을 차단해요. 이 시나리오에서는 버킷 수준과 계정 수준의 Block Public Access 설정을 모두 편집해야 해요. 자세한 내용은 Amazon S3 스토리지에 대한 공개 액세스 차단을 참고하세요.
기본적으로 Amazon S3는 계정과 버킷에 대한 공개 접근을 차단해요. 버킷을 정적 웹사이트 호스팅에 사용하려면 다음 단계로 공개 액세스 차단 설정을 편집할 수 있어요.
경고 이 단계를 완료하기 전에 Amazon S3 스토리지에 대한 공개 액세스 차단을 검토해 공개 접근을 허용할 때의 위험을 이해하고 수용했는지 확인해요. 공개 액세스 차단 설정을 꺼서 버킷을 공개로 만들면 인터넷의 누구든지 버킷에 접근할 수 있게 돼요. 버킷에 대한 모든 공개 액세스를 차단할 것을 권장해요.
- https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 열어요.
- 정적 웹사이트로 구성한 버킷의 이름을 선택해요.
- Permissions를 선택해요.
- Block public access (bucket settings) 아래에서 Edit를 선택해요.
- Block all public access를 해제하고 Save changes를 선택해요. Amazon S3가 버킷의 Block Public Access 설정을 꺼요. 공개 정적 웹사이트를 만들려면 버킷 정책을 추가하기 전에 계정의 Block Public Access 설정을 편집해야 할 수도 있어요. 계정의 Block Public Access 설정이 현재 켜져 있다면 Block public access (bucket settings) 아래에 메모가 표시돼요.
2단계: 버킷 정책 추가 (Step 2: Add a bucket policy)
버킷의 객체를 공개적으로 읽을 수 있게 만들려면 모두에게 s3:GetObject 권한을 부여하는 버킷 정책을 작성해야 해요.
S3 Block Public Access 설정을 편집한 뒤 버킷에 공개 읽기 접근을 부여하는 버킷 정책을 추가할 수 있어요. 공개 읽기 접근을 부여하면 인터넷의 누구든지 버킷에 접근할 수 있어요.
중요 다음 정책은 예시일 뿐이며 버킷 내용에 전체 접근을 허용해요. 이 단계를 진행하기 전에 Amazon S3 버킷의 파일을 어떻게 안전하게 보호할 수 있나요?를 검토해 S3 버킷의 파일 보안 모범 사례와 공개 접근을 부여할 때의 위험을 이해하는지 확인해요.
- Buckets 아래에서 버킷 이름을 선택해요.
- Permissions를 선택해요.
- Bucket Policy 아래에서 Edit를 선택해요.
- 웹사이트에 공개 읽기 접근을 부여하려면 다음 버킷 정책을 복사해 Bucket policy editor에 붙여넣어요.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::Bucket-Name/*"
]
}
]
}
Resource를 자신의 버킷 이름으로 업데이트해요. 위 예시 버킷 정책에서Bucket-Name은 버킷 이름의 자리 표시자예요. 이 버킷 정책을 자신의 버킷에 사용하려면 이 이름을 자신의 버킷 이름과 일치하도록 업데이트해야 해요.- Save changes를 선택해요. 버킷 정책이 성공적으로 추가되었다는 메시지가 나타나요.
Policy has invalid resource라는 오류가 보이면 버킷 정책의 버킷 이름이 버킷 이름과 일치하는지 확인해요. 버킷 정책 추가에 대한 자세한 내용은 S3 버킷 정책을 추가하는 방법을 참고하세요. 오류 메시지가 뜨고 버킷 정책을 저장할 수 없다면 계정 및 버킷의 Block Public Access 설정을 확인해 버킷에 공개 접근을 허용하는지 확인해요.
객체 접근 제어 목록 (Object access control lists)
버킷 정책을 사용해 객체에 공개 읽기 권한을 부여할 수 있어요. 하지만 버킷 정책은 버킷 소유자가 소유한 객체에만 적용돼요. 버킷에 버킷 소유자가 소유하지 않은 객체가 있다면, 버킷 소유자는 객체 ACL(접근 제어 목록)을 사용해 그 객체들에 공개 READ 권한을 부여해요.
S3 Object Ownership은 버킷에 업로드되는 객체의 소유권을 제어하고 ACL을 비활성화하거나 활성화하는 데 사용하는 Amazon S3 버킷 수준 설정이에요. 기본적으로 Object Ownership은 Bucket owner enforced 설정으로 되어 있고 모든 ACL은 비활성화돼요. ACL이 비활성화되면 버킷 소유자가 버킷의 모든 객체를 소유하고, 접근 관리 정책만으로 접근을 독점적으로 관리해요.
Amazon S3의 대부분의 최신 사용 사례는 더 이상 ACL을 필요로 하지 않아요. 각 객체를 개별적으로 제어해야 하는 상황을 제외하고는 ACL을 비활성화한 채로 유지할 것을 권장해요. ACL을 비활성화해도 버킷에 누가 객체를 업로드했는지와 관계없이 정책으로 버킷의 모든 객체에 대한 접근을 제어할 수 있어요. 자세한 내용은 버킷의 객체 소유권 제어 및 ACL 비활성화를 참고하세요.
중요 일반 목적 버킷이 S3 Object Ownership에 Bucket owner enforced 설정을 사용한다면, 정책을 사용해 일반 목적 버킷과 그 안의 객체에 대한 접근을 부여해야 해요. Bucket owner enforced 설정이 켜져 있으면 ACL을 설정하거나 업데이트하는 요청은 실패하고
AccessControlListNotSupported오류 코드를 반환해요. ACL 읽기 요청은 여전히 지원돼요.
ACL로 객체를 공개적으로 읽을 수 있게 만들려면 다음 부여 요소처럼 AllUsers 그룹에 READ 권한을 부여해요. 이 부여 요소를 객체 ACL에 추가해요. ACL 관리에 대한 자세한 내용은 접근 제어 목록(ACL) 개요를 참고하세요.
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="Group">
<URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
</Grantee>
<Permission>READ</Permission>
</Grant>