우선 이번 실습에서는 직접 KMS을 python SDK를 활용해 보겠습니다.
실습 시작
우선 실습을 하기에 앞서 KMS키를 하나 만들어 주도록 하겠습니다.
우선 SYMMETRIC으로 설정해주겠습니다
그리고 키 권한을 제가 이전에 만든 awscli에 관리자 권한을 부여해 주겠습니다.
그리고 사용자 권한도 awscli에 그냥 주겠습니다.
그리고 새로운 EC2인스턴스를 하나 만들어주고 이제 본격적인 실습 진행해 보겠습니다.
$sudo apt update
$sudo apt install awscli
$aws configure
$sudo apt install python3-pip
$pip install aws-encryption-sdk
이제 필요한 모듈은 다 다운받았으므로 python을 통해서 sdk를 작성해 보도록 하겠습니다.
아래 공식문서 가이드를 참고하여 작성하였습니다.
https://github.com/aws/aws-encryption-sdk-python/blob/master/examples/src/mrk_aware_kms_provider.py
/encrypting.py
import aws_encryption_sdk
from aws_encryption_sdk import CommitmentPolicy
from aws_encryption_sdk.key_providers.kms import (
DiscoveryFilter,
MRKAwareDiscoveryAwsKmsMasterKeyProvider,
MRKAwareStrictAwsKmsMasterKeyProvider,
)
# client에게 encrypt, decrypt할 수 있는 권을 주겠다는 의미 ( 기본 정책 )
client = aws_encryption_sdk.EncryptionSDKClient(commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT)
source_plaintext="Hello World!"
# CMK의 ARN을 복사
key_arn = "arn:aws:kms:us-east-1:154309361967:key/4df3585d-24e6-4cff-ac24-915dde3f16c6"
kms_kwargs = dict(key_ids=[key_arn])
# 마스터 키 발급하기 ( CMK )
#master_key_provider = aws_encryption_sdk.StrictAwsKmsMasterKeyProvider(**kms_kwargs)
master_key_provider = MRKAwareStrictAwsKmsMasterKeyProvider(**kms_kwargs)
# data keys를 생성하고 plain data keys를 삭제하고
ciphertext, _ = client.encrypt(source=source_plaintext, key_provider=master_key_provider)
print(ciphertext)
# encrypted data keys에서 plain data keys를 생성하고
# plain data keys를 활용하여 ciphertext를 복호화하고
# plain data keys를 삭제를 진행
cycled_plaintext, _ = client.decrypt(source=ciphertext, key_provider=master_key_provider)
print(cycled_plaintext)
이 코드에는 앞에서 설명한 모든 과정들이 담겨 있습니다. 사용자에게 어떠한 복호화, 암호화 할 수 있는 정책을 주고, CMK의 키의 ARN을 불러와서 이를 활용해서 data key를 활용한 일련의 동작들이 담겨있습니다.
여기서는 그냥 평문인 Hello World!를 암호화하고 복호화 하는 과정을 거쳤습니다.
직접 python을 실행해서 결과를 확인해 보겠습니다.
다음과 같이 ciphertext는 base64로 인코딩되어 있습니다. 이를 확인하려면 인코딩 방식을 UTF-8로 바꾸셔야 합니다. 또한 그 아래에 이를 복호화한 평문이 b'Hello World!'라고 잘 찍히는 것을 확인할 수 있습니다.
이제 client-side에서 원치 않는 정보를 이렇게 암호화하고 복호화하는 API시스템을 구축할 수도 있다고 합니다. 이렇게 하면 만약 원치 않은 정보를 상대방에게 보여주었더라도, 암호화 된 정보이므로 어떻게 뭘 할 수가 없거든요 ㅎㅎ
나중에 지식이 늘어나면 이것도 꼭 한번 해보겠습니다. 관련 우아한형제들 기술 블로그 첨부하겠습니다.
https://techblog.woowahan.com/2518/