Search

KMS

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
복사