내용으로 건너뛰기

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

6분 분량
0

Amazon CloudFront가 Amazon Simple Storage Service(Amazon S3)에서 반환하는 ‘403 Access Denied’ 오류를 해결하고 싶습니다.

간략한 설명

‘Access Denied’ 오류를 방지하려면 다음 구성을 사용하십시오.

  • S3 객체를 공개적으로 액세스할 수 있도록 설정합니다.
  • AWS Key Management Service(AWS KMS)로 서버 측에서 암호화된 객체를 포함하는 S3 버킷에 대해 오리진 액세스 제어(OAC)를 사용합니다.
    참고: OAI는 AWS KMS 암호화 객체를 제공하지 않기 때문에 오리진 액세스 ID(OAI) 대신 OAC를 사용해야 합니다.
  • s3:GetObject에 대한 액세스를 허용하도록 S3 버킷 정책을 수정합니다.
  • S3 버킷을 소유한 AWS 계정이 객체도 소유하는지 확인합니다.
  • 요청된 객체가 S3 버킷에 있는지 확인합니다.
  • 클라이언트가 배포의 루트를 요청할 수 있도록 기본 루트 객체를 정의합니다.
  • OAI 구성의 경우 S3 버킷 정책에 OAI를 포함해야 합니다. OAC 구성의 경우 S3 버킷 정책에 CloudFront 서비스 위탁자를 포함해야 합니다.

해결 방법

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

S3 객체를 공개적으로 액세스할 수 있도록 설정

S3 버킷의 객체에 공개적으로 액세스할 수 있는지 확인하려면 웹 브라우저에서 S3 객체의 URL을 엽니다. 또는 URL에서 curl 명령을 실행합니다.

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

https://DOC-EXAMPLE-BUCKET.s3.amazonaws.com/index.html

웹 브라우저 또는 curl 명령에서 ‘Access Denied’ 오류가 반환되는 경우 해당 객체는 공개적으로 액세스할 수 없습니다.

객체를 공개적으로 액세스할 수 있도록 하려면 다음 작업 중 하나를 수행하십시오.

AWS KMS로 암호화된 객체에 OAC 사용

OAC를 사용하려면 CloudFront 서비스 위탁자에게 키 사용 권한을 부여하는 명령문을 AWS KMS 키 정책에 추가합니다. OAC 대신 Lambda@Edge를 사용할 수도 있습니다. 자세한 내용은 CloudFront를 사용하여 S3에서 SSE-KMS로 암호화된 콘텐츠 제공을 참조하십시오.

AWS KMS로 객체를 암호화했는지 확인하려면 다음 작업 중 하나를 수행하십시오.

  • S3 콘솔을 사용하여 객체의 속성을 봅니다. 암호화 대화 상자를 검토합니다. AWS KMS를 선택한 경우 객체는 AWS KMS로 암호화됩니다.
  • head-object 명령을 실행합니다. 명령이 ServerSideEncryptionaws:kms로 반환하면 객체는 AWS KMS로 암호화된 것입니다.

s3:GetObject에 대한 액세스 허용

버킷 정책에 s3:GetObject에 대한 명시적 Allow 문이 있더라도 명시적 Deny 문과 충돌하지 않는지 확인하십시오. 명시적 Deny 문은 명시적 Allow 문보다 우선합니다. DenyAllow 문에 대한 자세한 내용은 정책 평가 로직을 참조하십시오.

버킷 정책이 s3:GetObject를 허용하고 명시적 Deny 문은 허용하지 않는지 확인하려면 다음 단계를 완료하십시오.

  1. Amazon S3 콘솔을 엽니다.

  2. 버킷을 선택합니다.

  3. 권한 탭을 선택합니다.

  4. 버킷 정책을 선택합니다.

  5. "Action": "s3:GetObject" 또는 **"Action": "s3:*"**가 포함된 명령문이 있는지 확인합니다.
    다음 예제 정책에는 CloudFront OAC 및 CloudFront OAI에 s3:GetObject에 대한 액세스 권한을 부여하는 Allow 문이 포함되어 있습니다. 또한 s3:GetObject에 대한 퍼블릭 액세스 권한을 부여하는 Allow 문도 포함되어 있습니다. 그러나 특정 Amazon Virtual Private Cloud(Amazon VPC)에서 요청하지 않는 한 s3:GetObject에는 액세스를 차단하는 명시적 Deny 문이 있습니다.

    {    "Version": "2012-10-17",  
      "Id":  
        "PolicyForCloudFrontPrivateContent",  
      "Statement": [{  
          "Sid": "Allow-OAC-Access-To-Bucket",  
            "Effect": "Allow",  
            "Principal":  
        {  
                "Service": "cloudfront.amazonaws.com"  
            },  
            "Action": "s3:GetObject",  
    
        "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",  
            "Condition": {  
                "StringEquals": {  
    
        "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"  
                }  
            }  
          },  
    
        {  
          "Sid": "Allow-OAI-Access-To-Bucket",  
          "Effect": "Allow",  
          "Principal": {  
            "AWS": "arn:aws:iam::cloudfront:user/CloudFront  
        Origin Access Identity EAF5XXXXXXXXX"  
          },  
          "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"  
            }  
          }  
        }  
      ]  
    }
  6. 버킷 정책을 수정하여 s3:GetObject에 대한 CloudFront OAI, CloudFront OAC 또는 퍼블릭 액세스를 차단하는 문을 제거하거나 편집합니다.

참고: CloudFront는 ‘Access Denied’ 오류의 결과를 최대 5분 동안 캐시합니다. 버킷 정책에서 Deny 문을 제거한 후 배포에서 무효화를 실행하여 캐시에서 객체를 제거할 수 있습니다.

S3 버킷 및 객체 소유권 부여

버킷 또는 객체를 생성한 AWS Identity and Access Management(IAM) ID 계정이 해당 버킷 또는 객체를 소유하고 있는지 확인합니다.

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

버킷과 객체의 소유자가 동일한지 확인하려면 다음 단계를 완료하십시오.

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

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

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

    참고: 위 예제 명령은 단일 객체를 보여 주지만 list-objects 명령을 실행하여 여러 객체를 확인할 수 있습니다.

정식 ID가 일치하지 않으면 버킷과 객체의 소유자가 다른 것입니다.

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

객체 소유자를 버킷 소유자로 변경하려면 다음 단계를 완료하십시오.

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

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
  2. 객체에 bucket-owner-full-control ACL 권한이 있는 경우 3단계로 진행합니다. 객체에 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
  3. 버킷 소유자 계정에서 다음 명령을 실행하여 객체를 복사하고 객체 소유자를 변경합니다.

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

    참고: --storage-class를 스토리지 클래스로 바꾸십시오.

객체를 버킷으로 이동

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

참고: S3 객체 이름은 대소문자를 구분합니다. CloudFront로 전송된 객체 요청이 S3 객체 이름과 일치하는지 확인합니다. 요청에 올바른 객체 이름이 없는 경우 Amazon S3는 객체가 누락된 것처럼 응답합니다. CloudFront가 Amazon S3에 요청하는 객체를 식별하려면 서버 액세스 로깅을 사용하십시오.

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

객체가 버킷에 없으면 ‘Access Denied’ 오류가 ‘404 Not Found’ 오류를 마스킹합니다. 누락된 객체와 관련된 문제를 해결해야 합니다.

기본 루트 객체 정의

기본 루트 객체를 정의하려면 기본 루트 객체 지정을 참조하십시오.

참고: 퍼블릭 s3:ListBucket 액세스를 거부하는 것이 보안 모범 사례입니다. 퍼블릭 s3:ListBucket 액세스를 허용하면 사용자는 버킷의 모든 객체를 보고 나열할 수 있습니다. 이렇게 하면 키 및 크기와 같은 객체 메타데이터 세부 정보가 모든 사용자에게 노출됩니다.

S3 버킷 정책에 OAI 또는 CloudFront 서비스 위탁자 권한 추가

버킷 정책이 OAI를 허용하는지 확인하려면 Amazon S3 콘솔을 여십시오. 버킷을 찾은 다음, 권한 탭에서 버킷 정책을 선택합니다.

다음 예제 정책에는 OAC를 구성할 때 CloudFront 서비스 위탁자에 대한 Allow 문이 포함되어 있습니다.

{                "Sid": "Allow-OAC-Access-To-Bucket",  
        "Effect": "Allow",  
        "Principal": {  

    "Service": "cloudfront.amazonaws.com"  
        },  
        "Action": "s3:GetObject",  
        "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",  

    "Condition": {  
            "StringEquals": {  
                "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EDFDVBD6EXAMPLE"  

    }  
     }  
      }

다음 예제 정책에는 OAI에 대한 Allow 문이 포함되어 있습니다.

{    "Sid": "1",  
  "Effect": "Allow",  
  "Principal": {  
    "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin  
    Access Identity EAF5XXXXXXXXX"  
  },  
  "Action": "s3:GetObject",  
  "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"  
}

CloudFront 콘솔에서 버킷 정책을 업데이트하려면 다음 단계를 완료하십시오.

  1. CloudFront 콘솔을 엽니다.
  2. 배포를 선택합니다.
  3. 오리진 및 오리진 그룹 탭을 선택합니다.
  4. S3 오리진을 선택한 다음, 편집을 선택합니다.
  5. 버킷 액세스 제한에서 를 선택합니다.
  6. 원본 액세스 ID에서 기존 ID를 선택하거나 새 ID를 생성합니다.
  7. 버킷에 읽기 권한 부여에서 예, 버킷 정책 업데이트를 선택합니다.
  8. 예, 편집을 선택합니다.

관련 정보

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

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

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