내 버킷 정책이 다른 AWS 계정에게 전체 액세스 권한을 부여합니다. 해당 계정의 IAM 사용자에게 액세스 거부 오류가 발생하는 이유는 무엇입니까?

최종 업데이트 날짜: 2019년 7월 8일

내 Amazon Simple Storage Service(Amazon S3) 버킷 정책은 다른 AWS 계정에게 전체 액세스 권한을 부여합니다. 하지만 AWS Identity and Access Management(IAM) 사용자가 해당 계정에서 내 버킷에 액세스하려고 할 때 액세스 거부 오류가 발생합니다. 이 문제를 해결하려면 어떻게 해야 합니까? 

간략한 설명

버킷 정책이 이미 다른 계정에게 액세스 권한을 부여한 경우 교차 계정 사용자에게 다음과 같은 이유로 액세스 거부 오류가 발생할 수 있습니다.

  • 사용자의 IAM 정책이 버킷에 액세스 권한을 부여하지 않았습니다.
  • 객체가 AWS Key Management Service(AWS KMS)로 암호화되어 사용자가 KMS 키에 액세스할 수 없습니다.
  • 버킷 정책 또는 IAM 정책의 거부문이 사용자의 액세스를 차단합니다.
  • Amazon Virtual Private Cloud(Amazon VPC) 엔드포인트 정책이 버킷 액세스를 차단합니다.
  • AWS Organizations 서비스 제어 정책이 버킷 액세스를 차단합니다.
  • 객체가 버킷을 소유한 AWS 계정에 속하지 않습니다.
  • 버킷에 활성화된 요청자 지불 설정

​해결 방법

사용자의 IAM 정책이 버킷에 액세스 권한을 부여하지 않습니다.

교차 계정 액세스의 경우 사용자는 계정 A의 IAM 정책과 계정 B의 버킷 정책 모두에서 버킷 액세스 권한을 부여해야 합니다.

다음 단계에 따라 계정 A에서 사용자의 IAM 정책을 확인합니다.

1.    IAM 콘솔을 엽니다.

2.    콘솔에서 버킷에 액세스해야 하는 IAM 사용자 또는 역할을 엽니다.

3.    IAM 사용자 또는 역할의 권한 탭에서 각 정책을 확장하여 해당 JSON 정책 문서를 봅니다.

4.    JSON 정책 문서에서 버킷의 이름을 사용하여 정책을 검색합니다. 그런 다음, 해당 정책이 버킷에서 올바른 S3 작업을 허용하는지 확인합니다.

5.    IAM 사용자 또는 역할이 버킷에 액세스 권한을 부여하지 않는 경우 올바른 권한을 부여하는 정책을 추가합니다. 예를 들어, 다음 IAM 정책은 awsexamplebucket에서 모든 S3 작업에 사용자 액세스 권한을 부여합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ExampleStmt",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::awsexamplebucket/",
        "arn:aws:s3:::awsexamplebucket/*"
      ]
    }
  ]
}

객체는 AWS KMS로 암호화되어 사용자가 KMS 키에 액세스할 수 없습니다.

계정 A의 IAM 정책 및 계정 B의 버킷 정책에 모두 교차 계정 액세스 권한을 부여한 경우 암호화를 위해 객체의 속성을 확인합니다. AWS KMS 키로 객체가 암호화된 경우 키를 사용하려면 사용자에게도 권한이 필요합니다.

다음 단계에 따라 KMS 키에 IAM 사용자 권한을 부여합니다.

1.    KMS 키 정책을 편집하여 다음과 유사한 문을 추가합니다.

참고: Principal로 IAM 사용자의 Amazon 리소스 이름(ARN)을 입력합니다.

{
   "Sid": "Allow use of the key",
   "Effect": "Allow",
   "Principal": {
     "AWS": [
       "arn:aws:iam::111122223333:user/Jane",
     ]
   },
   "Action": [
     "kms:Encrypt",
     "kms:Decrypt",
     "kms:ReEncrypt*",
     "kms:GenerateDataKey*",
     "kms:DescribeKey"
   ],
   "Resource": "*"
 }

2.    KMS 키가 IAM 사용자와 동일한 계정에 속한 경우 키 정책의 명령문에서 키에 사용자 액세스 권한을 부여할 수 있습니다. KMS 키가 IAM 사용자가 아닌 다른 계정에 속한 경우 IAM 사용자의 권한도 업데이트해야 합니다. 다음과 같이 IAM 정책을 추가합니다.

참고: Resource로 KMS 키의 ARN을 입력합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ExampleStmt3",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:Encrypt",
                "kms:GenerateDataKey",
                "kms:ReEncrypt*"
            ],
            "Resource": "arn:aws:kms:example-region-1:123456789098:key/a1b2c3d4-e5f6-7890-g1h2-123456789abc"
        }
    ]
}

버킷 정책 또는 IAM 정책의 거부문이 사용자의 액세스를 차단합니다.

버킷에 대한 사용자 액세스를 명시적으로 거부하는 명령문의 버킷 정책과 사용자의 IAM 정책을 모두 확인합니다.

다음 단계에 따라 버킷 정책을 확인합니다.

1.    Amazon S3 콘솔을 엽니다.

2.    버킷 목록에서 확인하려는 버킷 정책을 포함하는 버킷을 엽니다.

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

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

5.    "Effect": "Deny"를 포함하는 명령문을 검색합니다.

6.    버킷 정책을 수정하여 버킷에 대한 사용자 액세스를 거부하는 "Effect": "Deny" 명령문을 편집하거나 제거합니다.

다음 단계에 따라 사용자의 IAM 정책을 확인합니다.

1.    IAM 콘솔을 엽니다.

2.    콘솔에서 버킷에 액세스할 수 없는 IAM 사용자 또는 역할을 엽니다.

3.    IAM 사용자 또는 역할의 [권한] 탭에서 각 정책을 확장하여 해당 JSON 정책 문서를 봅니다.

4.    JSON 정책 문서에서 "Effect": "Deny"가 포함된 명령문을 사용하여 S3 버킷과 관련된 정책을 검색합니다.

5.    사용자의 IAM 권한 정책을 수정하여 버킷에 대한 사용자의 액세스를 잘못 거부하는 "Effect": "Deny" 명령문을 편집하거나 제거합니다.

VPC 엔드포인트 정책이 버킷에 대한 액세스를 차단합니다.

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

예를 들어, 다음 VPC 엔드포인트 정책은 awsexamplebucket에 대한 액세스를 허용합니다.

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

AWS Organizations 서비스 제어 정책이 버킷에 대한 액세스를 차단합니다.

사용자의 계정이 AWS Organizations를 사용하는 경우, 서비스 제어 정책이 Amazon S3에 대한 액세스를 허용하는지 확인합니다. 예를 들어, 다음 정책은 Amazon S3에 대한 액세스를 명시적으로 거부하므로 액세스 거부 오류가 생성됩니다.

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

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

객체가 버킷을 소유한 AWS 계정에 속하지 않습니다.

기본적으로 S3 객체는 해당 객체를 업로드한 AWS 계정의 소유입니다. 이는 버킷을 다른 계정에서 소유하는 경우에도 마찬가지입니다. 다른 계정이 객체를 소유한 경우 버킷의 권한이 객체에 자동으로 적용되지 않습니다. 이는 다른 계정의 버킷에 전송되는 서비스 로그에서 발생할 수 있습니다. 서비스 로그 예제로는 AWS CloudTrail 로그 또는 Amazon Virtual Private Cloud(Amazon VPC) 흐름 로그가 있습니다.

객체 소유권에서 액세스 거부 오류를 해결하기 위해 객체 소유자는 버킷 소유자에 대한 소유권을 명시적으로 부여해야 합니다. 지침은 다른 AWS 계정에서 제 Amazon S3 버킷에 업로드한 객체에 액세스할 수 없는 이유는 무엇입니까?를 참조하십시오.

버킷에 활성화된 요청자 지불 설정

버킷에 요청자 지불이 활성화된 경우, 다른 계정의 사용자는 요청을 버킷에 전송할 때 request-payer 파라미터를 지정해야 합니다. 지정하지 않는 경우, 해당 사용자에게 액세스 거부 오류가 표시됩니다.

GET, HEAD 또는 POST 요청의 경우 사용자가 헤더에 x-amz-request-payer 파라미터를 포함시켜야 합니다. REST 요청의 경우 사용자가 요청에 x-amz-request-payer 파라미터를 포함시켜야 합니다.

AWS 명령줄 인터페이스(AWS CLI) 명령의 경우 사용자는 다음과 같이 --request-payer 파라미터를 포함시켜야 합니다.

aws s3 cp exampleobject.jpg s3://awsexamplebucket/exampleobject.jpg --request-payer requester