디렉터리 버킷에서 새 객체 업로드에 AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정

디렉터리 버킷에서 새 객체 업로드에 AWS KMS(SSE-KMS)를 사용한 서버 측 암호화 지정 (Specifying server-side encryption with AWS KMS (SSE-KMS) for new object uploads in directory buckets)

디렉터리 버킷에서 서버 측 암호화로 데이터를 암호화하려면 Amazon S3 관리 키(SSE-S3)(기본값)를 사용하거나 AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 사용할 수 있어요. 버킷의 기본 암호화가 원하는 암호화 구성으로 설정되어 있도록 하고, CreateSession 요청이나 PUT object 요청에서 버킷 기본 암호화를 덮어쓰지 않는 것을 권장해요. 그러면 새 객체가 원하는 암호화 설정으로 자동 암호화돼요. 디렉터리 버킷의 암호화 덮어쓰기 동작에 대한 자세한 내용은 새 객체 업로드에 AWS KMS를 사용한 서버 측 암호화 지정 을 참고하세요.

출처: 문서

본문

모든 Amazon S3 버킷에는 기본으로 암호화가 구성되어 있고, S3 버킷에 업로드되는 모든 새 객체는 저장 시 자동으로 암호화돼요. Amazon S3 관리 키를 사용한 서버 측 암호화(SSE-S3)는 Amazon S3의 모든 버킷에 대한 기본 암호화 구성이에요. 디렉터리 버킷에 다른 암호화 유형을 지정하려면 AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS)를 사용할 수 있어요. 디렉터리 버킷의 새 객체를 SSE-KMS로 암호화하려면 KMS 키(구체적으로는 고객 관리 키)와 함께 SSE-KMS를 디렉터리 버킷의 기본 암호화 구성으로 지정해야 해요. AWS 관리 키(aws/s3)는 지원되지 않아요. SSE-KMS 구성은 버킷의 수명 동안 디렉터리 버킷당 고객 관리 키 1개만 지원해요. SSE-KMS에 고객 관리 키를 지정한 뒤에는 버킷의 SSE-KMS 구성용 고객 관리 키를 덮어쓸 수 없어요. 그런 다음 SSE-KMS로 새 객체의 서버 측 암호화 설정을 지정할 때는 그 암호화 키가 디렉터리 버킷의 기본 암호화 구성에 지정한 고객 관리 키와 같은지 확인해야 해요. 데이터에 새 고객 관리 키를 사용하려면 기존 객체를 새 고객 관리 키가 있는 새 디렉터리 버킷으로 복사하는 것을 권장해요.

암호화는 새 객체를 업로드하거나 기존 객체를 복사할 때 적용할 수 있어요. 객체의 암호화를 변경하면 기존 객체를 대체하는 새 객체가 생성돼요.

REST API 작업, AWS SDK, AWS CLI로 SSE-KMS를 지정할 수 있어요.

참고

  • 디렉터리 버킷의 암호화 덮어쓰기 동작은 다음과 같아요. REST API로 CreateSession을 사용해 CopyObject와 UploadPartCopy를 제외한 Zonal 엔드포인트 API 요청을 인증·권한 부여할 때는, 이전에 버킷의 기본 암호화를 SSE-KMS로 지정한 경우에만 암호화 설정을 SSE-S3 또는 SSE-KMS로 덮어쓸 수 있어요. AWS CLI나 AWS SDK로 CreateSession을 사용해 CopyObject와 UploadPartCopy를 제외한 Zonal 엔드포인트 API 요청을 인증·권한 부여할 때는 암호화 설정을 전혀 덮어쓸 수 없어요. CopyObject 요청을 보낼 때는 이전에 버킷의 기본 암호화를 SSE-KMS로 지정한 경우에만 암호화 설정을 SSE-S3 또는 SSE-KMS로 덮어쓸 수 있어요. UploadPartCopy 요청을 보낼 때는 암호화 설정을 덮어쓸 수 없어요.
  • REST API로 CreateSession을 사용해 CopyObject와 UploadPartCopy를 제외한 Zonal 엔드포인트 API 요청을 인증·권한 부여할 때는, 이전에 버킷의 기본 암호화를 SSE-KMS로 지정한 경우에만 암호화 설정을 SSE-S3 또는 SSE-KMS로 덮어쓸 수 있어요.
  • AWS CLI나 AWS SDK로 CreateSession을 사용해 CopyObject와 UploadPartCopy를 제외한 Zonal 엔드포인트 API 요청을 인증·권한 부여할 때는 암호화 설정을 전혀 덮어쓸 수 없어요.
  • CopyObject 요청을 보낼 때는 이전에 버킷의 기본 암호화를 SSE-KMS로 지정한 경우에만 암호화 설정을 SSE-S3 또는 SSE-KMS로 덮어쓸 수 있어요. UploadPartCopy 요청을 보낼 때는 암호화 설정을 덮어쓸 수 없어요.
  • Amazon S3에서 다중 리전(multi-Region) AWS KMS 키를 사용할 수 있어요. 단, 현재 Amazon S3는 다중 리전 키를 단일 리전 키처럼 취급하며 키의 다중 리전 기능을 사용하지 않아요. 자세한 내용은 AWS Key Management Service Developer Guide의 다중 리전 키 사용 을 참고하세요.
  • 다른 계정이 소유한 KMS 키를 사용하려면 그 키를 사용할 권한이 있어야 해요. KMS 키의 교차 계정 권한에 대한 자세한 내용은 AWS Key Management Service Developer Guide의 다른 계정이 사용할 수 있는 KMS 키 만들기 를 참고하세요.

참고

버킷의 수명 동안 디렉터리 버킷당 1개의 고객 관리 키만 지원돼요. AWS 관리 키(aws/s3)는 지원되지 않아요. 고객 관리 키로 SSE-KMS를 버킷의 기본 암호화 구성으로 지정한 뒤에는 버킷의 SSE-KMS 구성용 고객 관리 키를 변경할 수 없어요.

CopyObject와 UploadPartCopy를 제외한 Zonal 엔드포인트(객체 수준) API 작업은 낮은 지연 시간을 위해 CreateSession으로 요청을 인증하고 권한을 부여해요. 버킷의 기본 암호화가 원하는 암호화 구성으로 설정되어 있도록 하고, CreateSession 요청이나 PUT object 요청에서 버킷 기본 암호화를 덮어쓰지 않는 것을 권장해요. 그러면 새 객체가 원하는 암호화 설정으로 자동 암호화돼요. 디렉터리 버킷의 새 객체를 SSE-KMS로 암호화하려면 KMS 키(구체적으로는 고객 관리 키)와 함께 SSE-KMS를 디렉터리 버킷의 기본 암호화 구성으로 지정해야 해요. 그러면 Zonal 엔드포인트 API 작업용 세션이 생성될 때 세션 중에 새 객체가 SSE-KMS와 S3 Bucket Keys로 자동 암호화·복호화돼요. 디렉터리 버킷의 암호화 덮어쓰기 동작에 대한 자세한 내용은 새 객체 업로드에 AWS KMS를 사용한 서버 측 암호화 지정 을 참고하세요.

REST API를 사용하는 Zonal 엔드포인트 API 호출(CopyObject와 UploadPartCopy 제외)에서는 CreateSession 요청의 암호화 설정 값(x-amz-server-side-encryption, x-amz-server-side-encryption-aws-kms-key-id, x-amz-server-side-encryption-context, x-amz-server-side-encryption-bucket-key-enabled)을 덮어쓸 수 없어요. Zonal 엔드포인트 API 호출에서 이러한 암호화 설정 값을 명시적으로 지정할 필요는 없으며, Amazon S3는 CreateSession 요청의 암호화 설정 값을 사용해 디렉터리 버킷의 새 객체를 보호해요.

참고

AWS CLI나 AWS SDK를 사용하면 CreateSession의 세션 토큰은 세션 만료 시 서비스 중단을 막기 위해 자동으로 갱신돼요. AWS CLI나 AWS SDK는 CreateSession 요청에 버킷의 기본 암호화 구성을 사용해요. CreateSession 요청에서 암호화 설정 값을 덮어쓰는 것은 지원되지 않아요. 또한 CopyObject와 UploadPartCopy를 제외한 Zonal 엔드포인트 API 호출에서도 CreateSession 요청의 암호화 설정 값을 덮어쓰는 것은 지원되지 않아요.

CopyObject의 경우 디렉터리 버킷의 새 객체 복사본을 SSE-KMS로 암호화하려면 KMS 키(구체적으로는 고객 관리 키)와 함께 SSE-KMS를 디렉터리 버킷의 기본 암호화 구성으로 지정해야 해요. 그러면 SSE-KMS로 새 객체 복사본의 서버 측 암호화 설정을 지정할 때 그 암호화 키가 디렉터리 버킷의 기본 암호화 구성에 지정한 고객 관리 키와 같은지 확인해야 해요. UploadPartCopy의 경우 디렉터리 버킷의 새 객체 파트 복사본을 SSE-KMS로 암호화하려면 KMS 키(구체적으로는 고객 관리 키)와 함께 SSE-KMS를 디렉터리 버킷의 기본 암호화 구성으로 지정해야 해요. UploadPartCopy 요청 헤더에는 SSE-KMS로 새 객체 파트 복사본의 서버 측 암호화 설정을 지정할 수 없어요. 또한 CreateMultipartUpload 요청에 제공하는 암호화 설정은 대상 버킷의 기본 암호화 구성과 일치해야 해요.

SSE-KMS를 지원하는 Amazon S3 REST API 작업

디렉터리 버킷의 다음 객체 수준 REST API 작업은 x-amz-server-side-encryption, x-amz-server-side-encryption-aws-kms-key-id, x-amz-server-side-encryption-context 요청 헤더를 받아들여요.

  • CreateSession – Zonal 엔드포인트(객체 수준) API 작업(CopyObject와 UploadPartCopy 제외)을 사용할 때 이 요청 헤더를 지정할 수 있어요.
  • PutObject – PUT API 작업으로 데이터를 업로드할 때 이 요청 헤더를 지정할 수 있어요.
  • CopyObject – 객체를 복사할 때는 원본 객체와 대상 객체가 둘 다 있어요. CopyObject 작업으로 SSE-KMS 헤더를 전달하면 대상 객체에만 적용돼요.
  • CreateMultipartUpload – 멀티파트 업로드 API 작업으로 대용량 객체를 업로드할 때 이 헤더를 지정할 수 있어요. CreateMultipartUpload 요청에서 이 헤더를 지정해요.

다음 REST API 작업의 응답 헤더는 객체가 서버 측 암호화로 저장될 때 x-amz-server-side-encryption 헤더를 반환해요.

  • CreateSession
  • PutObject
  • CopyObject
  • POST Object
  • CreateMultipartUpload
  • UploadPart
  • UploadPartCopy
  • CompleteMultipartUpload
  • GetObject
  • HeadObject

중요

  • AWS KMS로 보호되는 객체에 대한 모든 GET 및 PUT 요청이 TLS(Transport Layer Security)나 Signature Version 4를 사용하지 않으면 실패해요.
  • 객체가 SSE-KMS를 사용한다면 GET 요청과 HEAD 요청에는 암호화 요청 헤더를 보내지 마세요. 그렇지 않으면 HTTP 400 BadRequest 오류가 발생해요.

암호화 컨텍스트 (x-amz-server-side-encryption-context)

x-amz-server-side-encryption:aws:kms를 지정하면 Amazon S3 API는 x-amz-server-side-encryption-context 헤더로 명시적인 암호화 컨텍스트를 선택적으로 제공하는 것을 지원해요. 디렉터리 버킷에서 암호화 컨텍스트는 데이터에 대한 상황 정보를 포함하는 키-값 쌍의 집합이에요. 그 값은 기본 암호화 컨텍스트인 버킷 Amazon Resource Name(ARN)과 일치해야 해요. 추가 암호화 컨텍스트 값은 지원되지 않아요.

디렉터리 버킷의 암호화 컨텍스트에 대한 정보는 암호화 컨텍스트 를 참고하고, 암호화 컨텍스트에 대한 일반 정보는 AWS Key Management Service Developer Guide의 암호화 컨텍스트 를 참고하세요.

AWS KMS 키 ID (x-amz-server-side-encryption-aws-kms-key-id)

x-amz-server-side-encryption-aws-kms-key-id 헤더를 사용해 데이터를 보호하는 데 사용되는 고객 관리 키의 ID를 지정할 수 있어요.

SSE-KMS 구성은 버킷의 수명 동안 디렉터리 버킷당 고객 관리 키 1개만 지원해요. AWS 관리 키(aws/s3)는 지원되지 않아요. 또한 SSE-KMS에 고객 관리 키를 지정한 뒤에는 버킷의 SSE-KMS 구성용 고객 관리 키를 덮어쓸 수 없어요.

버킷의 SSE-KMS 구성에 지정한 고객 관리 키는 다음과 같이 확인할 수 있어요.

  • HeadObject API 작업 요청을 보내 응답에서 x-amz-server-side-encryption-aws-kms-key-id 값을 찾아요.

데이터에 새 고객 관리 키를 사용하려면 기존 객체를 새 고객 관리 키가 있는 새 디렉터리 버킷으로 복사하는 것을 권장해요.

디렉터리 버킷의 암호화 컨텍스트에 대한 정보는 AWS KMS 키 를 참고하세요.

S3 Bucket Keys (x-amz-server-side-encryption-aws-bucket-key-enabled)

S3 Bucket Keys는 디렉터리 버킷의 GET 및 PUT 작업에 항상 활성화되며 비활성화할 수 없어요. CopyObject, UploadPartCopy, Batch Operations의 Copy 작업, 또는 가져오기 작업으로 SSE-KMS 암호화 객체를 일반 용도 버킷과 디렉터리 버킷 사이(또는 디렉터리 버킷 사이)에서 복사할 때는 S3 Bucket Keys가 지원되지 않아요. 이 경우 Amazon S3는 KMS 암호화 객체에 대한 복사 요청이 있을 때마다 AWS KMS에 호출해요. 디렉터리 버킷의 S3 Bucket Keys에 대한 정보는 암호화 컨텍스트 를 참고하세요.

참고

AWS CLI를 사용하면 CreateSession의 세션 토큰은 세션 만료 시 서비스 중단을 막기 위해 자동으로 갱신돼요. CreateSession 요청의 암호화 설정 값을 덮어쓰는 것은 지원되지 않아요. 또한 CopyObject와 UploadPartCopy를 제외한 Zonal 엔드포인트 API 호출에서도 CreateSession 요청의 암호화 설정 값을 덮어쓰는 것은 지원되지 않아요.

디렉터리 버킷의 새 객체를 SSE-KMS로 암호화하려면 KMS 키(구체적으로는 고객 관리 키)와 함께 SSE-KMS를 디렉터리 버킷의 기본 암호화 구성으로 지정해야 해요. 그러면 Zonal 엔드포인트 API 작업용 세션이 생성될 때 세션 중에 새 객체가 SSE-KMS와 S3 Bucket Keys로 자동 암호화·복호화돼요.

다음 AWS CLI 예제 명령을 사용하려면 사용자 입력 자리표시자를 직접 채워 넣어야 해요.

AWS CLI 예제

새 객체를 업로드하거나 기존 객체를 복사할 때 AWS KMS 키를 사용한 서버 측 암호화를 지정해 데이터를 암호화할 수 있어요. 이렇게 하려면 put-bucket-encryption 명령으로 디렉터리 버킷의 기본 암호화 구성을 SSE-KMS(aws:kms)로 설정해요. 구체적으로는 요청에 --server-side-encryption aws:kms 헤더를 추가해요. --ssekms-key-id example-key-id로 만든 고객 관리 AWS KMS 키를 추가합니다. --server-side-encryption aws:kms를 지정하면 고객 관리 키의 AWS KMS 키 ID를 제공해야 해요. 디렉터리 버킷은 AWS 관리 키를 사용하지 않아요. 예제 명령은 AWS CLI 사용 을 참고하세요.

그런 다음 다음 명령으로 새 객체를 업로드하면 Amazon S3가 기본 암호화용 버킷 설정을 사용해 객체를 기본적으로 암호화해요.

aws s3api put-object --bucket bucket-base-name--zone-id--x-s3 --key example-object-key --body filepath

Zonal 엔드포인트 API 작업 명령에 --bucket-key-enabled를 명시적으로 추가할 필요는 없어요. S3 Bucket Keys는 디렉터리 버킷의 GET 및 PUT 작업에 항상 활성화되며 비활성화할 수 없어요. CopyObject, UploadPartCopy, Batch Operations의 Copy 작업, 또는 가져오기 작업으로 SSE-KMS 암호화 객체를 일반 용도 버킷과 디렉터리 버킷 사이(또는 디렉터리 버킷 사이)에서 복사할 때는 S3 Bucket Keys가 지원되지 않아요. 이 경우 Amazon S3는 KMS 암호화 객체에 대한 복사 요청이 있을 때마다 AWS KMS에 호출해요.

원본 버킷(예: 일반 용도 버킷)에서 새 버킷(예: 디렉터리 버킷)으로 객체를 복사하고 대상 객체에 SSE-KMS 암호화를 사용할 수 있어요. 이렇게 하려면 put-bucket-encryption 명령으로 대상 버킷(예: 디렉터리 버킷)의 기본 암호화 구성을 SSE-KMS(aws:kms)로 설정해요. 예제 명령은 AWS CLI 사용 을 참고하세요. 그런 다음 다음 명령으로 객체를 복사하면 Amazon S3가 기본 암호화용 버킷 설정을 사용해 객체를 기본적으로 암호화해요.

aws s3api copy-object --copy-source amzn-s3-demo-bucket/example-object-key --bucket bucket-base-name--zone-id--x-s3 --key example-object-key  

AWS SDK를 사용할 때는 Amazon S3가 서버 측 암호화에 AWS KMS 키를 사용하도록 요청할 수 있어요. 다음 예제들은 AWS SDK for Java와 .NET으로 SSE-KMS를 사용하는 방법을 보여줘요. 다른 SDK에 대한 정보는 AWS Developer Center의 샘플 코드 및 라이브러리 를 참고하세요.

참고

AWS SDK를 사용하면 CreateSession의 세션 토큰은 세션 만료 시 서비스 중단을 막기 위해 자동으로 갱신돼요. CreateSession 요청의 암호화 설정 값을 덮어쓰는 것은 지원되지 않아요. 또한 CopyObject와 UploadPartCopy를 제외한 Zonal 엔드포인트 API 호출에서도 CreateSession 요청의 암호화 설정 값을 덮어쓰는 것은 지원되지 않아요.

디렉터리 버킷의 새 객체를 SSE-KMS로 암호화하려면 KMS 키(구체적으로는 고객 관리 키)와 함께 SSE-KMS를 디렉터리 버킷의 기본 암호화 구성으로 지정해야 해요. 그러면 Zonal 엔드포인트 API 작업용 세션이 생성될 때 세션 중에 새 객체가 SSE-KMS와 S3 Bucket Keys로 자동 암호화·복호화돼요.

AWS SDK로 디렉터리 버킷의 기본 암호화 구성을 SSE-KMS로 설정하는 방법에 대한 자세한 내용은 AWS SDK 사용 을 참고하세요.

중요

Amazon S3에서 서버 측 암호화에 AWS KMS 키를 사용할 때는 대칭 암호화 KMS 키를 선택해야 해요. Amazon S3는 대칭 암호화 KMS 키만 지원해요. 이 키에 대한 자세한 내용은 AWS Key Management Service Developer Guide의 대칭 암호화 KMS 키 를 참고하세요.

고객 관리 키 만들기에 대한 자세한 내용은 AWS Key Management Service Developer Guide의 AWS KMS API 프로그래밍 을 참고하세요.

더 알아보기 (Learn more)