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

최종 업데이트 날짜: 2020년 10월 19일

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

간략한 설명

Amazon S3에서 액세스 거부 오류를 해결하려면 다음을 확인합니다.

  • 버킷 및 객체 소유권
  • 버킷 정책 또는 AWS Identity and Access Management(IAM) 사용자 정책
  • IAM 권한 경계
  • Amazon S3 퍼블릭 액세스 차단 설정
  • Amazon S3에 액세스하기 위한 자격 증명
  • 임시 보안 자격 증명
  • Amazon Virtual Private Cloud(Amazon VPC) 엔드포인트 정책
  • Amazon S3 액세스 포인트 정책
  • 누락된 객체
  • AWS Key Management Service(AWS KMS) 암호화
  • 버킷에 요청자 지불이 활성화됨
  • AWS Organizations 서비스 제어 정책

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

해결 방법

버킷 및 객체 소유권

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

1.    list-buckets AWS 명령줄 인터페이스(AWS CLI) 명령을 실행하여 사용자 계정에 대한 Amazon S3 정식 ID를 가져옵니다.

aws s3api list-buckets --query Owner.ID

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

2.    list-objects 명령을 실행하여 사용자가 액세스할 수 없는 객체를 소유한 계정의 Amazon S3 정식 ID를 가져옵니다.

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

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

3.    정식 ID가 일치하지 않는 경우에는 사용자(버킷 소유자)가 객체를 소유하고 있지 않은 것입니다. 객체 소유자는 put-object-acl 명령을 실행하여 객체 소유자에게 객체에 대한 전체 제어 권한을 부여할 수 있습니다.

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

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

다른 계정에서 버킷으로 복사된 모든 새 객체를 버킷 계정에서 소유하려면 버킷 소유자 전체 제어 ACL로 객체를 업로드해야 하는 버킷 정책을 설정합니다. 그런 다음 S3 객체 소유권을 활성화합니다. 그러면 객체가 버킷 소유자 전체 제어 ACL과 함께 업로드될 때 객체의 소유자를 버킷 소유자로 자동 변경합니다.

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

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

버킷 정책 또는 관련된 IAM 사용자 정책에 액세스를 거부하는 오류를 가진 잘못된 문이 있는지 검토합니다. 정책에 잘못된 거부 문, 누락된 작업 또는 잘못된 공백이 있는지 확인하십시오.

1.    거부문에 Multi-Factor Authentication(MFA), 암호화 키, 특정 IP 주소 또는 특정 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": "*"
    }
  ]
}

2.    버킷 정책 또는 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"
        ]
      }
    }
  ]
}

3.    버킷 정책 또는 IAM 사용자 정책에 추가 공백이 있지 않은지 확인합니다. 예를 들어, 다음 IAM 정책에는 Amazon 리소스 이름(ARN) arn:aws:s3::: DOC-EXAMPLE-BUCKET/*에 추가 공백이 있습니다. 이 공백으로 인해 ARN은 arn:aws:s3:::%20DOC-EXAMPLE-BUCKET/*으로 잘못 평가됩니다. 이는 IAM 사용자에게 올바른 객체에 대한 권한이 부여되지 않음을 의미합니다.

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

IAM 권한 경계

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

Amazon S3 퍼블릭 액세스 차단 설정

허용되어야 할 퍼블릭 읽기 액세스에 대한 액세스 거부 오류가 사용자에게 표시되는 경우, 버킷의 Amazon S3 퍼블릭 액세스 차단 설정을 확인합니다. 이러한 설정은 퍼블릭 읽기 액세스를 허용하는 권한을 재정의할 수 있습니다. Amazon S3 퍼블릭 액세스 차단 설정은 개별 버킷 또는 AWS 계정에 적용될 수 있습니다.

Amazon S3에 액세스하기 위한 자격 증명

사용자가 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 엔드포인트 정책

사용자가 VPC 엔드포인트를 통해 라우팅된 EC2 인스턴스로 버킷에 액세스하는 경우, VPC 엔드포인트 정책을 확인합니다. VPC 엔드포인트 정책이 S3 버킷 및 객체에 액세스하기 위한 올바른 권한을 포함하는지 확인하십시오.

예를 들어 다음 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 액세스 포인트 정책

Amazon S3 액세스 포인트를 사용하여 버킷에 대한 액세스를 관리하는 경우 액세스 포인트의 IAM 정책을 검토하십시오. 정책이 올바른 권한을 부여하는지 확인합니다.

누락된 객체

요청된 객체가 버킷에 있는지 확인합니다. 사용자에게 s3:ListBucket 권한이 없는 경우에는 사용자에게 404 찾을 수 없음 오류 대신 누락된 객체에 대한 액세스 거부 오류가 표시됩니다. head-object AWS CLI 명령을 실행하여 버킷에 객체가 존재하는지 확인합니다.

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

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

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

AWS KMS 암호화

IAM 사용자가 전체 권한을 가진 객체에 액세스할 수 없는 경우 해당 객체가 AWS KMS로 암호화되지 않았는지 확인합니다. Amazon S3 콘솔을 사용하면 객체의 암호화 정보를 포함하는 객체 속성을 볼 수 있습니다.

객체가 KMS로 암호화된 경우 KMS 키 정책이 IAM 사용자에게 다음 작업에 대한 권한을 부여하는지 확인합니다.

"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]

IAM 사용자가 AWS KMS 키와 다른 계정에 속해 있는 경우 IAM 정책에서도 이러한 권한을 부여해야 합니다.

버킷에 요청자 지불이 활성화됨

버킷에 요청자 지불이 활성화된 경우, 다른 계정의 사용자는 요청을 버킷에 전송할 때 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의 기능에 대한 자세한 내용은 조직 내 모든 기능 활성화를 참조하십시오.


이 문서가 도움이 되었습니까?


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