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

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

8분 분량
0

사용자가 Amazon Simple Storage Service(Amazon S3) 버킷의 객체에 액세스하려고 하는데 Amazon S3에서 403 액세스 거부 오류를 반환합니다.

해결 방법

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

AWS Systems Manager Automation 문서 사용

지정된 퍼블릭 S3 버킷에서 객체를 읽을 때 발생하는 문제를 파악하는 데 도움이 되도록 AWS Systems Manager의 AWSSupport-TroubleshootS3PublicRead 자동화 문서를 사용하십시오.

버킷 및 객체 소유권 설정 확인

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

참고: 새 버킷을 생성하면 기본적으로 ACL이 비활성화됩니다. ACL 대신 AWS Identity and Access Management(IAM) 정책을 사용하여 S3 리소스에 대한 액세스를 제어하는 것이 가장 좋습니다.

객체를 소유한 계정 확인

기본적으로 객체가 저장된 버킷을 소유한 AWS 계정이 객체도 소유합니다. 다른 계정에서 버킷에 객체를 업로드할 수 있는 경우, 사용자가 액세스할 수 없는 객체의 권한을 확인하십시오.

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

  1. list-buckets AWS CLI 명령을 실행하여 계정의 Amazon S3 표준 ID를 가져옵니다.

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

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

    참고: DOC-EXAMPLE-BUCKET을 버킷의 이름으로, 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

    참고: DOC-EXAMPLE-BUCKET을 객체가 포함된 버킷 이름으로, exampleobject.jpg를 키 이름으로 바꾸십시오.

  4. 객체 소유자가 객체의 ACL을 bucket-owner-full-control로 변경하면 버킷 소유자가 객체에 액세스할 수 있습니다. 또한 객체 소유자를 버킷 계정으로 변경하려면 버킷 계정에서 cp 명령을 실행하여 객체를 자체적으로 복사합니다.

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

IAM 역할과 버킷 소유자가 동일한 계정에 속해 있는 경우 IAM 역할 또는 버킷에 권한이 있어야 합니다. IAM 역할과 버킷 모두에 대한 권한은 필요하지 않습니다.

여러 계정에 권한을 추가하려면 버킷에 대한 권한이 있는 IAM 역할을 계정에 생성합니다. 그런 다음 다른 계정에 IAM 역할을 맡을 권한을 부여합니다. 자세한 내용은, IAM 자습서: IAM 역할을 사용하여 AWS 계정 전체에 대한 액세스 위임을 참조하십시오.

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

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

거부 문 조건

Deny 문에서 다음을 기준으로 액세스를 차단하는 조건을 확인합니다.

  • 다중 인증(MFA)
  • 암호화 키
  • 특정 IP 주소
  • 특정 가상 프라이빗 클라우드(VPC) 또는 VPC 엔드포인트
  • 특정 IAM 사용자 또는 역할

참고: MFA가 필요하고 사용자가 AWS CLI를 사용하여 요청을 보내는 경우, 사용자가 MFA를 사용하도록 AWS CLI를 구성해야 합니다.

예를 들어, 다음 버킷 정책에서 Statement1은 공개 액세스를 통해 DOC-EXAMPLE-BUCKET에서 객체(s3:GetObject)를 다운로드할 수 있도록 허용합니다. 하지만 Statement2는 요청이 VPC 엔드포인트 vpce-1a2b3c4d에서 오는 경우를 제외하고 DOC-EXAMPLE-BUCKET에서 객체를 다운로드하기 위한 모든 사용자의 액세스를 명시적으로 거부합니다. Deny 문이 Allow 문보다 우선순위가 높기 때문에 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 작업에 대한 권한이 포함되어 있지 않습니다.

{  
  "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 사용자가 객체의 ACL을 수정하려고 하면 사용자에게 액세스 거부 오류가 발생합니다.

기타 정책 오류

버킷 정책 또는 IAM 사용자 정책에 추가 공백, 잘못된 ARN 또는 기타 오타가 있는지 확인합니다.

IAM 정책의 ARN에 추가 공백이 있는 경우 ARN이 잘못 평가되어 사용자에게 액세스 거부 오류가 발생합니다. 예를 들어 IAM 정책의 ARN에 arn:aws:s3::: DOC-EXAMPLE-BUCKET/*와 같이 추가 공백이 있으면 **arn:aws:s3:::%20DOC-EXAMPLE-BUCKET/**으로 평가됩니다.

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

IAM 엔터티에 설정된 IAM 권한 범위가 Amazon S3에 대한 액세스를 허용하는지 확인합니다.

버킷의 Amazon S3 Block Public Access 설정 확인

허용된 퍼블릭 읽기 요청에서 액세스 거부 오류가 발생하는 경우, 계정과 버킷에서 버킷의 Amazon S3 Block Public Access 설정을 확인합니다. 이러한 설정은 퍼블릭 읽기 액세스를 허용하는 권한을 무시할 수 있습니다.

사용자 자격 증명 검토

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

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 명령을 사용하여 임시 보안 자격 증명을 생성할 때 관리자는 세션별 정책을 전달할 수 있습니다.

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

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

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

Amazon VPC 엔드포인트 정책에 S3 리소스에 액세스할 수 있는 올바른 권한이 있는지 확인

사용자가 Amazon Virtual Private Cloud (Amazon 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 명령을 실행하여 객체가 버킷에 있는지 확인합니다.

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

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

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

객체가 버킷에 없으면 액세스 거부 오류가 404 찾을 수 없음 오류를 가립니다. 누락된 개체와 관련된 문제를 해결하십시오.

AWS KMS 암호화 구성 확인

IAM 사용자가 객체에 대한 전체 권한을 가지고 있지만 여전히 객체에 액세스할 수 없는 경우, 객체에 AWS Key Management Service(AWS KMS) 암호화(SSE-KMS)가 있는지 확인합니다. Amazon S3 콘솔을 사용하여 객체의 속성을 보고 객체의 SSE-KMS 정보를 확인할 수 있습니다.

고객 관리 키로 객체를 암호화한 경우 KMS 키 정책에서 kms:GenerateDataKey 또는 kms:Decrypt 작업을 수행하도록 허용해야 합니다. 자세한 내용은 AWS 계정에 대한 액세스 허용 및 IAM 정책 활성화를 참조하십시오.

IAM 사용자가 AWS KMS 키가 아닌 다른 계정에 속해 있는 경우 Kms:Decrypt 권한을 부여하도록 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 SCP 확인

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

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

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

관련 정보

Amazon S3의 액세스 거부(403 금지됨) 오류 해결

AWS Support를 위한 Amazon S3 요청 ID 가져오기

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