AWS Key Management Service(SSE-KMS)를 사용하는 서버 측 암호화로 데이터 보호 - Amazon Simple Storage Service

AWS Key Management Service(SSE-KMS)를 사용하는 서버 측 암호화로 데이터 보호

서버 측 암호화는 데이터를 받는 애플리케이션 또는 서비스에 의해 해당 대상에서 데이터를 암호화하는 것입니다. AWS Key Management Service(AWS KMS)는 클라우드에 맞게 확장된 키 관리 시스템을 제공하기 위해 안전하고 가용성이 높은 하드웨어 및 소프트웨어를 결합하는 서비스입니다. Amazon S3는 AWS KMS keys를 사용하여 Amazon S3 객체를 암호화합니다. AWS KMS는 객체 데이터만 암호화합니다. 객체에 대해 KMS 키를 사용한 서버 측 암호화가 요청되지 않는 한 객체 메타데이터는 암호화되지 않습니다. 객체에 서버 측 암호화가 요청된 경우 체크섬은 암호화된 형식으로 저장됩니다.

KMS 키를 사용하는 경우 AWS Management Console 또는 AWS KMS API를 통해 AWS KMS를 사용하여 다음을 수행할 수 있습니다.

  • 중앙에서 KMS 키 생성

  • KMS 키를 사용할 수 있는 방법을 제어하는 정책 정의

  • KMS 키 사용량을 감사하여 올바르게 사용되고 있는지 입증

AWS KMS 내 보안 관리가 암호화 관련 규정 준수 요구 사항을 충족하는 데 도움이 될 수 있습니다. 이러한 KMS 키를 사용하여 Amazon S3 버킷에서 데이터를 보호할 수 있습니다. S3 버킷에 SSE-KMS 암호화를 사용할 때 AWS KMS keys는 버킷과 동일한 리전에 있어야 합니다.

AWS KMS keys 사용에 따르는 추가 요금이 있습니다. 자세한 내용은 AWS Key Management Service 개발자 가이드AWS KMS key 개념AWS KMS 요금을 참조하세요.

권한

AWS KMS key을 사용하여 암호화된 객체를 Amazon S3에 업로드하려면 키에 대한 kms:GenerateDataKey 권한이 필요합니다. AWS KMS key을 사용하여 암호화된 객체를 다운로드하려면 kms:Decrypt 권한이 필요합니다. 멀티파트 업로드에 필요한 AWS KMS 권한에 대한 자세한 내용은 멀티파트 업로드 API 및 권한 섹션을 참조하세요.

AWS KMS keys

AWS KMS를 통한 서버 측 암호화(SSE-KMS)를 사용하는 경우 기본 AWS 관리형 키를 사용하거나 이미 생성한 고객 관리형 키를 지정할 수 있습니다. AWS KMS는 엔벨로프 암호화를 사용하여 데이터를 추가로 보호합니다. 엔빌로프 암호화는 데이터 키로 일반 텍스트 데이터를 암호화한 후 루트 키로 데이터 키를 암호화하는 방법입니다.

고객 관리형 키를 지정하지 않으면 Amazon S3에서는 SSE-KMS로 암호화된 객체를 버킷에 처음 추가할 때 AWS 계정에 AWS KMS key를 자동으로 생성합니다. 기본적으로 Amazon S3에서는 SSE-KMS에 이 KMS를 사용합니다.

SSE-KMS에 고객 관리형 키를 사용하려는 경우 SSE-KMS를 구성하기 전에 고객 관리형 키를 생성합니다. 그런 다음 버킷에 대해 SSE-KMS를 구성할 때 기존 고객 관리형 키를 지정합니다.

고객 관리형 키를 생성하면 보다 유연하게 제어할 수 있습니다. 예를 들어, 고객 관리형 키를 생성, 교체 및 사용 중지할 수 있습니다. 또한 액세스 제어를 정의하고 데이터를 보호하는 데 사용하는 고객 관리형 키를 감사할 수 있습니다. 고객 관리형 및 AWS 관리형 키에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드AWS KMS 개념을 참조하세요.

KMS 키 또는 고객 관리형 키를 사용하여 데이터를 암호화하도록 선택하는 경우 AWS KMS와 Amazon S3는 다음 작업을 수행합니다.

  • Amazon S3는 일반 텍스트 데이터 키와 지정된 KMS 키로 암호화된 키의 사본을 요청합니다.

  • AWS KMS가 데이터 키를 생성하고 KMS 키 하에서 암호화한 후, 일반 텍스트 데이터 키와 암호화된 데이터 키를 모두 Amazon S3로 보냅니다.

  • Amazon S3는 데이터 키를 사용해 데이터를 암호화하고, 사용 후 가급적 빨리 메모리에서 일반 텍스트 키를 제거합니다.

  • Amazon S3는 암호화한 데이터 키를 암호화한 데이터와 함께 메타데이터로 저장합니다.

사용자가 데이터 복호화를 요청하면 Amazon S3와 AWS KMS가 다음 작업을 수행합니다.

  • Amazon S3는 AWS KMS로 암호화된 데이터 키를 보냅니다.

  • AWS KMS는 동일한 KMS 키를 사용하여 키를 복호화하고 일반 텍스트 데이터 키를 Amazon S3에 반환합니다.

  • Amazon S3는 암호화 텍스트를 복호화하고, 가급적 빨리 메모리에서 일반 텍스트 데이터 키를 제거합니다.

중요

Amazon S3에서 서버 측 암호화에 AWS KMS key을 사용하는 경우 대칭 암호화 KMS 키를 선택해야 합니다. Amazon S3는 대칭 암호화 KMS 키만 지원하며 비대칭 키는 지원하지 않습니다. 자세한 내용은 AWS Key Management Service 개발자 안내서대칭 및 비대칭 키 사용을 참조하세요.

Amazon S3 버킷 키

AWS KMS(SSE-KMS)를 사용하여 서버 측 암호화를 구성할 때 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성할 수 있습니다. SSE-KMS용 버킷 수준 키를 사용하면 Amazon S3에서 AWS KMS로 가는 요청 트래픽을 줄여 AWS KMS 요청 비용을 최대 99%까지 줄일 수 있습니다.

새 객체에서 SSE-KMS용 S3 버킷 키를 사용하도록 버킷을 구성하면 AWS KMS는 버킷의 객체에 대해 고유한 데이터 키를 만드는 데 사용되는 버킷 수준 키를 생성합니다. 이 버킷 키는 Amazon S3 내에서 제한된 기간 동안 사용되므로 Amazon S3가 암호화 작업을 완료하기 위해 AWS KMS에 요청할 필요성이 추가적으로 줄어듭니다. S3 버킷 키 사용에 대한 자세한 내용은 Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감 단원을 참조하세요.

서버 측 암호화 필요

특정 Amazon S3 버킷의 모든 객체에 대한 서버 측 암호화를 요구하려면 정책을 사용하면 됩니다. 예를 들어, 다음 버킷 정책은 요청에 SSE-KMS를 사용한 서버 측 암호화를 요청하는 s3:PutObject 헤더가 포함되지 않을 경우 모든 사용자에게 객체 업로드(x-amz-server-side-encryption) 권한을 거부합니다.

{ "Version":"2012-10-17", "Id":"PutObjectPolicy", "Statement":[{ "Sid":"DenyUnEncryptedObjectUploads", "Effect":"Deny", "Principal":"*", "Action":"s3:PutObject", "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*", "Condition":{ "StringNotEquals":{ "s3:x-amz-server-side-encryption":"aws:kms" } } } ] }

버킷의 객체를 암호화하는 데 특정 AWS KMS key를 사용하도록 하려면 s3:x-amz-server-side-encryption-aws-kms-key-id 조건 키를 사용합니다. KMS 키를 지정하려면 "arn:aws:kms:region:acct-id:key/key-id" 형식의 키 Amazon 리소스 이름(ARN)을 사용해야 합니다.

참고

객체를 업로드할 때 x-amz-server-side-encryption-aws-kms-key-id 헤더를 사용하여 KMS 키를 지정할 수 있습니다. 요청에 헤더가 없는 경우 Amazon S3는 AWS 관리형 키를 사용하려 한다고 가정합니다. 이와 관계없이 Amazon S3가 객체 암호화에 사용하는 AWS KMS 키 ID는 정책의 AWS KMS 키 ID와 일치해야 합니다. 그렇지 않으면 Amazon S3는 요청을 거부합니다.

Amazon S3 관련 조건 키의 전체 목록은 Amazon S3에 사용되는 조건 키를 참조하세요.

암호화 컨텍스트

암호화 컨텍스트는 데이터에 대한 추가 컨텍스트 정보를 포함하는 키-값 페어 집합입니다. 암호화 컨텍스트는 암호화되지 않습니다. 암호화 작업에 대해 암호화 컨텍스트가 지정되면 Amazon S3가 복호화 작업에 대해 동일한 암호화 컨텍스트를 지정해야 합니다. 그렇지 않으면 암호화 해제가 실패합니다. AWS KMS는 암호화 컨텍스트를 추가 인증 데이터(AAD)로 사용하여 인증된 암호화를 지원합니다. 암호화 컨텍스트에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서암호화 컨텍스트를 참조하세요.

Amazon S3는 자동으로 객체 또는 버킷의 Amazon 리소스 이름(ARN)을 암호화 컨텍스트 쌍으로 사용합니다.

  • S3 버킷 키를 활성화하지 않고 SSE-KMS를 사용하는 경우 객체 ARN이 암호화 컨텍스트로 사용됩니다.

    arn:aws:s3:::object_ARN
  • S3 버킷 키를 활성화하고 SSE-KMS를 사용하는 경우 버킷 ARN이 암호화 컨텍스트로 사용됩니다. S3 버킷 키에 대한 자세한 내용은 Amazon S3 버킷 키를 사용하여 SSE-KMS 비용 절감 단원을 참조하세요.

    arn:aws:s3:::bucket_ARN

필요한 경우 s3:PutObject 요청에서 x-amz-server-side-encryption-context 헤더를 사용하여 추가 암호화 컨텍스트 쌍을 제공할 수 있습니다. 그러나 암호화 컨텍스트는 암호화되지 않으므로 민감한 정보를 포함하지 않도록 해야 합니다. Amazon S3는 기본 암호화 컨텍스트와 함께 이 추가 키 페어를 저장합니다. PUT 요청을 처리할 때 Amazon S3는 aws:s3:arn의 기본 암호화 컨텍스트를 사용자가 제공한 암호화 컨텍스트에 추가합니다.

암호화 컨텍스트를 사용하여 암호화 작업을 식별하고 분류할 수 있습니다. 또한 기본 암호화 컨텍스트 ARN 값을 사용하면 어떤 Amazon S3 ARN이 어떤 암호화 키와 함께 사용되었는지 확인하여 AWS CloudTrail에서 관련 요청을 추적할 수 있습니다.

CloudTrail 로그 파일의 requestParameters 필드에서 암호화 컨텍스트는 다음과 비슷하게 표시됩니다.

"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1/file_name" }

S3 버킷 키 기능과 함께 SSE-KMS를 사용하는 경우 암호화 컨텍스트 값은 버킷의 ARN입니다.

"encryptionContext": { "aws:s3:arn": "arn:aws:s3:::DOC-EXAMPLE-BUCKET1" }

AWS 서명 버전 4

Signature 버전 4는 HTTP로 전송된 AWS 요청에 인증 정보를 추가하는 프로세스입니다. 보안을 위해 대부분의 AWS 요청은 액세스 키 ID와 보안 액세스 키로 구성된 액세스 키로 서명해야 합니다. 이 두 키는 일반적으로 보안 자격 증명이라고 합니다. 자세한 내용은 요청 인증(AWS 서명 버전 4)서명 버전 4 서명 프로세스를 참조하세요.

중요
  • AWS KMS 암호화 객체에 대한 모든 GET 및 PUT 요청은 Secure Sockets Layer(SSL) 또는 전송 계층 보안(TLS)을 사용하여 이루어져야 합니다. 또한 AWS 서명 버전 4(또는 AWS 서명 버전 2)와 같은 유효한 보안 인증 정보를 사용하여 요청에 서명해야 합니다.

  • 객체가 SSE-KMS를 사용하는 경우 GET 요청 및 HEAD 요청에 대해 암호화 요청 헤더를 전송하면 HTTP 400 BadRequest 오류가 발생합니다.