ㅍㅍㅋㄷ

AWS KMS 어렵지 않아요. 본문

IT/AWS

AWS KMS 어렵지 않아요.

클쏭 2019. 5. 14. 22:54

 

AWS KMS 란 무엇인가

KMS 는 Key Management Service 의 약자로, 

데이터를 암호화 할때 사용되는 암호화 Key 를 안전하게 관리하는데 목적을 둔 서비스라고 보면 된다. 

 

KMS 는 크게 세가지 방식으로 key 관리 서비스를 제공한다.

 

- AWS managed key

- Customer managed key

- Custom key stores

 

 AWS managed key 는 AWS 서비스들이 KMS 를 통해 Key를 서비스 받는 것으로, 내부적으로 자동으로 일어나게 되며 사용자가 직접적으로 제어가 불가능하다.

 

 Customer managed key (CMK) 는 사용자가 직접 key를 생성하고 관리하는 것으로 해당 포스팅에서 주로 다룰 방식이 바로 CMK 이다. CMK 에 대한 제어는 IAM 을 통해 권한을 부여 받아 제어가 가능하다.

 

 마지막으로 Custom key stores는 AWS 에서 제공하는 또다른 key 관리형 서비스인 CloudHSM 을 활용한 Key 관리 형태를 의미한다. KMS 와 CloudHSM의 차이가 무엇인지는 AWS의 공식 FAQ 문서를 보면 알 수 있는데 일부분을 발췌해 보았다.(https://aws.amazon.com/ko/cloudhsm/faqs/)

 

 

" Q: AWS Key Management Service(KMS)는 AWS CloudHSM과 어떻게 다릅니까?

AWS Key Management Service(KMS)는 암호화 키를 사용하고 관리할 수 있는 멀티 테넌트 관리형 서비스입니다. 두 서비스 모두 암호화 키를 위한 높은 수준의 보안을 제공합니다. AWS CloudHSM은 Amazon Virtual Private Cloud(VPC)에서 바로 FIPS 140-2 레벨 3 전용 HSM을 제공하며 이 HSM은 사용자가 독점적으로 제어하게 됩니다. "

 

 

즉, KMS는 Shared 형태의 managed 서비스 이며, CloudHSM은 dedicated managed 서비스로 사용자 VPC의 EC2에 HSM(Hardware Security Module) 을 올려서 서비스되는 형태라고 보면 된다. 결국 CloudHSM이 조금 더 강력한 형태의 보안 안정성을 제공한다고 이해하면 될 것 같다. 

 

 

동작 방식

KMS의 동작 방식을 간단히 도식화 하면 아래와 같다.

참고로 아래 그림은 Customer Master Key(CMK) 기준으로 설명한 것이다.

[ KMS 동작 방식 ]

 

 

단계별로 자세한 동작 방법을 알아보자.

 

1) 먼저는 KMS 에 Customer Master key(CMK)를 생성한다. 이 Master key 는 데이터를 암호화 하기 위해 사용되는 Data key를 생성하는데 사용된다. AWS Console 에서 간단하게 생성 가능하다.

 

  아래는 임시로 만든 demo_cmk 라는 master key 값이다. 

 

  이제 이 master key 를 통해 data key 를 만들어 보자.

 

 

2) Data key는 CMK 로부터 GenerateDataKey 라는 작업을 통해 생성되는데, 이때 생성되는 Data key 는 크게 두가지 종류로 Plaintext data key 와 Encrypted data key 가 있다.

 

[ CMK 와 Data key ]

 

 

3) Plaintext data key는 데이터를 암호화 하는데 사용한다. 암호화 과정은 OpenSSL 을 이용하거나 AWS 에서 제공하는 Encryption SDK 를 사용하면 된다. 데이터를 암호화 한 이후에는 해당 Plaintext data key 는 더이상 사용할 필요가 없으며, 폐기하도록 한다. (메모리에서 제거)

  Plaintext data key 를 폐기하면 이제 남은 것은 Encrypted data key 뿐이다. 해당 key는 데이터를 복호화 할때 사용해야 한다. 따라서 암호화된 Data 와 함께 encrypted data key 또한 함께 안전하게 보관하도록 한다. 

 

  이렇게, key를 이용하여 암호화 시킨 데이터와 함께 key 또한 암호화 하고, 이것을 암호화된 데이터와 함께 동봉하여 보관하는 방식을 Envelope Encryption 이라고 부른다. 

 

[ Plaintext data key 를 이용한 데이터 암호화 ]

 

 

4) 이제 암호화된 데이터를 복호화 해보자.

    암호화된 데이터를 복호화 하려면 먼저 평문화된(plaintext) data key 가 필요하다. 하지만 우리는 위 3번 단계에서 데이터를 암호화 한 이후 plaintext data key 를 폐기한 상태이며, 남은 것은 encrypted data key 뿐이다. 즉, encrypted data key를 다시 plaintext data key 로 변환 하는 과정이 필요하다. 이때 data key를 복호화 하는 과정에 CMK 가 다시 사용되며, plaintext 로 변환된 data key를 통해 다시 암호화된 데이터를 복호화 하는 과정을 거치면 된다.

[데이터 복호화 과정]

 

 

 

아래는 KMS를 이용해 데이터를 암호화/복호화 하는 Python 예제이다. 

KMS 에 접근하여 CMK 를 통해 data key 생성하는 부분은 AWS 의 python SDK인 boto3를 이용하였으며,

data key를 이용한 데이터 암호화는 대칭키 암호화 방식인 AES 를 활용하였다.

import boto3
import base64
from Crypto.Cipher import AES

BLOCK_SIZE = 32
PADDING = '|'

key_arn = '{{ KMS_ARN }}'
message = 'This is test for KMS. written by JHSong'

client = boto3.client('kms')

data_key = client.generate_data_key(
    KeyId=key_arn,
    KeySpec='AES_256'
)

pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING

plaintext_key = data_key.get('Plaintext')
encrypted_key = data_key.get('CiphertextBlob')

###### Encrypted data ######## 
encryptor = AES.new(plaintext_key)
encrypted_data = base64.b64encode(encryptor.encrypt(pad(message)))

print("########## Encrypted Data ##############")
print(encrypted_data)

###### Decrypted data ######## 
decrypted_key = client.decrypt(CiphertextBlob=encrypted_key).get('Plaintext')
decryptor = AES.new(decrypted_key)

decrypted_str = decryptor.decrypt(base64.b64decode(encrypted_data)).decode('utf-8')

print("########## Decrypted Data ##############")
print(decrypted_str.rstrip(PADDING))

 

  결과를 보면 아래와 같다.

 

########## Encrypted Data ##############
b'NQiEIPn2kBQ9h3kfAtNiolMb+kBYFucfKZ8yNiHj6NW51/qH3nbJW2CW3WbFlpf1NHgGvSLVYswSQNBfjBymNA=='

########## Decrypted Data ##############
This is test for KMS. written by JHSong

 

 

Key 삭제에 대하여

 KMS 에서 제공되는 key 를 삭제할 경우, 만약 해당 key를 활용해 암호화된 데이터가 있다면 복호화는 영원히 불가능하다고 보면 된다. 따라서 key를 삭제하는 행위는 신중해야 할 것이다.

 AWS 측에서도 이러한 이유 때문인지 key 의 즉시 삭제를 지원하지 않으며, Schedule key deletion 방식만 제공한다. key 삭제시 7~30일간의 유예 기간을 주게 되어 있다. 해당 시간 사이에는 key 삭제 명령에 대해 취소가 가능하다.

 

 

주의 사항

 KMS 는 관리형 서비스이기 때문에 AWS의 API 로 제어해야만 한다. 그런데 API Request 에 대한 Limitation 이 있으므로 빈번한 사용을 요하는 경우는 반드시 Request per seconds 값을 확인하고 사용하도록 한다.

 

 

[참고]

https://docs.aws.amazon.com/kms/latest/developerguide/overview.html

https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/python-example-code.html

https://docs.aws.amazon.com/kms/latest/developerguide/limits.html

 

Comments