KMS
•
AWS에서 제공하는 암호화 키를 생성 및 관리하는 서비스
•
리소스 데이터 암호화 / 복호화
•
디지털 서명 및 확인
•
EBS, S3, RDS 등의 AWS 서비스 데이터 암호화에 KMS 사용
•
감시를 위해 CloudTrail, Cloudwatch 등과 통합되어 모든 키 사용에 관한 로그를 제공
KMS 특징
•
KMS는 거의 모든 AWS 서비스와 같이 사용할 수 있다.
•
KMS는 봉투 암호화(Envelope encryption) 방식을 사용한다.
◦
키를 2개 사용한다. (1)데이터 키와 (2)마스터 키.
◦
암호화 된 봉투 안에 키를 넣는 느낌을 이미지하면 이해하기 쉽다.
•
KMS Key를 작동/사용하면 audit이나 compliance를 위하여 CloudTrail에 사용 로그가 기록된다.
동작 방식 (암호화의 메커니즘)
•
KMS에서는 "KMS 키"와 "데이터 키"라고 불리는 두 가지 종류의 키를 사용하여 데이터를 암호화 및 복호화한다.
•
이렇게 두 단계로 키를 보호하는 방식을 "Envelope Encryption"라고 한다.
•
KMS는 KMS 키와 데이터 키라는 두 단계의 키 관리를 통해 보안을 강화하고 있다.
KMS 키 = 마스터 키 : 데이터 키(CDK)를 생성
•
(Customer Master Key: CMK) = 최근에는 KMS Key라고 한다.
•
KMS는 오직 KMS Key만 관리한다. (Console이나 SDK나 CLI로 KMS Key를 만들 수 있다.)
•
CMK는 오직 생성된 region에만 있는다. (다른 region에는 가지 않는다.)
•
최대 4KB의 데이터를 암호화 할 수 있다. (더 큰 데이터는 Data key를 사용해라)
•
AWS Console이나 AWS KMS APIs를 사용해서 KMS Key와 상호작용 가능하다.
데이터 키: 데이터를 암호•복호화
•
(Customer Data Key: CDK)
•
KMS Key가 데이터키를 생성한다.
•
더 큰 데이터를 암호화 해야할 경우 데이터 키를 활용한다.
•
데이터 키를 생성하면 2개의 키가 생긴다.
1.
Plaintext Data Key - 암호화 안한 키
2.
Encrypted Data Key - 암호화 한 키
Plaintext Data Key : 데이터를 암호화 한다.
•
Plaintext data는 그냥 데이터를 뜻한다.
•
Plaintext Data Key를 통해 데이터를 암호화하여 아무도 이해할 수 없는 ciphertext라는 것을 만들어 낸다.
•
암호화를 완료하면 Plaintext Data Key를 삭제한다. (아무도 복호화 할 수 없도록)
삭제해버리면 어떻게 데이터를 복호화(Decrypt) 하는가?
Encrypted Data Key: CMK에 의해서 암호화된 데이터 키
•
Encrypted Data Key는 CMK에 의해서 암호화 되었다.
•
반대로 CMK를 이용해서 Encrypted Data Key를 복호화 할 수 있다.
•
Encrypted Data Key를 복호화하면 Plaintext Data Key 다시 생긴다.
•
Plaintext Data Key를 통해서 데이터를 복호화 할 수 있다.
다중 리전 키 (Multi-Region Keys)
•
여러 리전에서 동일한 키를 가지고 있는 것
•
다중 리전 키의 각 세트에는 동일한 키 구성 요소와 키 ID가 있으므로 KMS를 다시 암호화하거나 크로스 리전 호출을 수행하지 않고 하나의 AWS 리전에서 데이터를 암호화 하고 다른 AWS 리전에서 복호화 가능
•
동일한 키를 사용하면 다른 리전의 데이터를 서로 다른 키로 다시 암호화 할 필요가 없음
•
DynamoDB 글로벌 테이블 및 DynamoDB 암호화, 멀티 리전의 복제된 S3 버킷의 암호화 등에 사용 가능
Server-Side Encryption SSE (서버 사이드 암호화)
•
AWS 스토리지(예: S3)에 데이터가 저장할 때 서버가 암호화를 수행하며, 사용자가 데이터를 꺼낼 때 서버가 복호화한다.
•
S3의 데이터의 서버 사이드 암호화(SSE)에는 다음의 3가지 방법이 있다.
◦
SSE-S3 : S3가 암호화 키를 작성 및 관리하고 S3 데이터를 암호화/복호화한다.
◦
SSE-KMS : KMS에 저장 및 관리되는 KMS 키를 사용하여 S3 데이터를 암호화/복호화한다.
◦
SSE-C: 사용자가 관리하는 키를 사용하여 S3 데이터를 암호화/복호화한다.
Client-Side Encryption CSE (클라이언트 사이드 암호화)
•
서버에 데이터를 전송하기 전에 클라이언트 측에서 암호화를 수행하며, 서버 측에서는 받은 데이터를 그대로 저장한다. 데이터의 복호화도 클라이언트 측에서 진행한다.
3가지 키 지원 방식
•
AWS managed key
◦
AWS 에서 default로 제공
◦
AWS 서비스가 고객의 계정에서 고객 대신 생성, 관리 및 사용하는 KMS 키
◦
키 정책, 삭제 등의 제어 권한이 없거나 제한이 있음
◦
사용자가 직접적으로 제어 불가능
•
Customer managed key
◦
사용자가 직접 키를 생성, 소유 및 관리하는 AWS 계정의 KMS 키
◦
IAM 을 통해 권한 부여
◦
가장 많이 사용하는 방식
◦
키(CMKs)는 Hardware Security Module(HSM) 라는 곳에 저장된다.
▪
누군가 HSM을 조작하거나 접근할려고 하면 모든 키를 지워버린다.
•
AWS owned keys
◦
AWS 서비스가 여러 AWS 계정에서 사용하기 위해 소유하고 관리하는 KMS 키 모음
KMS GenerateDataKey API
•
GenerateDataKey API는 데이터를 암호화위해 사용하는 데이터 키(Data Key)를 생성하는 데 사용된다.
•
생성한 데이터 키(Data Key)를 사용하여 데이터를 암호화한다.
•
주요 목적은 데이터 키를 직접 저장하거나 노출시키지 않고 안전하게 데이터를 암호화/복호화할 수 있도록 지원하는 것이다.
•
(GenerateDataKey API는 주로 애플리케이션 내부에서 암호화를 위해 사용된다)
•
GenerateDataKey API를 사용하면 Ciphertext Key(데이터 키)와 Plaintext Key(평문 데이터 키)를 반환한다.
import boto3
# KMS 클라이언트 생성
kms_client = boto3.client('kms')
# GenerateDataKey 호출
response = kms_client.generate_data_key(
KeyId='alias/my-key', # KMS 키 ID 또는 별칭
KeySpec='AES_256' # 생성할 데이터 키 유형 (AES 256비트)
)
plaintext_key = response['Plaintext'] # 평문 데이터 키 (메모리에서만 사용해야 함, 사용 후 폐기한다)
ciphertext_key = response['CiphertextBlob'] # 암호화된 데이터 키 (스토리지에 안정하게 저장)
print("Plaintext Key (사용 후 폐기):", plaintext_key)
print("Ciphertext Key (안전하게 저장):", ciphertext_key)
Python
복사
KMS Encrypt API
•
Encrypt API는 주어진 데이터를 직접 암호화하는 데 사용된다.
•
주어진 데이터를 KMS에서 관리하는 키로 즉시 암호화하고, 암호화된 데이터를 반환한다. (데이터 암호화에 사용된 키는 KMS(AWS 쪽에서)가 직접 관리한다)
•
암호화할 데이터가 적고, KMS에서 직접 암호화해도 되는 경우 Encrypt API를 사용하면 좋다
import boto3
# KMS 클라이언트 생성
kms_client = boto3.client('kms')
# 암호화할 데이터
plaintext_data = "This is a secret message"
# KMS Encrypt API 호출
response = kms_client.encrypt(
KeyId='alias/my-key', # 사용하려는 KMS 키 ID 또는 별칭
Plaintext=plaintext_data.encode('utf-8') # 암호화할 원본 데이터
)
# 암호화된 데이터 (CiphertextBlob)
encrypted_data = response['CiphertextBlob']
print("Encrypted Data:", encrypted_data)
Python
복사











