일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 하나머니
- S3
- VPC
- 후기
- docker network
- Linux
- aws codecommit
- 포인트앱
- 재테크
- python3
- Container
- clone
- 도커
- network
- Python
- 리워드앱
- 실사용
- MongoDB
- 토스카드
- 앱테크
- codecommit
- docker
- built-in
- 커피머니불리기
- 리뷰
- MongoEngine
- AWS
- mininet
- namespace
- DocumentDB
- Today
- Total
ㅍㅍㅋㄷ
AWS KMS 어렵지 않아요. 본문
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) 기준으로 설명한 것이다.
단계별로 자세한 동작 방법을 알아보자.
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 가 있다.
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 이라고 부른다.
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
'IT > AWS' 카테고리의 다른 글
AWS EC2 Container Service(ECS) (1) - 구조와 특징 (4) | 2016.06.20 |
---|---|
AWS EC2 Container Registry(ECR) 어렵지 않아요 (3) | 2016.06.20 |
AWS VPC를 디자인해보자(4) - VPC Peering을 활용한 Multi VPC 사용하기 (4) | 2016.06.20 |
AWS VPC를 디자인해보자(3) - NAT Gateway 와 Bastion host (3) | 2016.06.16 |
AWS VPC를 디자인해보자(2) - ACL과 Security Group을 활용한 보안 강화 (10) | 2016.06.13 |