순서는 다음과 같다.
- AWS KMS에 빈 KMS 키를 생성 후, 외부 키를 해당 KMS에 채운다.
- 외부 키를 가져오기위해 래핑 수행
- OpenSSL 라이브러리로 키 구성요소 생성하기
- API를 통해 빈 KMS 키로 가져오기
외부 키가 있는 경우는 바로 진행하면 되고, 없을 때를 가정하여 임의로 만들어서 진행한다.
항상 진행은 EC2 CLI를 통해 진행한다.
우선 해당을 실행하려면 몇가지 IAM Role 및 Policy가 필요하다.
1) IAM -> Policies -> Create Policy
2) KMS -> Write(ImportKeyMaterial) -> ALL Resources
3) 이름 작성 -> Create Policy
1) IAM -> EC2에 붙여놓은 IAM Roles 클릭
2) Add Permissions -> Attach Policies -> 방금 만든 Policy 선택 -> Add permissions
1) AWS KMS에 빈 KMS 키를 생성
aws kms create-key --origin ExternalKEY #ExternalKEY를 통해 외부에서 가져온 키를 표시
- 2)
외부 키를 가져오기위해 래핑 수행
aws kms get-parameters-for-import --key-id "위의 KeyID 입력" --wrapping-algorithm RSAES_OAEP_SHA_1 --wrapping-key-spec RSA_2048
만들어지는 PublicKey와 ImportToken은 사용해야 하므로 다음 형식으로 저장한다.
vi PublicKey.b64 #위의 PublicKey 값
vi ImportToken.b64 #위의 ImportToken key 값
#확장자 변경
openssl enc -d -base64 -A -in Publickey.b64 -out Publickey.bin
openssl enc -d -base64 -A -in ImportToken.b64 -out ImportToken.bin
그러면 bin이 만들어지는데 이는 추후 래핑할 때 사용한다.
3) OpenSSL 라이브러리로 키 구성요소 생성하기
일반적으로 키 구성요소는 키 생성을 담당하는 회사의 엔터프라이즈 HSM이나 키 관리 시스템에서 가져온다.
하지만 그 환경이 아니므로 인스턴스에서 OpenSSL 라이브러리를 사용하여 키를 생성한다.
openssl rand -out genkey.bin 32 #256비트 대칭 키 생성 후 genkey.bin 파일에 저장
genkey.bin에는 CMK의 키 구성요소이다.
해당 키 구성요소를 AWS KMS에서 가져온 공개 키(Publickey.bin)로 감싸기
openssl pkeyutl -encrypt -in genkey.bin -inkey Publickey.bin -keyform DER -pubin -out WrappedKeyMaterial.bin -pkeyopt rsa_padding_mode:oaep
#생성된 키 구성요소를 가져와 AWS KMS에서 다운로드한 공개 키로 암호화 후 Wrapped~~.bin 파일로 저장
Wrapped~~.bin이라는 래핑된 암호화된 키 자료가 만들어진다.
4) API를 통해 빈 KMS 키로 가져오기
AWS KMS로 가져오기 위해서는 위의 래핑한 bin파일과 ImportToken.bin이 필요하다. 다음으로 실행
aws kms import-key-material --key-id "처음만들었던 KeyID 입력" --encrypted-key-material fileb://WrappedKeyMaterial.bin --import-token fileb://ImportToken.bin --expiration-model KEY_MATERIAL_EXPIRES --valid-to 2025-01-01T12:00:00-08:00
AWS Console에서 KMS를 확인해보면 구성이 완료
별첨) 방금 만든 Key Alias 별칭 붙이기
aws kms create-alias --alias-name alias/ImportedCMK --target-key-id '맨 처음에 만들었던 KeyID'
aws kms list-aliases #방금 만든거 확인