AWS re:Post을(를) 사용하면 다음에 동의하게 됩니다. AWS re:Post 이용 약관

Amazon S3 웹사이트 엔드포인트를 CloudFront 배포의 오리진으로 사용할 때 “403 Access Denied” 오류가 발생하는 이유는 무엇입니까?

7분 분량
0

내 Amazon CloudFront 배포의 오리진으로 Amazon Simple Storage Service(S3) 버킷을 사용하고 있습니다. “403 access denied” 오류 문제를 해결하고 싶습니다.

해결 방법

Amazon S3 웹 사이트 엔드포인트를 오리진으로 사용하는 CloudFront 배포 문제를 해결하려면 다음 작업을 완료합니다.

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인합니다.

버킷의 객체 암호화를 검토

AWS Key Management Service(AWS KMS)는 익명 요청을 지원하지 않습니다. 익명 또는 퍼블릭 액세스를 허용하는 Amazon S3 버킷은 AWS KMS로 암호화된 객체에 이 액세스를 적용하지 않습니다. 제공하려는 S3 객체에서 AWS KMS 암호화를 제거합니다. AWS KMS 암호화 대신 AES-256 을 사용하여 객체를 암호화합니다.

객체가 AWS KMS로 암호화되었는지 확인

버킷의 객체가 AWS KMS로 암호화되었는지 확인하려면 다음 작업을 완료하십시오.

Amazon S3 콘솔에서 객체의 속성을 확인합니다. 암호화 대화 상자에서 AWS-KMS를 선택한 경우 객체는 AWS KMS로 암호화됩니다.

또는 AWS CLI를 실행하여 head-object 명령을 실행합니다. 명령이 ServerSideEncryptionaws:kms로 반환하면 객체는 AWS KMS로 암호화됩니다.

객체의 암호화 설정 변경

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

AWS CLI를 사용하여 객체의 암호화 설정을 변경하려면 객체 버킷에 AWS KMS가 기본 암호화로 포함되어 있지 않은지 확인합니다. 버킷의 기본 암호화로 AWS KMS가 있는 경우, 암호화를 SSE-S3 암호화로 변경합니다.

버킷에 기본 암호화가 없는 경우 다음 명령을 실행하여 객체를 자체적으로 복사하고 객체 암호화를 제거합니다.

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

참고: DOC-EXAMPLE-BUCKET을 해당 버킷 이름으로 바꾸십시오. 객체를 복사하면 storage-classwebsite-redirect-location에 대한 설정이 제거됩니다. 새 객체에서 이러한 설정을 유지하려면 복사 요청에서 이러한 값을 명시적으로 지정합니다.

버킷 정책 검토

버킷 정책에는 s3:GetObject 작업에 대한 퍼블릭 읽기 액세스를 차단하는 거부 명령문이 있을 수 없습니다.

s3:GetObject에 대한 명시적 allow 문이 있는 경우, 해당 명령문과 충돌하는 명시적 거부 명령문이 없는지 확인합니다. 명시적 거부문은 항상 명시적 허용문보다 우선합니다.

s3:GetObject에 대한 버킷 정책을 검토하려면 다음 단계를 완료하십시오.

  1. Amazon S3 콘솔을 연 다음 S3 버킷으로 이동합니다.
  2. 권한 탭을 선택합니다.
  3. 버킷 정책을 선택합니다.
  4. 버킷 정책에서 "Action": " s3:GetObject " 또는 **" Action": " s3:* "**가 포함된 명령문을 검토합니다.
  5. 버킷 정책을 수정하여 s3:GetObject에 대한 퍼블릭 읽기 액세스를 차단하는 명령문을 제거하거나 편집합니다.

예를 들어, 다음 정책에는 s3:GetObject에 대한 퍼블릭 액세스를 위한 명시적 허용 명령문이 포함되어 있습니다. 하지만 특정 Amazon Virtual Private Cloud(Amazon VPC)에서 요청하지 않는 한 s3:GetObject 액세스에 대한 명시적인 거부 명령문도 포함되어 있습니다. s3:GetObject 작업을 허용하도록 이 정책을 수정합니다.

{
  "Version": "2012-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "Sid": "Allow-OAI-Access-To-Bucket",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5#########"
      },
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ]
    },
    {
      "Sid": "Allow-Public-Access-To-Bucket",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ]
    },
    {
      "Sid": "Access-to-specific-VPCE-only",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "StringNotEquals": {
          "aws:sourceVpce": "vpce-1a2b3c4d"
        }
      }
    }
  ]
}

다음 정책은 S3 웹 사이트 엔드포인트에 대한 읽기 전용 퍼블릭 액세스를 허용하는 Amazon S3 버킷 정책의 예입니다.

{
   "Version": "2012-10-17",
    "Statement": {
    "Sid": "AllowPublicReadOnly",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
  }
}

버킷 및 객체 소유권 검토

객체에 대한 퍼블릭 읽기 액세스를 허용하는 버킷 정책의 경우, 버킷을 소유한 AWS 계정이 객체도 소유해야 합니다.

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

버킷과 객체의 소유자가 동일한지 확인

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

AWS CLI를 사용하여 버킷 및 객체 소유자를 확인하려면 다음 명령을 실행합니다.

list-buckets 명령을 실행하여 버킷 소유자의 S3 정식 ID를 가져옵니다.

aws s3api list-buckets --query Owner.ID

list-objects 명령을 실행하여 객체 소유자의 S3 정식 ID를 가져옵니다.

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

**참고:**위 예제 명령의 출력은 단일 객체를 보여 주지만 list-objects 명령을 사용하여 여러 객체를 확인할 수 있습니다. 정식 ID가 일치하지 않으면 버킷과 객체의 소유자가 다른 것입니다.

객체 소유권 업데이트

S3 객체 소유권을 사용하여 버킷 소유자는 객체의 소유권을 관리할 수 있습니다. S3 객체 소유권 설정은 모든 새 S3 버킷에 대해 기본적으로 활성화됩니다. 기존 버킷을 업데이트하려면 기존 버킷의 객체 소유권 설정을 참조하십시오.

버킷 소유자는 모든 버킷에서 S3 객체 소유권 설정을 사용하는 것이 가장 좋습니다. 또한 AWS Identity and Access Management(IAM) 역할과 버킷 정책을 통해 권한을 관리하는 것이 좋습니다.

버킷의 ACL을 제거하고 버킷의 모든 객체에 대한 소유권을 가져오려면 put-bucket-ownership-controls 명령어를 실행합니다.

aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'

S3 버킷에서 ACL을 끄지 않으려면 객체 소유자를 버킷 소유자로 변경합니다.

다음 단계를 완료하십시오.

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

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

    참고: 객체에 버킷 소유자 전체 제어 ACL 권한이 있는 경우 3단계로 건너뜁니다.

  2. 객체에 버킷 소유자 전체 제어 ACL 권한이 없는 경우, 객체 소유자 계정에서 put-object-acl 명령을 실행합니다.

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
  3. 버킷 소유자 계정에서 다음 명령을 실행하여 객체를 복사하고 객체 소유자를 변경합니다.

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

    참고: DOC-EXAMPLE-BUCKET을 해당 버킷 이름으로 바꾸십시오. DOC-EXAMPLE-BUCKET을 해당 버킷 이름으로 바꾸십시오.

버킷의 퍼블릭 액세스 차단 설정 검토

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

버킷의 객체에 퍼블릭 액세스할 수 있는지 확인

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

예시:

http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html

웹 브라우저 또는 curl 명령에서 Access Denied 오류가 반환되는 경우, 해당 객체는 퍼블릭 액세스할 수 없습니다.

퍼블릭 읽기 액세스를 허용하려면 다음 작업 중 하나를 완료하십시오.

요청자 지불 옵션 검토

요청자 지불이 켜져 있는 경우 옵션을 비활성화합니다. 요청자 지불 버킷은 웹 사이트 엔드포인트를 통한 액세스를 허용하지 않습니다.

사용자 지정 헤더 검토

참조자 헤더를 사용하여 CloudFront에서 S3 웹사이트 엔드포인트 오리진으로의 액세스를 제한하는 경우, 버킷 정책을 확인합니다. S3 버킷 정책에 설정된 암호 값 또는 토큰이 CloudFront 오리진 사용자 지정 헤더의 값과 일치하는지 확인합니다.

버킷 정책에 명시적 거부 문을 사용하려면 참조자 헤더를 기반으로 액세스를 허용하는 허용 문이 있어야 합니다. 명시적인 거부 명령문만으로는 액세스 권한을 부여할 수 없습니다.

예를 들어, 다음 버킷 정책은 요청에 “aws:Referer”:“MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER” 문자열이 포함된 경우 S3 오리진에 대한 액세스 권한을 부여합니다.

CloudFront 오리진 사용자 지정 헤더에는 다음과 같은 구성이 있어야 합니다.

  • 헤더: 참조자
  • 값: MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER

버킷 정책 예시:

{
  "Version":"2012-10-17",
  "Id":"http referer policy example",
  "Statement":[
    {
      "Sid":"Allow get requests originating from my CloudFront with referer header",
      "Effect":"Allow",
      "Principal":"*",
      "Action":"s3:GetObject",
      "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition":{
        "StringLike":{"aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"}
      }
    }
  ]
}

참고: Principal은 와일드카드 값(“Principal”:“*”)이므로 예제 버킷 정책에서는 버킷에 대한 퍼블릭(익명) 액세스 권한을 부여합니다. 조건문 때문에 요청에는 참조자 헤더가 포함되어야 하고 헤더 값은 버킷 정책의 값과 일치해야 합니다. 조건문이 충족되지 않으면 S3 오리진에 액세스할 수 없습니다.

조직의 관리 계정 검토

AWS Organizations에서 조직의 관리 계정을 사용하여 거부 서비스 제어 정책(SCP) 을 확인합니다. 조직 루트, 조직 단위(OU) 또는 계정에 직접 연결된 s3:GetObject 작업에 대한 거부 정책을 검토하십시오.

관련 정보

S3 REST API 엔드포인트를 CloudFront 배포의 오리진으로 사용할 때 403 Access Denied 오류가 발생하는 이유는 무엇입니까?

CloudFront의 오류 응답 상태 코드 문제 해결

Amazon S3의 403 Access Denied 오류 문제를 해결하려면 어떻게 해야 합니까?

CloudFront를 사용하여 Amazon S3에 호스팅되는 정적 웹 사이트를 서비스하려면 어떻게 해야 합니까?

AWS 공식
AWS 공식업데이트됨 2달 전