본문 바로가기
[AWS 기타]

[AWS 기타] AWS KMS란 무엇인가?

by SAMSUNG Metaverse-Cloud 2022. 11. 27.
728x90

 

 

 

AWS KMS란 무엇인가?

AWS KMS는 암호화 작업에 사용되는 키를 쉽게 생성하고 제어할 수 있도록 지원하는 관리형 서비스이다. 이 서비스는 고가용성 키 생성, 스토리지, 관리 및 감사 솔루션을 제공하므로, 이를 통해 자체 애플리케이션 내 데이터를 암호화 또는 디지털 방식으로 서명하거나, AWS 서비스 전체에서 데이터의 암호화를 제어할 수 있다.

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

  • AWS managed key
    • AWS 서비스들이 KMS를 통해 Key를 서비스 받는 것으로 내부적으로 자동으로 일어나며 사용자의 직접적인 제어는 불가능하다. 
  • Customer managed key
    • 사용자가 직접 Key를 생성하고 관리하는 것이다. 우리가 흔히 말하는 CMK가 여기에 해당된다. 
  • Custom key sotres
    • AWS에서 제공하는 또 다른 Key 관리형 서비스인 CloudHSM을 활용한 Key 관리 형태를 의미한다. 

 

 

 

동작 방식

이 동작 방식은 CMK의 동작방식을 작성 한 것이다. 

먼저 KMS를 통해서 CMK 를 생성한다. 이 Mster Key는 데이터 암호화를 하기 위해 사용되는 Data Key를 생성하는데 사용한다. 

Data Key는 CMK로부터 GenerateDataKey 라는 작업을 통해 생성되는데 이 떄 생성되는 Data Key는 크게 두가지 종류로 나뉜다. 

 

 

 

Plaintext data key는 데이터를 암호화 하는 과정에서 사용한다. 암호화 과정은 Open SSL이나 Encryption SDK를 사용하면 된다. 데이터를 암호화 한 후 Plaintext data Key는 더이상 사용 안하기 때문에 폐기한다. 

Key를 이용하여 암호화 시킨 데이터와 함께 key를 암호화 하고 이를 함께 동봉하는 방식을 Envelope Encryption이라 한다. 

 

 

 

Encrypted data key는 데이터를 복호화 하는 과정에서 사용한다. 그러므로 암호화된 Data와 Encrypted data key는 꼭 중요하게 보관해야 한다. 

 암호화 된 데이터를 복호화하려면 먼저 plaintext data key가 필요하다. 하지만 데이터를 암호화 한 후 plaintext data key는 삭제한 상태이다. 즉 encrypted data key를 다시 plaintext data key로 변환해야 한다. 이때 data key를 복호화 하는 과정에 CMK가 사용되며 plaintext로 변환된 data key를 통해 데이터를 복호화 하는 과정을 거치면 된다.

 

 

 

실습

 

실습은 먼저 S3와 EC2에서 실행할 것이다. 

 

 

사전작업

 

CMK 생성하기

우리가 해보려고 하는 것은 고객 관리형 키 CMK를 생성하는 것이다. 먼저 KMS로 들어온 후 고객 관리형 키를 클릭한다. 그리고 키 생성을 누른다. 

 

 

먼저 키 유형이 대칭인지 비대칭인지 선택해야 한다. 

  • 대칭키
    • 암호화 복호화 할 때 동일한 키를 사용하는 방식을 의미한다. 
  • 비대칭키
    • 암호화 할 때 사용하는 공개키를 사람들에게 공개하는 방식이다. 아무나 이 키를 가지고 암호화 수행이 가능하지만 복호화 하는 개인키는 나만이 가지고 있기 때문에 암호화된 문장은 나만 복호화 할 수 있다. 

우리는 대칭키를 선택 해 줄 것이다. 

 

두번째는 키 사용 목적이다.

우리는 암호화 및 해독을 하는 대칭 KMS키를 사용할 것이다. 

키 사용 목적에 따른 Key 유형을 정해서 생성하면 될 것이다. 

키 구성 요소 원본은 KMS로 선택했다. KMS는 AWS KMS에서 KMS 키에 대한 키 자료를 생성하고 관리하는 것이다. 

외부는 외부 키를 사용하는 경우로 키 자료가 만료되 경우 교체하는것을 포함해서 KMS 외부에서 해당 키 자료를 보호하고 관리하는 것이다. 

사용자 지정 키스토어는 사용자 지정 키 스토어와 연결된 AWS CloudHSM 클러스터의 KMS 키에 대한 자료를 생성하는 것이다. 

우리는 KMS로 지정한다. 

리전은 단일 리전 키로 선택한 후 넘어간다. 

 

 

레이블 추가에서는 키의 이름과 설명을 작성한 후 필요에 따라 태그를 추가하고 다음을 눌러준다.

 

 

 

 

그 다음 키 관리자를 선택한다. 여기서는 키 관리자를 사용자로도 지정할 수 있고 Role로도 지정할 수 있다. 나는 사용자인 comdecommit으로 지정 할 것이다. 

 

그리고 키 삭제를 허용해준다. 

 

 

 

 

키 사용 권한 역시 codecommit만 주었다. 그리고 다음을 눌러주고 완성 시킨다. 

 

 

 

 

##  실습

우리는 Hello world를 통해서 암호화 복호화를 진행 할 것이다. 위는 Hello World라는 단순한 글자지만 실제로는 중요한 비밀번호가 될 수 있다. 

 

 

그 후 aws kms describe-key --key-id 명령어를 사용해서 내가 만든 키를 확인해보자

key 상태는 Enabled이며 Key Manager가 Cutomer인 것을 알 수 있다. 

 

 

그 후 위에서 언급했던 Data-Key를 생성해 줬다. 

AES_256 방식으로 데이터 키를 생성했으며 

Plaintext는 평문 데이터 키이며

CiphertextBlob은 Plaintext를 암호화 한 키이다. 

 

 

 

 

데이터를 암호화 하려면 먼저 decode를 진행해야 한다. 

그러므로  base64 디코딩을 통해 Plaintxt를 먼저 Decoding 시켜준다

그리고 CiphertxetBlob 역시 Decoding 시켜준다.

두 파일 모두 Decoding 된 것을 확인 할 수 있다. 

 

 

 

 

우리는 Open SSL을 통해 암호화를 진행 할 것이다.  Open SSL 또는 SDK를 이용해서 암호화를 진행할 수 있다. 

OpenSSL 네트워크를 통한 데이터 통신에 쓰이는 프로토콜 TLS SSL 오픈 소스 구현판이다. C 언어로 작성되어 있는 중심 라이브러리 안에는, 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구현되어 있다.

 

 

 

확인해 보면 hello-encrypted.txt가 생긴 것을 볼 수 있고 hello world라고 써있던 문자가 암호화가 완료 된 것을 확인할 수 있다.

 

 

 

 

확인을 마친 후 datakey를 삭제해 준다. 왜냐하면 datakey는 현재 plaintext-data의 Decoding 버전이기 때문이다. Plaintext-data는 위에서도 설명했지만 암호화가 완료된 후에는 지우는 것이 좋다. 

 

 

 

그렇다면 복호화는 어떻게 해야 할까?

현재는 datakey가 남아있지 않다. 해당 데이터키의 암호화된 버전만 남아있고 평문 데이터는 우리가 삭제를 했다. 

내 KMS를 호출하여 일반 버전의 텍스트 버전을 가져올 수 있다. 

 

 

 

바로 decrypt 명령어를 통해서 내 Plaintext의 내용을 가져올 수 있다. 

 

 

 

이제 마지막으로 위에서 작성했던 hello world를 복호화 시킬 것이다. 

openssl 명령어를 통해서 hello-encrypted.txt를 복호화해서 hello-decrypted.txt로 변경해 주었다. 

 

 

 

ls를 통해서 하위 파일들을 살펴보니 hello-decrypted.txt라는 파일이 보였다. 

 

 

 

 

vi 편집기를 통해 들어가보니 제대로 복호화 된 것을 확인할 수 있었다. 

 

 

출처

https://enlear.academy/data-encryption-on-aws-part-02-ecb5b1e15451

https://www.youtube.com/watch?v=f3APF1dP8w0&ab_channel=EnlearAcademy 

 

728x90