Amazon S3 버킷에 객체를 추가할 권한이 있는 사용자에게 액세스 거부 오류가 발생합니다. 이유는?

최종 업데이트 날짜: 2022년 7월 18일

AWS Identity and Access Management(IAM) 사용자는 Amazon Simple Storage Service(Amazon S3) 버킷에 대해 s3:PutObject 작업을 수행할 권한이 있습니다. 하지만 객체를 업로드하려고 하면 HTTP 403: 액세스 거부 오류가 발생합니다. 해결하려면 어떻게 해야 하나요?

간략한 설명

IAM 사용자에게 버킷에 업로드할 수 있는 권한이 올바르게 부여되어 있다면, 업로드를 못하게 막는 설정이 다음 정책에 포함되어 있지 않은지 확인합니다.

  • s3:PutObjectAcl에 대한 IAM 사용자 권한
  • 버킷 정책의 조건
  • Amazon Virtual Private Cloud(Amazon VPC) 엔드포인트 정책에서 허용되는 액세스
  • AWS KMS 암호화

해결 방법

s3:PutObjectAcl에 대한 IAM 사용자 권한

IAM 사용자가 업로드 중에 객체의 ACL(액세스 제어 목록)을 업데이트해야 하는 경우, 해당 사용자에게는 IAM 정책에 있는 s3:PutObjectAcl에 대한 권한도 필요합니다. 사용자의 IAM 정책을 업데이트하는 방법은 IAM 사용자의 권한 변경을 참조하세요.

버킷 정책의 조건

버킷으로의 업로드를 제한하는 다음 예와 같은 조건이 버킷 정책에 없는지 검토합니다. 버킷 정책에 조건이 있고 해당 조건이 유효한 경우 IAM 사용자가 조건을 충족해야 업로드가 작동합니다.

중요: 조건을 검토할 때 조건에 Allow 문("Effect": "Allow") 또는 Deny 문("Effect": "Deny")이 연결되어 있는지 확인하세요. 업로드가 작동하려면 사용자가 Allow 문의 조건을 충족하거나 Deny 문의 조건에 해당하지 않아야 합니다.

특정 IP 주소로부터의 업로드만 허용하는 다음과 유사한 조건이 없는지 확인합니다.

"Condition": {
  "IpAddress": {
    "aws:SourceIp": "54.240.143.0/24"
  }
}

버킷 정책에 이 조건이 있는 경우 IAM 사용자가 허용되는 IP 주소에서 버킷에 액세스해야 합니다.

객체가 특정 스토리지 클래스인 경우에만 업로드를 허용하는 다음과 유사한 조건이 없는지 확인합니다.

"Condition": {
  "StringEquals": {
    "s3:x-amz-storage-class": [
      "STANDARD_IA"
    ]
  }

정책에 이 조건이 있는 경우 사용자가 허용되는 스토리지 클래스의 객체를 업로드해야 합니다. 예를 들어, 이전 조건 문에는 STANDARD_IA 스토리지 클래스가 필요합니다. 즉, 사용자는 다음과 유사한 AWS 명령줄 인터페이스(AWS CLI) 명령을 사용하여 객체를 업로드해야 합니다.

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --storage-class STANDARD_IA

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

객체에 특정 ACL(액세스 제어 목록)이 할당된 경우에만 업로드를 허용하는 다음과 유사한 조건이 없는지 확인합니다.

"Condition": {
                "StringEquals": {
                    "s3:x-amz-acl":["public-read"]
                }
            }

정책에 이 조건이 있는 경우 사용자가 허용되는 ACL에 할당된 객체를 업로드해야 합니다. 예를 들어 위의 조건에서는 public-read ACL을 요구하므로 사용자는 다음과 유사한 명령을 사용하여 객체를 업로드해야 합니다.

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --acl public-read

업로드 시에 버킷 소유자(정규 사용자 ID)에게 객체에 대한 완벽한 제어 권한을 부여하도록 하는 다음과 같은 조건이 없는지 확인합니다.

"Condition": {
  "StringEquals": {
    "s3:x-amz-grant-full-control": "id=AccountA-CanonicalUserID"
  }
}

정책에 이 조건이 있는 경우 사용자가 다음과 유사한 명령을 사용하여 객체를 업로드해야 합니다.

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --grant-full-control id=CanonicalUserID

객체가 AWS Key Management System(AWS KMS) 키로 암호화된 경우에만 업로드를 허용하는 다음과 유사한 조건이 없는지 확인합니다.

"Condition": {<br>"StringEquals": {<br>"s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd"<br>}<br>}

정책에 이 조건이 있는 경우 사용자가 다음과 유사한 명령을 사용하여 객체를 업로드해야 합니다.

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption aws:kms --ssekms-key-id arn:aws:kms:us-east-1:111122223333:key/abcdabcd-abcd-abcd-abcd-abcdabcdabcd

객체가 특정 유형의 서버 측 암호화 방식을 사용하는 경우에만 업로드를 허용하는 다음과 유사한 조건이 없는지 확인합니다.

"Condition": {
  "StringEquals": {
    "s3:x-amz-server-side-encryption": "AES256"
  }
}

정책에 이 조건이 있는 경우 사용자가 다음과 유사한 명령을 사용하여 객체를 업로드해야 합니다.

aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key examplefile.jpg --body c:\examplefile.jpg --server-side-encryption "AES256"

VPC 엔드포인트 정책에서 액세스 허용

IAM 사용자가 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 사용하여 Amazon S3에 객체를 업로드하는데 해당 인스턴스가 VPC 엔드포인트를 사용하여 Amazon S3로 라우팅되는 경우 VPC 엔드포인트 정책을 확인해야 합니다. 엔드포인트 정책에서 버킷에 대한 업로드가 허용되는지 확인합니다.

예를 들어 다음 VPC 엔드포인트 정책은 DOC-EXAMPLE-BUCKET에 대한 액세스만 허용합니다. 버킷이 허용되는 리소스 목록에 없는 경우 사용자는 VPC의 인스턴스를 사용하여 버킷에 업로드할 수 없습니다.

{
  "Statement": [{
    "Sid": "Access-to-specific-bucket-only",
    "Principal": "*",
    "Action": [
      "s3:PutObject"
    ],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
  }]
}

또한 사용자가 ACL을 사용하여 객체를 업로드하는 경우 VPC 엔드포인트 정책에서 다음과 유사하게 s3:PutObjectAcl 작업에 대한 액세스 권한도 부여해야 합니다.

{
  "Statement": [{
    "Sid": "Access-to-specific-bucket-only",
    "Principal": "*",
    "Action": [
      "s3:PutObject",
      "s3:PutObjectAcl",
    ],
    "Effect": "Allow",
    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
  }]
}

AWS KMS 암호화

수신한 오류 메시지를 기반으로 IAM 사용자 또는 역할의 AWS KMS 권한을 업데이트합니다. 이러한 액세스 거부를 해결하려면 AWS KMS 기본 암호화를 사용하는 Amazon S3 버킷에 파일을 업로드할 때 액세스 거부 오류 메시지가 표시되는 이유는 무엇입니까?를 참조하세요.

중요: AWS KMS 키와 IAM 역할이 서로 다른 AWS 계정에 속해 있는 경우 IAM 정책과 KMS 키 정책을 업데이트해야 합니다. IAM 정책과 KMS 키 정책 모두에 KMS 권한을 추가해야 합니다. 또한 교차 계정 IAM 보안 주체가 객체를 업로드하는 경우, ‘aws/s3’ 별칭이 있는 AWS KMS 키는 기본 버킷 암호화에 사용할 수 없습니다. SSE-KMS용 S3 버킷 키를 사용하도록 구성된 모든 객체 업로드, 복사 또는 버킷은 kms:Decrypt 권한에 액세스할 수 있어야 합니다. AWS KMS 키 및 정책 관리에 대한 자세한 내용은 AWS 관리형 KMS 키 및 고객 관리형 키를 참조하세요.


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


결제 또는 기술 지원이 필요하세요?