Cloud Infra Architecture (AWS)/AWS Build

[AWS KMS] AWS CLI로 클라이언트 측 암호화하기 [T]

seongduck 2024. 10. 30. 16:34

해당 작업을 진행하려면 사용할 EC2 권한에 다음을 추가해야 한다.

1) IAM -> Policy -> KMS -> 다음
2) Write(Decrypt, Encrypt, GenerateDataKey, GenerateDataKeyWithoutPlaintxt)
3) Tagging (All tagging actions)
4) Resources All 선택 -> 이름 생성 후 Create policy

1) IAM -> Roles -> EC2에 부착되어 있는 Roles 선택
2) 위에서 만든 정책을 넣어준다.

1) 암호화할 대상 만들기

sudo echo "암호화할 대상 데이터" > samplesecret.txt

 

2) DataKey 생성하기

AWS KMS에 CMK를 참조하는 데이터 키를 생성하도록 요청 (CMK는 데이터 키를 암호화하기 위해 참조)

aws kms generate-data-key --key-id alias/ImportedCMK --key-spec AES_256 --encryption-context project=workshop
#암호화-컨텍스트 (Encryption Context) 매개변수 사용
#데이터에 대한 추가 컨텍스트를 제공하는 선택적 키 쌍으로 복호화할 때 함께 제공해야 함
#암호화 컨텍스트는 암호화된 데이터의 무결성을 지원한다

ImportedCMK라고 만들어 졌다.

 

3) Data Key를 사용하여 암호화 진행

256비트 길이의 데이터 키를 사용하여 데이터를 암호화한다.

echo '위에서 만든 키의 Plaintext 값' | base64 --decode > datakeyPlainText.txt
#위에서 얻은 base64로 인코딩된 평문 데이터 키(Plaintext)를 디코딩하여 파일에 저장


echo '위에서 만든 키의 CiphertextBlob 값' | base64 --decode > datakeyEncrypted.txt
#암호화된 평문(CiphertextBlob)도 같은 방식으로 처리

 

아까 비밀로 하려고 했던 파일 암호화 진행

openssl enc -aes-256-cbc -pbkdf2 -salt -in samplesecret.txt -out encryptedSecret.txt -pass file:datakeyPlainText.txt
#OpenSSL 라이브러리를 사용하여 AES256으로 암호화

more encryptedSecret.txt #암호화 확인

encryptedSecret.txt파일에 암호화된 텍스트가 저장되었다.

평문의 데이터 키를 삭제하여 중요 키의 유출을 방지

rm datakeyPlainText.txt

 

4) 암호화된 비밀 텍스트 복호화

3) 과정을 통해 만든 EncryptedSecret.txt 비밀 텍스틀르 복호화 해보자

aws kms decrypt --ciphertext-blob fileb://datakeyEncrypted.txt #실패
#CMK로 암호화할 때 암호화 컨텍스트를 사용했기에 실패

aws kms decrypt --encryption-context project=workshop --ciphertext-blob fileb://datakeyEncrypted.txt
#복호화를 위해서는 암호화에 사용된 암호화 컨텍스트를 제공해야 한다.

 

base64에서 이를 디코딩하고 이를 사용하여 암호화된 비밀 파일을 복호화하자

echo '맨 처음 만들었던 PlainText의 ID 값' | base64 --decode > datakeyPlainText.txt

-> 데이터 키가 평문으로 되어 있고 base64에서 디코딩 완료

 

openssl enc -d -aes-256-cbc -pbkdf2 -in encryptedSecret.txt -out decryptedSecret.txt -pass file:datakeyPlainText.txt

디코딩된 암호문을 복호화 완료