내용으로 건너뛰기

Amazon S3 정적 웹 사이트 호스팅 엔드포인트를 사용할 때 "Access Denied" 오류가 발생하는 이유는 무엇입니까?

5분 분량
0

Amazon Simple Storage Service(Amazon S3) 버킷을 사용하여 S3 정적 웹 사이트 호스팅 엔드포인트가 있는 정적 웹 사이트를 호스팅했습니다. S3 정적 웹 사이트 호스팅 엔드포인트에서 발생한 "Access Denied" 오류 문제를 해결하려고 합니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

버킷의 객체를 공개적으로 액세스할 수 있음

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

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

http://doc-example-bucket.s3-website-us-east-1.amazonaws.com/index.html

웹 브라우저 또는 curl 명령에서 Access Denied 오류가 반환되는 경우, 해당 객체는 공개적으로 액세스할 수 없습니다. 이 문제를 해결하려면 버킷의 모든 객체에 대한 퍼블릭 읽기 액세스를 허용하는 버킷 정책을 생성하십시오.

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

버킷 정책에 s3:GetObject 작업에 대한 퍼블릭 읽기 액세스를 차단하는 Deny 문이 포함되어 있는지 확인하십시오. 버킷 정책에 s3:GetObject에 대한 명시적 Allow 문이 있더라도 명시적 거부 문이 항상 명시적 허용 문보다 우선합니다.

버킷 정책을 확인하려면 다음 단계를 완료하십시오.

  1. Amazon S3 콘솔을 열고 버킷을 선택합니다.
  2. 권한 탭을 선택합니다.
  3. 버킷 정책에서 **"Action": "s3:GetObject" 또는 "Action": "s3:*"**가 포함된 명령문을 검토합니다.
  4. 명령문이 s3:GetObject에 대한 퍼블릭 읽기 액세스를 차단하는 경우 버킷 정책을 수정합니다.

버킷을 소유한 계정이 객체도 소유해야 함

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

참고: S3 객체 소유권은 객체의 액세스 제어 목록(ACL)에서 부여하는 퍼블릭 읽기 권한에는 적용되지 않습니다.

Amazon S3 콘솔을 사용하여 버킷 및 객체 소유자를 확인할 수 있습니다. 버킷 또는 객체의 권한 탭에서 소유자를 찾을 수 있습니다.

AWS CLI를 사용하여 동일한 계정이 Amazon S3 버킷과 객체를 소유하는지 확인하려면 다음 단계를 완료하십시오.

  1. 버킷 소유자의 S3 정식 ID를 검색하려면 list-buckets 명령을 실행합니다.

    aws s3api list-buckets --query Owner.ID
    
  2. 객체 소유자의 S3 정식 ID를 검색하려면 list-objects 명령을 실행합니다.

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

    참고: 위 명령은 단일 객체를 반환합니다. 여러 객체를 확인하려면 list 명령을 실행하십시오.

  3. 버킷 및 객체 소유자의 정식 ID가 일치하지 않는 경우 객체 소유자를 버킷 소유자로 변경합니다. 객체 소유자 계정에서 get-object-acl 명령을 실행하여 객체에 할당된 ACL 권한을 검색합니다.

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
    
  4. 객체에 bucket-owner-full-control ACL 권한이 없는 경우, 객체 소유자 계정에서 put-object-acl 명령을 실행합니다.

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
    
  5. 객체에 bucket-owner-full-control ACL 권한이 있으면 버킷 소유자 계정에서 다음 명령을 실행합니다.

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

    참고: 위의 명령은 객체 자체를 복사하고 해당 객체의 소유자를 변경합니다.

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

객체에 AWS KMS 암호화를 사용할 수 없음

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

참고: AWS KMS 암호화 대신 Amazon S3 관리형 키를 사용한 서버 측 암호화를 사용하여 객체를 암호화하십시오.

객체에 KMS 암호화를 사용했는지 여부를 확인하려면 Amazon S3 콘솔을 사용할 수 있습니다. 객체 개요 페이지의 암호화 대화 상자에서 AWS-KMS가 선택되어 있는지 확인하십시오. 또한 head-object AWS CLI 명령을 실행할 수도 있습니다. 명령이 서버 측 암호화aws:kms로 반환하면 해당 객체가 AWS KMS로 암호화된 것입니다.

Amazon S3 콘솔을 사용하여 객체의 암호화 설정을 변경하려면 Amazon S3 관리형 키(SSE-S3)를 사용한 서버 측 암호화 지정을 참조하십시오.

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

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

경고: 객체를 자체 복사하면 Amazon S3에서 storage-classwebsite-redirect-location에 대한 설정을 제거합니다. 새 객체에서 이러한 설정을 유지하려면 복사 요청에서 storage-class 또는 website-redirect-location 값을 명시적으로 지정해야 합니다.

버킷에서 버전 관리를 활성화한 경우 암호화를 변경하면 기본 암호화로 객체의 새 버전이 생성됩니다.

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

요청을 수행하는 사용자에게 s3:ListBucket 권한이 없는 경우 누락된 객체에 대해 Access Denied 오류가 발생합니다.

객체가 버킷에 있는지 확인하려면 head-object AWS CLI 명령을 실행하십시오.

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

객체가 버킷에 있는 경우 Access Denied 오류는 404 Not Found 오류를 마스킹하지 않습니다. Access Denied 오류를 해결하려면 다른 구성 요구 사항을 확인하십시오.

객체가 버킷에 없는 경우 Access Denied 오류는 404 Not Found 오류를 마스킹합니다. 누락된 개체와 관련된 문제를 해결하십시오.

참고: 퍼블릭 s3:ListBucket 액세스를 활성화하지 않는 것이 보안 모범 사례입니다. 퍼블릭 s3:ListBucket 액세스를 사용하면 사용자가 버킷의 모든 객체를 보고 나열할 수 있습니다. 이 액세스를 사용하면 사용자에게 객체 다운로드 권한이 없더라도 키 및 크기와 같은 객체 메타데이터 세부 정보가 사용자에게 노출됩니다.

버킷에서 Amazon S3 Block Public Access 끄기

Amazon S3 Block Public Access는 퍼블릭 읽기 액세스를 허용하는 권한을 재정의할 수 있습니다. Amazon S3 Block Public Access 설정을 S3 버킷 또는 계정에 구성하지 않았는지 확인하십시오. 

관련 정보

Application Load Balancer, S3 및 AWS PrivateLink를 사용하여 내부 HTTPS 정적 웹 사이트 호스팅

AWS 공식업데이트됨 일 년 전
댓글 없음

관련 콘텐츠