Amazon S3 정적 웹 사이트 기능을 사용 중인데 액세스 거부 오류가 발생합니다. 왜 이런 현상이 발생합니까?

최종 업데이트 날짜: 2021년 12월 22일

S3 정적 웹 사이트 엔드포인트로 정적 웹 사이트를 호스팅하기 위해 Amazon Simple Storage Service(Amazon S3) 버킷을 사용하고 있습니다. 액세스 거부 오류가 발생하는 이유는 무엇입니까?

간략한 설명

Amazon S3를 사용하여 정적 웹 사이트를 호스팅하려고 하는데 액세스 거부 오류가 발생하는 경우 다음 요구 사항을 확인합니다.

  • 버킷의 객체에 공개적으로 액세스할 수 있어야 합니다.
  • S3 버킷 정책에서 s3:GetObject 작업에 대한 액세스를 허용해야 합니다.
  • 버킷을 소유한 AWS 계정이 객체도 소유해야 합니다.
  • 객체는 AWS Key Management Service(AWS KMS)로 암호화할 수 없습니다.
  • 요청된 객체는 S3 버킷에 있어야 합니다.
  • 버킷 및 계정 수준에서 Amazon S3 퍼블릭 액세스 차단을 비활성화해야 합니다.

해결 방법

버킷의 객체에 퍼블릭 액세스가 가능해야 함

S3 정적 웹 사이트 엔드포인트는 공개적으로 액세스 가능한 콘텐츠만 지원합니다. S3 버킷의 객체에 퍼블릭 액세스가 가능한지 확인하려면 웹 브라우저에서 객체의 URL을 엽니다. 또는 URL에서 cURL 명령을 실행할 수 있습니다.

다음은 S3 객체의 URL 예시입니다.

http://doc-example-bucket.s3-website-us-east-1.amazonaws.com/index.html
웹 브라우저 또는 cURL 명령에 의해 액세스 거부 오류가 반환될 경우 해당 객체에는 공개적으로 액세스할 수 없습니다. S3 객체에 대한 퍼블릭 읽기 액세스를 허용하려면 버킷의 모든 객체에 대한 퍼블릭 읽기 액세스를 허용하는 버킷 정책을 생성합니다.

S3 버킷 정책에서 s3:GetObject 작업에 대한 액세스를 허용해야 함

버킷 정책을 검토하고 s3:GetObject 작업에 대한 퍼블릭 읽기 액세스를 차단하는 deny 문이 없는지 확인합니다. 버킷 정책에서 s3:GetObject에 대한 명시적인 allow 문을 포함하더라도, 명시적인 deny 문과 충돌하지 않는지 확인해야 합니다. explicit deny 문은 항상 explicit allow 문을 재정의합니다.

s3:GetObject에 대한 버킷 정책을 검토하려면 다음 단계를 수행합니다.

1.    Amazon S3 콘솔을 엽니다.

2.    [Permissions] 탭을 선택합니다.

3.    [버킷 정책]을 선택합니다.

4.    버킷 정책에서 "Action": "s3:GetObject" 또는 "Action": "s3:*"이 포함된 문을 검토합니다.

5.    (선택 사항) 버킷 정책을 수정합니다. 예를 들어 s3:GetObject에 대한 퍼블릭 읽기 액세스를 차단하는 문을 제거하거나 편집합니다.

버킷을 소유하는 AWS 계정이 객체도 소유해야 함

객체에 대한 퍼블릭 읽기 액세스를 허용하려면 버킷을 소유한 AWS 계정이 객체도 소유해야 합니다. 버킷 또는 객체는 버킷 또는 객체를 생성한 AWS Identity and Access Management(IAM) 자격 증명의 계정이 소유합니다.

참고: 객체 소유권 요구 사항은 버킷 정책에 의해 부여된 퍼블릭 읽기 액세스 권한에 적용됩니다. 객체의 ACL(액세스 제어 목록)에 의해 부여된 퍼블릭 읽기 액세스 권한에는 적용되지 않습니다.

Amazon S3 버킷과 객체가 동일한 AWS 계정에서 소유하고 있는지 확인하려면 다음 단계를 수행합니다.

1.    버킷 소유자의 S3 정식 ID를 검색하려면 다음 명령을 사용합니다.

aws s3api list-buckets --query Owner.ID

2.    객체 소유자의 S3 정식 ID를 검색하려면 다음 명령을 사용합니다.

aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html

참고: 이 예시에서는 단일 객체를 보여 줍니다. 여러 객체를 검사하려면 list 명령을 사용합니다.

3.    버킷 소유자와 객체 소유자의 정식 ID가 일치하는지 확인합니다. 일치하지 않는 경우 버킷과 객체의 소유자가 다릅니다.

참고: Amazon S3 콘솔을 사용하여 버킷과 객체의 소유자를 확인할 수도 있습니다. 소유자는 각 버킷 또는 객체의 [권한(Permissions)] 탭에서 확인할 수 있습니다.

4.    버킷과 객체 소유자의 정식 ID가 일치하지 않으면 객체의 소유자를 버킷 소유자로 변경합니다.

객체 소유자의 계정에서 다음 명령을 실행하여 객체에 할당된 ACL 권한을 검색합니다.

aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name

객체에 bucket-owner-full-control ACL 권한이 없는 경우 객체 소유자의 계정에서 다음 명령을 실행합니다.

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control

객체에 bucket-owner-full-control ACL 권한이 있는 경우 버킷 소유자 계정에서 다음 명령어를 실행합니다. 이 명령은 객체를 그 자체에 복사함으로써 객체의 소유자를 변경합니다.

aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD

익명 사용자 또는 다른 AWS 계정이 업로드한 객체의 자동 소유권을 S3 객체 소유권을 사용하여 버킷 소유자에게 부여할 수도 있습니다.

버킷의 객체는 AWS KMS로 암호화할 수 없음

AWS KMS는 익명 요청을 지원하지 않습니다. 따라서 익명 또는 퍼블릭 액세스를 허용하는 모든 Amazon S3 버킷은 AWS KMS로 암호화된 객체에는 적용되지 않습니다. Amazon S3 정적 웹 사이트 엔드포인트를 사용하여 제공하려는 객체에서 KMS 암호화를 제거해야 합니다.

참고: AWS KMS 암호화를 사용하는 대신 AES-256을 사용하여 객체를 암호화합니다.

다음 방법을 사용하여 버킷의 객체가 KMS로 암호화되었는지 확인할 수 있습니다.

  • Amazon S3 콘솔을 사용하여 객체의 속성을 확인합니다. Encryption 대화 상자를 검토합니다. AWS-KMS가 선택되어 있는 경우 객체는 KMS로 암호화된 것입니다.
  • AWS Command Line Interface(AWS CLI)를 사용하여 head-object 명령을 실행합니다. 명령 실행 결과 ServerSideEncryption이 aws:kms로 반환되는 경우 객체가 KMS로 암호화된 것입니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

Amazon S3 콘솔을 사용하여 객체의 암호화 설정을 변경하려면 Amazon S3 암호화 지정을 참조하세요.

AWS CLI를 사용하여 객체의 암호화 설정을 변경하려면 객체의 버킷에 기본 암호화가 없는지 확인합니다. 버킷에 기본 암호화가 없으면 객체를 자체적으로 복사하여 객체의 암호화를 제거합니다.

 

aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD
경고: 객체를 자체적으로 복사하면 storage-classwebsite-redirect-location에 대한 설정도 제거됩니다. 새 객체에서 이러한 설정을 유지하려면 복사 요청에서 storage-class 또는 website-redirect-location 값을 명시적으로 지정해야 합니다.

요청된 객체는 S3 버킷에 있어야 함

요청을 수행하는 사용자에게 s3:ListBucket 권한이 없는 경우 사용자에게 누락된 객체에 대한 액세스 거부 오류가 표시됩니다.

head-object AWS CLI 명령을 실행하여 버킷에 객체가 존재하는지 확인할 수 있습니다.

참고: S3 객체 이름은 대/소문자를 구분합니다. 요청에 유효한 객체 이름이 없는 경우 Amazon S3는 객체가 누락되었다고 보고합니다.

버킷에 객체가 있는 경우에는 액세스 거부 오류가 404 Not Found 오류를 마스킹하지 않는 것입니다. 액세스 거부 오류를 해결하려면 다른 구성 요구 사항을 확인합니다.

객체가 버킷에 없는 경우에는 액세스 거부 오류가 404 Not Found 오류를 마스킹하는 것입니다. 누락된 객체와 관련된 문제를 해결합니다.

참고: 퍼블릭 s3:ListBucket 액세스를 활성화하는 방법은 보안상 권장하지 않습니다. 퍼블릭 s3:ListBucket 액세스를 활성화하면 사용자가 버킷의 모든 객체를 보고 나열할 수 있습니다. 이 액세스는 사용자에게 객체 다운로드 권한이 없어도 객체 메타데이터 세부 정보(예: 키 및 크기)를 사용자에게 노출합니다.

버킷에서 Amazon S3 퍼블릭 액세스 차단을 비활성화해야 함

Amazon S3 퍼블릭 액세스 차단 설정은 개별 버킷 또는 AWS 계정에 적용될 수 있습니다. S3 버킷 또는 AWS 계정Amazon S3 퍼블릭 액세스 차단 설정이 적용되지 않았는지 확인합니다. 이러한 설정은 퍼블릭 읽기 액세스를 허용하는 권한을 재정의할 수 있습니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?