Amazon S3의 403 액세스 거부 오류 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 5월 13일

사용자가 내 Amazon Simple Storage Service(Amazon S3) 버킷의 객체에 액세스하려고 하지만 Amazon S3에서 403 액세스 거부 오류가 반환됩니다. 이 오류를 해결하려면 어떻게 해야 합니까?

해결 방법

AWS Systems Manager Automation 문서 사용

AWS Systems Manager에서 AWSSupport-TroubleshootS3PublicRead 자동화 문서를 사용합니다. 이 자동화 문서는 지정한 퍼블릭 S3 버킷에서 객체를 읽는 문제를 진단하는 데 도움이 됩니다.

버킷 및 객체 소유권 확인

GetObject 또는 HeadObject 요청에서 발생한 AccessDenied 오류의 경우 버킷 소유자도 객체를 소유하고 있는지 확인합니다. 또한 버킷 소유자가 읽기 권한이나 전체 제어 ACL(액세스 제어 목록) 권한을 가지고 있는지 확인합니다.

객체를 소유한 계정 확인

기본적으로 S3 객체는 해당 객체를 업로드한 AWS 계정이 소유합니다. 이는 버킷을 다른 계정에서 소유하는 경우에도 마찬가지입니다. 다른 계정에서 버킷에 객체를 업로드할 수 있는 경우 사용자가 액세스할 수 없는 객체를 소유한 계정을 확인합니다.

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

1.    list-buckets AWS Command Line Interface(AWS CLI) 명령을 실행하여 소유자 ID를 쿼리함으로써 사용자 계정에 대한 Amazon S3 정식 ID를 가져옵니다.

aws s3api list-buckets --query "Owner.ID"

2.    list-objects 명령을 실행하여 사용자가 액세스할 수 없는 객체를 소유한 계정의 Amazon S3 정식 ID를 가져옵니다. DOC-EXAMPLE-BUCKET을 버킷 이름으로 바꾸고 exampleprefix를 접두사 값으로 바꿉니다.

aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix exampleprefix

팁: 여러 객체를 확인하려면 list-objects 명령을 사용합니다.

3.    정식 ID가 일치하지 않으면 객체를 소유하지 않은 것입니다. 객체 소유자는 put-object-acl 명령을 실행하여 객체에 대한 전체 제어 권한을 부여할 수 있습니다. DOC-EXAMPLE-BUCKET을 객체가 포함된 버킷의 이름으로 바꿉니다. exampleobject.jpg를 키 이름으로 바꿉니다.

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key exampleobject.jpg --acl bucket-owner-full-control

4.    객체 소유자가 객체의 ACL을 버킷 소유자 전체 제어로 변경하면 버킷 소유자는 객체에 액세스할 수 있습니다. 그러나 ACL 변경만으로도 객체의 소유권이 변경되지 않습니다. 객체 소유자를 버킷 계정으로 변경하려면 버킷 계정에서 cp 명령을 실행하여 객체를 그 자체로 복사합니다.

모든 새 객체를 다른 계정의 버킷에 복사

1.    bucket-owner-full-control ACL과 함께 객체를 업로드해야 하는 버킷 정책을 설정합니다.

2.    S3 객체 소유권을 활성화하여 AWS 관리 콘솔에서 선호하는 버킷 소유자로 설정합니다.

그러면 객체가 bucket-owner-full-control ACL을 통해 업로드될 때 객체의 소유자가 버킷 소유자로 자동으로 업데이트됩니다.

버킷에 대한 권한이 있는 IAM 역할 생성

지속적인 교차 계정 권한의 경우 버킷에 대한 권한이 있는 계정에서 IAM 역할을 계정에 생성합니다. 그런 다음 다른 AWS 계정에 해당 IAM 역할을 수임할 권한을 부여합니다. 자세한 내용은 자습서: IAM 역할을 사용한 AWS 계정 간 액세스 권한 위임을 참조하세요.

버킷 정책 또는 IAM 사용자 정책 확인

버킷 정책 또는 관련된 IAM 사용자 정책에 액세스를 거부할 수도 있는 문이 있는지 검토합니다. 버킷에 대한 요청이 버킷 정책 또는 IAM 정책의 조건을 충족하는지 확인합니다. 정책에 잘못된 거부 문, 누락된 작업 또는 잘못된 공백이 있는지 확인합니다.

거부 문 조건

다음을 기반으로 액세스를 차단하는 조건에 대한 거부 문을 확인합니다.

  • 멀티 팩터 인증(MFA)
  • 암호화 키
  • 특정 IP 주소
  • 특정 VPC 또는 VPC 엔드포인트
  • 특정 IAM 사용자 또는 역할

참고: MFA가 필요하며 사용자가 AWS CLI를 통해 요청을 전송하는 경우, 사용자가 MFA를 사용하도록 AWS CLI를 구성하는지 확인합니다.

예를 들어, 다음 버킷 정책에서 Statement1DOC-EXAMPLE-BUCKET에서 객체(s3:GetObject)를 다운로드하기 위한 퍼블릭 액세스를 허용합니다. 그러나, Statement2는 VPC 엔드포인트 vpce-1a2b3c4d에서 수신한 요청 외에는 DOC-EXAMPLE-BUCKET에서 객체를 다운로드하기 위한 액세스를 명시적으로 거부합니다. 이 경우 거부문이 우선 권한을 가집니다. 이는 vpce-1a2b3c4d가 아닌 위치에서 객체의 다운로드를 시도하는 사용자에게 액세스가 거부됨을 의미합니다.

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Statement1",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": "*"
    },
    {
      "Sid": "Statement2",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": "vpce-1a2b3c4d"
        }
      },
      "Principal": "*"
    }
  ]
}

버킷 정책 또는 IAM 정책

버킷 정책 또는 IAM 정책이 사용자에게 필요한 Amazon S3 작업을 허용하는지 확인합니다. 예를 들어, 다음 버킷 정책은 s3:PutObjectAcl 작업을 포함하지 않습니다. IAM 사용자가 객체의 액세스 제어 목록(ACL)을 수정하려고 시도할 경우, 사용자에게 액세스 거부 오류가 표시됩니다.

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/Dave"
        ]
      }
    }
  ]
}

기타 정책 오류

버킷 정책 또는 IAM 사용자 정책에 추가 공백 또는 잘못된 ARN이 있지 않은지 확인합니다.

예를 들어, IAM 정책에는 Amazon 리소스 이름(ARN) arn:aws:s3::: DOC-EXAMPLE-BUCKET/*에 추가 공백이 있습니다. 이 경우 ARN은 arn:aws:s3:::%20DOC-EXAMPLE-BUCKET/으로 잘못 평가되고 IAM 사용자에게 액세스 거부 오류가 발생합니다.

IAM 권한 경계가 Amazon S3에 대한 액세스를 허용하는지 확인

버킷에 액세스하려는 IAM 자격 증명에 설정된 IAM 권한 경계를 검토합니다. IAM 권한 경계가 Amazon S3에 대한 액세스를 허용하는지 확인합니다.

버킷의 Amazon S3 퍼블릭 액세스 차단 설정 확인

허용되는 퍼블릭 읽기 요청에서 액세스 거부 오류가 발생하는 경우, 버킷의 Amazon S3 퍼블릭 액세스 차단 설정을 확인합니다.

계정과 버킷 수준 모두에서 S3 퍼블릭 액세스 차단 설정을 검토합니다. 이러한 설정은 퍼블릭 읽기 액세스를 허용하는 권한을 재정의할 수 있습니다. Amazon S3 퍼블릭 액세스 차단 설정은 개별 버킷 또는 AWS 계정에 적용될 수 있습니다.

사용자 자격 증명 검토

사용자가 Amazon S3에 액세스하기 위해 구성한 자격 증명을 검토합니다. AWS SDK 및 AWS CLI는 버킷에 액세스할 수 있는 IAM 사용자 또는 역할의 자격 증명을 사용하도록 구성되어야 합니다.

AWS CLI에서 configure 명령을 실행하여 구성된 자격 증명을 확인합니다.

aws configure list

사용자가 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 통해 버킷에 액세스하는 경우, 해당 인스턴스가 올바른 역할을 사용하는지 확인합니다. 인스턴스에 연결한 다음 get-caller-identity 명령을 실행합니다.

aws sts get-caller-identity

임시 보안 자격 증명 검토

AWS Security Token Service(AWS STS)를 사용하여 부여된 임시 보안 자격 증명에서 액세스 거부 오류가 발생하는 경우 관련 세션 정책을 검토합니다. 관리자가 AssumeRole API 호출 또는 assume-role 명령을 사용하여 임시 보안 자격 증명을 생성하는 경우 세션별 정책을 전달할 수 있습니다.

Amazon S3에서 액세스 거부 오류와 관련된 세션 정책을 찾으려면 AWS CloudTrail 이벤트 기록 내에서 AssumeRole 이벤트를 찾습니다. Amazon S3에 액세스하기 위해 실패한 요청과 동일한 기간의 AssumeRole 이벤트를 찾아야 합니다. 그런 다음 관련 CloudTrail 로그의 requestParameters 필드에서 policy 또는 PolicyARN 파라미터를 검토합니다. 연결된 정책 또는 정책 ARN이 필요한 Amazon S3 권한을 부여하는지 확인합니다.

예를 들어, 다음 CloudTrail 로그 조각은 임시 자격 증명이 DOC-EXAMPLE-BUCKETs3:GetObject 권한을 부여하는 인라인 세션 정책을 포함하고 있음을 보여줍니다.

"requestParameters": {
        "roleArn": "arn:aws:iam::123412341234:role/S3AdminAccess",
        "roleSessionName": "s3rolesession",
        "policy": "{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n  {\n  \"Effect\": \"Allow\",\n           
         \"Action\": [\n   \"s3:GetObject\"\n ],\n    \"Resource\": [\n \"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*\"\n  ]\n   }  }\n    ]\n}\n"
    }

Amazon VPC 엔드포인트 정책에 S3 버킷 및 객체에 액세스할 수 있는 올바른 권한이 포함되어 있는지 확인

사용자가 VPC 엔드포인트를 통해 라우팅된 EC2 인스턴스로 버킷에 액세스하는 경우, VPC 엔드포인트 정책을 확인합니다.

예를 들어 다음 VPC 엔드포인트 정책은 DOC-EXAMPLE-BUCKET에 대한 액세스만 허용합니다. 이 VPC 엔드포인트를 통해 요청을 전송하는 사용자는 다른 버킷에 액세스할 수 없습니다.

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Principal": "*"
    }
  ]
}

Amazon S3 액세스 포인트의 IAM 정책 검토

Amazon S3 액세스 포인트를 사용하여 버킷에 대한 액세스를 관리하는 경우 액세스 포인트의 IAM 정책을 검토합니다.

액세스 포인트 정책에서 부여된 권한은 기본 버킷 정책에서도 동일한 액세스를 허용하는 경우에만 유효합니다. 버킷 정책과 액세스 포인트 정책이 올바른 권한을 부여하는지 확인합니다.

객체가 누락되지 않았는지 또는 객체에 특수 문자가 포함되어 있는지 확인

요청된 객체가 버킷에 있는지 확인합니다. 그렇지 않으면 요청에서 객체를 찾지 못하고 Amazon S3는 객체가 존재하지 않는다고 가정합니다. 적절한 s3:ListBucket 권한이 없으면 404 찾을 수 없음 오류 대신 액세스 거부 오류가 표시됩니다.

특수 문자(예: 공백)가 있는 객체를 검색하려면 특수 처리가 필요합니다.

head-object AWS CLI 명령을 실행하여 버킷에 객체가 존재하는지 확인합니다. DOC-EXAMPLE-BUCKET을 확인하려는 버킷의 이름으로 바꿉니다.

aws s3api head-object --bucket DOC-EXAMPLE-BUCKET --key exampleobject.jpg

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

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

AWS KMS 암호화 구성 확인

AWS KMS(SSE-KMS) 암호화에 대한 다음 사항에 유의합니다.

  • IAM 사용자가 전체 권한을 가진 객체에 액세스할 수 없는 경우 해당 객체가 SSE-KMS로 암호화되었는지 확인합니다. Amazon S3 콘솔을 사용하여 객체의 서버 측 암호화 정보를 포함하는 객체 속성을 볼 수 있습니다.
  • 객체가 SSE-KMS로 암호화된 경우 KMS 키 정책이 IAM 사용자에게 키 사용에 필요한 최소 권한을 부여하는지 확인합니다. 예를 들어 IAM 사용자가 S3 객체를 다운로드하기 위해서만 키를 사용하는 경우 IAM 사용자는 kms:Decrypt 권한이 있어야 합니다. 자세한 내용은 AWS 계정에 대한 액세스 허용 및 IAM 정책 활성화를 참조하세요.
  • IAM 자격 증명 및 키가 동일한 계정에 있는 경우 키 정책을 사용하여 kms:Decrypt 권한을 부여해야 합니다. 키 정책은 IAM 정책과 동일한 IAM 자격 증명을 참조해야 합니다.
  • IAM 사용자가 AWS KMS 키가 아닌 다른 계정에 속한 경우 IAM 정책에서도 이러한 권한을 부여해야 합니다. 예를 들어 SSE-KMS 암호화된 객체를 다운로드하려면 키 정책과 IAM 정책 모두에 KMS:Decrypt 권한을 지정해야 합니다. IAM 사용자와 KMS 키 간의 교차 계정 액세스에 대한 자세한 내용은 다른 계정의 사용자가 KMS 키를 사용하도록 허용을 참조하세요.

request-payer 파라미터가 사용자에 의해 지정되었는지 확인(요청자 지불을 사용하는 경우)

버킷에 요청자 지불이 활성화된 경우, 다른 계정의 사용자는 요청을 버킷에 전송할 때 request-payer 파라미터를 지정해야 합니다. 요청자 지불이 활성화되어 있는지 확인하려면 Amazon S3 콘솔을 사용하여 버킷의 속성을 확인합니다.

다음 예제 AWS CLI 명령에는 요청자 지불이 있는 교차 계정 버킷에 액세스하기 위한 올바른 파라미터가 포함되어 있습니다.

aws s3 cp exampleobject.jpg s3://DOC-EXAMPLE-BUCKET/exampleobject.jpg --request-payer requester

AWS Organizations 서비스 제어 정책 확인

AWS Organizations를 사용하는 경우 서비스 제어 정책을 확인하여 Amazon S3에 대한 액세스가 허용되는지 확인합니다. 서비스 제어 정책은 영향을 받는 계정에 대한 최대 권한을 지정합니다. 예를 들어, 다음 정책은 Amazon S3에 대한 액세스를 명시적으로 거부하므로 액세스 거부 오류를 발생시킵니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

AWS Organizations의 기능에 대한 자세한 내용은 조직 내 모든 기능 활성화를 참조하세요.


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


결제 또는 기술 지원이 필요합니까?