본문 바로가기
6. 보안 Security

OCI Vault 의 Software 보호 모드 Master Encryption Key 추출하기 1편 - AES 알고리즘

by 동인천급행열차 2024. 4. 6.

OCI 의 키관리 서비스인 Vault 에서 Software 보호 모드의 Master Encryption Key : AES 알고리즘 를 추출하는 방법을 가이드합니다.
 
HSM 모듈을 사용하는 Master Encryption Key와 달리, Software 보호 모드를 사용하는 Master Encryption Key의 경우 OCI CLI를 통해 추출하여 로컬 환경에서도 동일하게 사용하실 수 있습니다.
 
OAEP(Optimal Asymmetric Encryption Padding)라는 메커니즘을 통해 Software 보호 모드의 Master Encryption Key를 변환하고, 이를 공개 RSA 래핑 키를 사용하여 Software 보호 모드 Mater Encryption Key를 래핑한 다음, 개인 RSA 래핑 키를 사용하여 래핑을 풀어 Mater Encryption Key 를 내보내는 과정으로 이루어집니다.
 
본 가이드를 위한 사전 요구환경은 다음과 같습니다.

  1. OpenSSL 1.1.1 설치
  2. OCI CLI 환경 구성

OpenSSL 1.1.1 버전은 OCI VM에 기본적으로 설치가 되어있으며 (버전 확인 명령어: ~]$ openssl version),
OCI CLI 환경 구성 방법은 본 포스팅에서 다루지 않습니다.

[가이드]

  • OpenSSL을 통해 Master Encryption Key 래핑에 필요한 RSA Key 페어를 생성합니다
~]$ openssl genrsa -out private_key.pem 4096    # 4096 bit Private RSA Key를 생성합니다.
~]$ openssl rsa -in private_key.pem -out public_key.pem -pubout. # 생성된 Private RSA Key를 가지고 Public Key를 생성합니다.

private_key.pem , public_key.pem 2개의 RSA 키페어가 생성되며 래핑키로 사용됩니다.

-> Public Key 의 문자열이 390개 미만일 경우 이후 Wrapping 단계에서 Error가 발생하기때문에 위와 같은 bit로 설정합니다.
 

  • 추출할 Master Encryptio Key가 저장될 디렉토리를 생성해줍니다.
~]$ mkdir /home/opc/mek  # 디렉토리명은 자유롭게 지정합니다.

 

  • Master Encryption Key 추출을 위한 스크립트를 생성합니다.
~]$ vim /home/opc/export_key.sh  # 스크립트명은 자유롭게 지정합니다.


#!/usr/bin/env bash


set -x

OPENSSL="<path_to_OpenSSL>" 
KEY_OCID="<key_OCID>" 
ENCRYPTION_ALGORITHM="RSA_OAEP_SHA256"
VAULT_CRYPTO_ENDPOINT="<vault_data_plane_URL>"
PUBLIC_KEY_STRING="<public_RSA_wrapping_key_in_PEM_format>" 
PRIVATE_KEY_PATH="<path_to_private_RSA_wrapping_key>" 
SOFTWARE_KEY_PATH="<path_to_output_exported_key>" 
WRAPPED_SOFTWARE_KEY_PATH="<path_to_output_decoded_wrapped_target_key>" 

# Invoke the CLI to export a software-protected master encryption key.
wrapped_data=$(oci kms crypto key export --key-id ${KEY_OCID} --algorithm ${ENCRYPTION_ALGORITHM} --public-key "${PUBLIC_KEY_STRING}" --endpoint 
${VAULT_CRYPTO_ENDPOINT} | grep  encrypted-key | cut -d: -f2  | sed 's# "\(.*\)",#\1#g')

# Decode the encoded wrapped data.
echo ${wrapped_data} | base64 -d > ${WRAPPED_SOFTWARE_KEY_PATH}

# Unwrap the wrapped software-protected key material by using the private RSA wrapping key.
${OPENSSL} pkeyutl -decrypt -in ${WRAPPED_SOFTWARE_KEY_PATH} -inkey ${PRIVATE_KEY_PATH} -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 -out ${SOFTWARE_KEY_PATH}




***변수 설명***
OPENSSL="OpenSSL 설치경로로 /usr/bin/openssl 을 기본으로 합니다." 
KEY_OCID="추출을 원하는 Software Protect Mode Master Encryption Key의 OCID, Vault 내 Master Encryption Key 메뉴에서 확인" 
ENCRYPTION_ALGORITHM="RSA_OAEP_SHA256"
VAULT_CRYPTO_ENDPOINT="Master Encryption Key가 존재하는 Vault의 Crprytographic Endpoint, Vault 메뉴에서 확인"
PUBLIC_KEY_STRING="첫단계에서 생성한 RSA Public Key의 Content --Begin, End Publickey-- 를 제외한 Body, 공백제거" 
PRIVATE_KEY_PATH="첫단계에서 생성한 RSA Private Key의 경로" 
SOFTWARE_KEY_PATH="Master Encryption Key를 Export 할 경로와 파일명" 
WRAPPED_SOFTWARE_KEY_PATH="래핑된 Master Encryption Key를 Export 할 경로와 파일명" 


스크립트 예시는 다음과 같습니다.

#!/usr/bin/env bash

set -x

OPENSSL="/usr/bin/openssl" 
KEY_OCID="ocid1.key.oc1.ap-*****1.gjtax5***(((**&&jrxtdvfd2lj3yr4o3bavzm**((*&*2vfgkjpbsud6f5vzq" 
ENCRYPTION_ALGORITHM="RSA_OAEP_SHA256"
VAULT_CRYPTO_ENDPOINT="https://********-crypto.kms.ap-seoul-1.oci.oraclecloud.com
PUBLIC_KEY_STRING="MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApysmE1Vou/B4ydebrWHr2kQYX/bZXTK23aaUIfVvTITHYad4DOhmbJKKNF/ehRqHopD2l1f0tkT9K7sfJ695G87sckh4/KbodEE2TTVtujUiaGR9Ed4N14qsERUAlgY+jIzB9T5oy447qIOm<<<<-------------------중략---------------------->>>>sUp0eBts0N7gqG3QyAm+FEo0Z53MjAq10EKDRWWa/QcyYEwHUpTYaSQFrGeGKQazPO8EKeFm1vlb9YlOX7gCn2UnyVGzin/mhQEp2UfrF77QdX7jn2N78wLXvNyNfIqed9KMXYltsM/Z9sT3AmySXrP+ivptbb2k+RA9LV7QH0VR0CAwEAAQ==" 
PRIVATE_KEY_PATH="/home/opc/private_key.pem" 
SOFTWARE_KEY_PATH="/home/opc/mek/master_encryption_key" 
WRAPPED_SOFTWARE_KEY_PATH="/home/opc/mek/wrapped_master_encryption_key"

# Invoke the CLI to export a software-protected master encryption key.
wrapped_data=$(oci kms crypto key export --key-id ${KEY_OCID} --algorithm ${ENCRYPTION_ALGORITHM} --public-key "${PUBLIC_KEY_STRING}" --endpoint ${VAULT_CRYPTO_ENDPOINT} | grep  encrypted-key | cut -d: -f2  | sed 's# "\(.*\)",#\1#g')

# Decode the encoded wrapped data.
echo ${wrapped_data} | base64 -d > ${WRAPPED_SOFTWARE_KEY_PATH}

# Unwrap the wrapped software-protected key material by using the private RSA wrapping key.
${OPENSSL} pkeyutl -decrypt -in ${WRAPPED_SOFTWARE_KEY_PATH} -inkey ${PRIVATE_KEY_PATH} -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256 -out ${SOFTWARE_KEY_PATH}

 

  • 스크립트 권한 부여 및 실행
~]$ chmod 755 /home/opc/export_key.sh
~]$ ./home/opc/export_key.sh

 

[실행결과] Error가 없다면 성공, 실패하면 열심히 debug를..

  • SOFTWARE_KEY_PATH, WRAPPED_SOFTWARE_KEY_PATH  변수 경로에 파일이 정상적으로 생성되었는지 확인

Error인 경우에는 파일 사이즈가 0으로 생성됌

 

  • RSA 래핑 키페어와, SOFTWARE KEY, WRAPPED SOFTWARE KEY 를 안전하게 관리할 것

참고자료: https://docs.oracle.com/en-us/iaas/Content/KeyManagement/Tasks/exportingkeys.htm

 

Exporting Vault Keys and Key Versions

Export a software-protected master encryption key or export key versions for performing vault cryptographic operations. You can use the key locally, and then discard the key from local memory to protect the key contents. Using an exported key locally impro

docs.oracle.com

 
*Master Encryption Key 유출로 인한 보안사고의 책임은 사용자에게 있으므로, 해당 기능 사용에 각별한 주의가 필요합니다.

 



작성자: 최동혁 / Oracle Cloud Architect

개인 시간을 투자하여 작성된 글로서, 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

 

댓글