AWS

AWS KMS를 사용해서 암호화 - 복호화하기

cwchoiit 2024. 2. 26. 15:16
728x90
반응형
SMALL
728x90
SMALL

 

KMS (Key Management Service)

AWS KMS는 암호화 및 복호화를 위해 사용되는 키를 생성 및 관리할 수 있는 서비스이다. 데이터 암호화는 데이터가 곧 자산이기 때문에 필수적으로 필요한 과정이다. 데이터 암호화는 크게 두가지로 나뉘어질 수 있다.

  • 전송 중인 데이터 암호화 (HTTPS)
  • 저장되어 있는 데이터 암호화 (Client Side, Server Side)

HTTPS 설정은 AWS에서 간단하게 할 수 있다. 도메인을 하나 사고 해당 도메인에 대한 SSL인증을 받은 후 사용하면 된다.

저장되어 있는 데이터 암호화는 두 가지로 또 나뉘어진다.

 

AWS에선 Server Side 암호화를 알아서 해준다. 서버에 저장된 데이터를 암호화 시켜놓고 암호화 키를 자동으로 관리한다. S3, RDS, DynamoDB 등은 모두 암호화 기능을 기본으로 갖추고 있다. 

 

Client Side 암호화는 사용자가 직접 암호화 키를 관리한다. 필요하다면 AWS KMS를 활용할 수 있고 해볼것.

그래서 KMS는 암호화 키를 관리해주는 서비스이고 이 암호화 키를 CMK(Customer Master Key)라고 한다.

 

CMK를 HSMs(Hardware Security Modules)라는 저장소에 저장하는데 이 저장소에 있는 CMK를 사용하기 위해 KMS API를 사용한다. 그럼 이제 직접 사용하면서 이해해보자.

 

 

 

암호화 키 만들기

AWS Console에 "KMS"를 입력하고 나오는 Key Management Service를 클릭한다.

 

Create a key 버튼을 클릭한다.

 

Configure key 화면은 다음과 같이 설정한다.

- Key type: Symmetric

- Key usage: Encrypt and decrypt

- Key material origin: KMS

- Regionality - Single-Region key

 

Add lables 화면은 다음과 같이 Alias와 Description을 적절하게 입력 후 Next.

 

Define key administrative permissions는 두 가지 유형으로 선택이 가능하다. 

- User: 특정 유저 또는 복수의 유저에게 관리 권한을 부여

- Role: 특정 역할 또는 복수의 역할에게 관리 권한을 부여

 

Defind key usage permissions는 위와 비슷하게 User, Role 선택이 가능한데 이는 사용 권한을 부여하는 것.

 

사용 권한과 관리 권한의 차이는 허용되는 행위에 허가의 차이가 있다. 사용 권한은 암호화 된 데이터를 복호화할 수 있는 거고 관리 권한은 그 외 나머지 기능도 수행할 수 있다.

 

그 다음으로 넘어가면 이제 Review 화면이다. 아래는 선택한 구성대로 만들어진 Key policy JSON 파일이다. 수정할 것은 없다.

 

이렇게 Finish 버튼을 클릭하면 KMS에 다음과 같이 내가 만든 키가 리스트에 노출된다.

 

이제 이 키를 사용해보자.

 

EC2 인스턴스 생성 및 설정

EC2를 특별하게 설정할 필요 없이 기본으로 만들어준다. 만들고 해당 EC2 내부로 SSH를 이용해서 들어가보자.

ssh -i yourkey.pem ec2-user@your-ec2-ip-address

 

다음과 같이 내부로 들어왔다.

 

첫번째로 aws-cli를 설치한다.

sudo yum update
sudo yum install awscli

 

근데 Amazon Linux로 EC2를 만들었다면 이미 있을것이다.

 

이제 "aws configure"를 실행해서 사용자 설정 정보를 입력하자.

aws configure

 

다음 화면처럼 하라는대로 다 해주자.

 

이제 python3을 설치하고 aws-encryption-sdk를 설치해야한다.

sudo yum install python3-pip
pip install aws-encryption-sdk

 

이제 aws-encryption-sdk를 사용하기 위한 파일 하나를 만들어줘야 한다.

vi encrypt.py
# encrypt.py

import aws_encryption_sdk
from base64 import b64encode
from aws_encryption_sdk import CommitmentPolicy

# AWS KMS Client 생성
client = aws_encryption_sdk.EncryptionSDKClient(commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT)

# Your AWS KMS Key ARN
key_arn = "your aws kms key arn"

# 암호화 하고자 하는 텍스트
source_plaintext = "hi"
 
kms_kwargs = dict(key_ids=[key_arn])

# 나의 CMK
master_key_provider = aws_encryption_sdk.StrictAwsKmsMasterKeyProvider(**kms_kwargs)

# 암호화 된 텍스트와 Encryptor Header
ciphertext, encryptor_header = client.encrypt(source=source_plaintext, key_provider=master_key_provider)

# 암호화 된 텍스트 출력
print(ciphertext)

# 복호화 된 텍스트와 Decryptor Header
cycled_plaintext, decrypted_header = client.decrypt(source=ciphertext, key_provider=master_key_provider)

# 복호화 된 텍스트 출력
print(cycled_plaintext)

 

이제 이 파일을 실행해보자. 

python3 encrypt.py

 

실행 결과:

결과를 보면 암호화 된 텍스트는 저렇게 쭉 길게 늘어진 알 수 없는 문자열이고 복호화 된 텍스트는 빨간 박스로 친 'hi'이다.

 

결론

이렇게 AWS KMS를 사용해서 암호화 하고자하는 것을 암호화하고 복호화할 수 있다. 주로 사용되는 예시라고 함은 Django를 사용할 때 settings.py 파일에서 ALLOWED_HOSTS = []에 사용되는 URL을 암호화한 상태로 저장하고 복호화하는 코드만 넣어서 URL을 숨길수도 있다.

728x90
반응형
LIST