티스토리 뷰

develop

AWS KMS

yogae 2021. 10. 17. 22:20

AWS에 데이터 저장 시 암호화 적용

클라이언트 측 암호화와 서버 측 암호화를 구분하는 기준은 어디서 암호화를 하느냐는 것이다. 클라이언트에서 암호화를 암호화하는 경우 CSE이고 AWS내의 서버에서 암호화를 하는 경우를 SSE라고 한다. S3에서 object 저장 시 암호화하여 저장하는 방식이 SSE에 해당한다. S3에 object를 업로드하기 전 object를 암호화하여 s3에 저장하는 방식은 CSE에 해당한다.

 

  • 클라이언트 측 암호화(Client-Side Encrytion)
    • 데이터를 전송하기 전에 암호화 수행
    • 고객이 직접 암호화 키를 마련하고 직접 관리하거나, AWS KMS / CloudHSM내에 보관 관리
  • 서버 측 암호화(Server-Side Encryption)
    • AWS가 전송된 데이터에 대해 고객 대신 버서 측에서 암호화 작업 수행
    • 총 58개 서비스 연동: S3, EBS ....
    • 고객 관리 통제 하에 AWS KMS에 암호화키 보관

CMK

KMS를 조사하면서 혼동되었던 부분이 CMK와 데이터 키이다. CMK는 KMS에 내부에 저장되어 외부유출을 방지한다. AWS KMS는 데이터 키를 저장, 관리 또는 추적하지 않는다. Aws-sdk에서 특정 CMK를 지정하려면 keyid를 사용한다. CMK를 사용하여 데이터키를 생성하며 데이터키로 암/복호화를 한다.

CMK의 특징

  • CMK은 절대 평문 형태로 HSM을 벗어나지 않는다.
  • CMK는 HSM에 저장된 도메인 키로 암호화되며 암호화된 상태로 KMS 내부의 별도 저장공간(KMS Host)에 저장된다.
  • 데이터키는 KMS 내부의 HSM에서 생성된다.
  • 생성된 데이터키는 CMK로 암호화하여 평문 데이터키와 함께 전달된다.

CMK 종류

관리 주체에 따른 CMK 종류

  • customer managed key
    • 생성, 소유 관리할 수 있는 CMK이다.
  • AWS managed key
    • AWS KMS와 통합된 AWS service에 의해 생성, 괸리, 사용되는 CMK이다. 사용자가 직접 관리하거나 변경할 수 없다.
    • 특정 AWS service에서는 AWS managed key만을 제공할 수 있다.
  • AWS owned key
    • multiple AWS account에서 사용하기 위해 AWS service에서 소유하고 관리하는 CMK이다.
    • 사용자가 생성, 관리할 필요없다. 하지만 사용자가 사용, CloudTrail 통한 사용 기록을 호가인할 수 없다.
    • key의 사용 요금이 없다.

대칭키 / 비대칭키

AWS KMS key는 default로 대칭키를 사용한다. AWS KMS와 연동된 AWS service에서는 데이터를 암화하기 위해 대칭키를 사용한다(비대칭키 사용을 제공하지 않음).
비태칭키는 공개키와 비밀키로 구성된다. 비밀키는 암호화되지 않은 형태로 AWS KMS 외부로 전송되지 않는다. 비밀키를 사용하기 위해서는 AWS KMS API를 요출해야 한다.

데이터키

데이터키를 생성할 때 평문 데이터 키와 암호화된 데이터 키가 반환된다. 암호화된 데이터 키는 복호화에 사용되며, 데이터와 함께 저장해도 안전하다. 데이터 키는 AWS KMS에서 저장, 관리되지 않는다.

봉투암호화

봉투 암호화 동작 방식(대칭키 사용)

  1. 데이터 키 생성
var params = {
  KeyId: "alias/ExampleAlias", // The identifier of the KMS key to use to encrypt the data key. You can use the key ID or Amazon Resource Name (ARN) of the KMS key, or the name or ARN of an alias that refers to the KMS key.
  KeySpec: "AES_256"// Specifies the type of data key to return.
 };
 kms.generateDataKey(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
   /*
   data = {
    CiphertextBlob: <Binary String>, // 암호화된 데이터 키 - 데이터 복호화를 위해 사용
    KeyId: "arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", // The ARN of the KMS key that was used to encrypt the data key.
    Plaintext: <Binary String>// 데이터 키 - 데이터 암호화를 위해 사용하며 암호화에 사용하고 따로 저장하지 않고 삭제해야한다.
   }
   */
 });
  1. 평문 데이터 키를 이용하여 평문을 암호화합니다. 암호화가 완료되면 평문 데이터 키는 삭제합니다.
// 예시
var encrypted = CryptoJS.AES.encrypt("Message", "<1번에서 반환된 Plaintext - 데이터 키>");
  1. 암호화된 문자열과 암호화된 Data Key를 반환합니다.

봉투 복호화 동작 방식(대칭키 사용)

  1. 암호화된 데이터 키 복호화
 var params = {
  CiphertextBlob: <Binary String>, // The encrypted data (ciphertext).
  KeyId: "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"// A key identifier for the KMS key to use to decrypt the data.
 };
 kms.decrypt(params, function(err, data) {
   if (err) console.log(err, err.stack); // an error occurred
   else     console.log(data);           // successful response
   /*
   data = {
    KeyId: "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", // The Amazon Resource Name (ARN) of the KMS key that was used to decrypt the data.
    Plaintext: <Binary String>// The decrypted (plaintext) data.
   }
   */
 });
  1. 평문 Data Key를 이용하여 암호화된 문자열을 복호화하여 반환합니다. 복호화가 완료된 평문 Data Key는 삭제합니다.
// 예시
var decrypted = CryptoJS.AES.decrypt(encrypted, "<1번에서 반환된 Plaintext - 데이터 키>");

Reference

'develop' 카테고리의 다른 글

DAS / NAS / SAN  (0) 2021.10.29
3 계층 architecture  (0) 2021.10.29
node.js multi processing, threading  (0) 2021.04.02
VPC AWS ElasticSearch Service로 Cognito 인증 접근  (0) 2021.02.05
Airflow 기본 시용법 정리  (0) 2021.01.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함