Amazon S3 버킷에 사용자 지정 AWS KMS 키를 사용하는 기본 암호화가 설정되어 있습니다. 사용자가 버킷에서 다운로드 및 업로드를 수행하게 하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2021년 2월 10일

Amazon S3(Amazon Simple Storage Service) 버킷에서 사용자 지정 AWS KMS(AWS Key Management Service) 키를 통한 기본 암호화를 사용하도록 설정했습니다. AWS Identity and Access Management(IAM) 사용자가 이 버킷에 다운로드 및 업로드를 수행할 수 있게 하려고 합니다. 어떻게 해야 합니까?

해결 방법

IAM 사용자와 AWS KMS 키가 동일한 AWS 계정에 속하는 경우

1.    AWS KMS 콘솔을 열고 정책 보기를 사용하여 키의 정책 문서를 봅니다. 최소한 kms:GenerateDataKeykms:Decrypt 작업에 대한 권한을 IAM 사용자에게 부여하도록 키의 정책을 수정합니다. 다음과 같은 명령문을 추가할 수 있습니다.

{
  "Sid": "ExampleStmt",
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:user/Jane"
  },
  "Resource": "*"
}

참고: 이 정책 예에는 개별 IAM 사용자가 암호화된 S3 버킷에 다운로드 및 업로드하는 데 필요한 최소한의 권한만 포함됩니다. 사용 사례에 따라 권한을 수정하거나 확장할 수 있습니다.

2.    IAM 콘솔을 엽니다. 버킷에서 업로드 및 다운로드할 수 있는 권한을 부여하는 정책을 IAM 사용자에게 추가합니다. 다음과 유사한 정책을 사용할 수 있습니다.

참고: Resource 값에는 버킷의 객체를 나타내는 와일드카드 문자와 함께 버킷의 Amazon 리소스 이름(ARN)을 입력합니다.

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

중요: IAM 사용자 정책에서 부여한 S3 권한은 버킷 정책의 명시적 거부 문에 의해 차단될 수 있습니다. 버킷 정책을 검토하여 IAM 사용자 정책과 충돌하는 명시적 거부 문이 없는지 확인하세요.

IAM 사용자가 AWS KMS 키 및 S3 버킷과 다른 계정에 있는 경우

중요: 고객 관리형 AWS KMS 키에 대해 교차 계정 액세스 권한을 부여할 수 있지만 AWS 관리형 AWS KMS 키에 대해서는 부여할 수 없습니다. AWS 관리형 AWS KMS 키의 키 정책은 수정할 수 없습니다.

1.    AWS KMS 콘솔을 열고 정책 보기를 사용하여 키의 정책 문서를 봅니다. 최소한 kms:GenerateDataKey kms:Decrypt 작업에 대한 권한을 IAM 사용자에게 부여하도록 키의 정책을 수정합니다. 다음과 유사한 문을 추가할 수 있습니다.

{
  "Sid": "ExampleStmt",
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:user/Jane"
  },
  "Resource": "*"
}

참고: 이 정책 예에는 개별 IAM 사용자가 암호화된 S3 버킷에 다운로드 및 업로드하는 데 필요한 최소한의 권한만 포함됩니다. 사용 사례에 따라 권한을 수정하거나 확장할 수 있습니다.

2.    IAM 사용자가 속한 계정에서 IAM 콘솔을 엽니다. 버킷에서 업로드 및 다운로드할 수 있는 권한을 부여하는 정책을 IAM 사용자에게 추가합니다. 정책은 버킷과 연결된 AWS KMS 키에서도 작동해야 합니다.

교차 계정 시나리오의 경우 IAM 사용자가 객체를 업로드할 수 있도록 s3:PutObjectAcl 권한을 부여하는 것을 고려합니다. 그런 다음 버킷의 계정에 객체에 대한 모든 권한(bucket-owner-full-control)을 부여합니다. 또한 동기화 작업 또는 재귀 복사 작업을 실행하는 데 필요한 s3:ListBucket 권한을 부여하는 것도 고려합니다. 다음과 유사한 정책을 사용할 수 있습니다.

참고: 첫 번째 Resource 값에는 버킷의 객체를 나타내는 와일드카드 문자와 함께 버킷의 ARN을 입력합니다. 두 번째 [리소스(Resource)] 값에는 버킷의 ARN을 입력합니다. 세 번째 [리소스(Resource)] 값에는 AWS KMS 키의 ARN을 입력합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DownloadandUpload",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    },
    {
      "Sid": "ListBucket",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
    },
    {
      "Sid": "KMSAccess",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
    }
  ]
}

3.    S3 버킷을 소유한 계정에서 Amazon S3 콘솔을 엽니다. IAM 사용자에게 버킷에 대한 액세스 권한을 부여하도록 버킷 정책을 업데이트합니다. 다음과 같은 정책을 사용할 수 있습니다.

참고: Principal 값에는 IAM 사용자의 ARN을 입력합니다. 첫 번째 Resource 값에는 버킷의 객체를 나타내는 와일드카드 문자와 함께 버킷의 ARN을 입력합니다. 두 번째 [리소스(Resource)] 값에는 버킷의 ARN을 입력합니다.

{
  "Id": "Policy1584399307003",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DownloadandUpload",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/Jane"
        ]
      }
    },
    {
      "Sid": "ListBucket",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/Jane"
        ]
      }
    }
  ]
}