ノート:
- このチュートリアルではOracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructure資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了する場合は、これらの値をクラウド環境に固有の値に置き換えてください。
Oracle Cloud Infrastructure Virtual Vaultsでの非対称キーの冗長性の作成
イントロダクション
今日のペースの速いデジタル世界では、データ・セキュリティが最も重要です。組織がクラウドベースのインフラストラクチャに依存するようになるにつれ、機密情報の機密性が最も重要になります。これを実現するために、多くの場合、セキュアな鍵管理を必要とする暗号化を使用します。ただし、キー管理では、特に冗長性と可用性に関して重要な課題が生じる可能性があります。このブログ投稿では、仮想ボールト内の非対称キーに関する冗長性を実現する方法と、2つの異なるリージョン内のアプリケーションがこれを暗号化および復号化のためにどのように活用するかについて説明します。
Oracle Cloud Infrastructure (OCI)は、データの暗号化、復号化および署名に使用されるキーを一元的に管理できるフルマネージド・キー管理サービスであるVirtual Private Vault(VPV)を提供しています。VPVの最も重要な機能の1つは、リージョン間のバックアップとリストアです。この機能を使用すると、リージョン間でキーをバックアップおよびリストアできるため、作成場所とは異なるリージョンでキーを使用できます。
バックアップおよびリストアは、OCIで提供される別のキー管理サービスであるVirtual Vault (VV)ではなく、VPにのみ機能することに注目してください。また、Virtual Vaultでハードウェア・セキュリティ・モジュール(HSM)のキーをバックアップする方法はありません。ただし、キー持込み(BYOK)/インポート・キー・オプションを使用すると、2つの異なるリージョンのボールトに同じキー・マテリアルをインポートできます。リージョンが完全に停止している場合でも、別のリージョンのコピーはバックアップとして機能します。この冗長性により、リージョンで停止や障害が発生した場合でも、キーを常に使用できるようになります。また、主要な冗長性およびディザスタ・リカバリを義務付ける規制要件およびコンプライアンス要件を満たすこともできます。
目標
このチュートリアルでは、同じRSAキーを2つの異なるリージョンにある仮想ボールトにインポートする手順の概要を説明します。キー・インポートはステップバイステップの手順を使用して1つのリージョンで実行され、スクリプトはインポートの他のリージョンで使用されます。キーをインポートした後、あるリージョンのキーを使用してテスト・データを暗号化し、他のリージョンにあるボールト内の同じキーを使用して結果の暗号テキストを復号化します。
前提条件
ボールトおよびキーを作成および管理するためのアクセス権を持つOCIアカウント。
ノート:「Bring your own key (BYOK)」シナリオでは、OpenSSLにパッチを適用する必要があります。OpenSSLにパッチを適用するには、必要なシェル・コマンドを実行するための特権アクセスが必要です。特権アクセスを持つLinuxボックスでシェル・コマンドを実行することをお薦めします。OCI CLIコマンドは、クラウド・シェルまたはOCI CLIがインストールおよび構成されているLinuxボックスで実行できます。この手順に従って、LinuxボックスにOCI CLIをインストールおよび構成します。
タスク1: 最初のリージョンのボールトへのキーのインポート(例: フェニックス)
非対称キー(RSA)を仮想Vaultにインポートするには、この手順に従います。
-
OpenSSLにパッチを適用します: 「Bring your own key(BYOK)」シナリオでは、
RSA_OAEP_AES_SHA256
ラッピング用にOpenSSLにパッチを適用する必要があります。この手順に従って、OpenSSLにパッチを適用します。 -
キー・マテリアルの生成: 要件に基づいてツールまたはソースによって生成されたキー・マテリアルを使用します。このチュートリアルでは、OpenSSLを使用してキー・マテリアルを生成します。
$HOME/local/bin/openssl.sh genrsa -out PRIVATEKEY.pem 2048
-
公開RSAラップ・キーを取得します。
oci kms management wrapping-key get --endpoint <control_plane_URL>
oci kms management wrapping-key get --endpoint https://abcdefghijk-management.kms.us-phoenix-1.oraclecloud.com --raw-output --query 'data."public-key"' > VAULT_PUBLIC_WRAPPING_KEY.pem
-
CLIインタフェースを使用してキー・マテリアルをラップするには、AESとともにRSA-OAEPを適用します。
a.一時AESキーを生成します。
openssl rand -out <temporary_AES_key_path> 32
$HOME/local/bin/openssl.sh rand -out TEMP_AES_KEY.key 32
b.SHA-256のRSA-OAEPを使用して、一時AESキーを公開ラッピング・キーでラップします。
openssl pkeyutl -encrypt -in <temporary_AES_key_path> -inkey <vault_public_wrapping_key_path> -pubin -out <wrapped_temporary_AES_key_file> -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
$HOME/local/bin/openssl.sh pkeyutl -encrypt -in TEMP_AES_KEY.key -inkey VAULT_PUBLIC_WRAPPING_KEY.pem -pubin -out WRAPPED_TEMP_AES_KEY.bin -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
c.一時的なAES鍵資料の16進数を生成します。
temporary_AES_key_hexdump=$(hexdump -v -e '/1 "%02x"' < temporary_AES_key_path)
TEMPORARY_AES_KEY_HEXDUMP=$(hexdump -v -e '/1 "%02x"' < TEMP_AES_KEY.key)
d.インポートするRSA秘密キーがPEMフォーマットの場合は、DERに変換します。
${OpenSSL_path} pkcs8 -topk8 -nocrypt -inform PEM -outform DER -in <your_pem_RSA_private_key_path> -out <your_RSA_private_key_file>
$HOME/local/bin/openssl.sh pkcs8 -topk8 -nocrypt -inform PEM -outform DER -in PRIVATEKEY.pem -out TARGET_KEY.key
e.RSA秘密キーを一時AESキーでラップします。
openssl enc -id-aes256-wrap-pad -iv A65959A6 -K temporary_AES_key_hexdump -in <your_RSA_private_key_file> -out <wrapped_target_key_file>
$HOME/local/bin/openssl.sh enc -id-aes256-wrap-pad -iv A65959A6 -K $TEMPORARY_AES_KEY_HEXDUMP -in TARGET_KEY.key -out WRAPPED_TARGET_KEY.bin
f.ラップされた両方のキーを連結して、ラップされたキー・マテリアルを作成します。
cat <wrapped_temporary_AES_key_file> <wrapped_target_key_file> > <wrapped_key_material_file>
cat WRAPPED_TEMP_AES_KEY.bin WRAPPED_TARGET_KEY.bin > WRAPPED_KEY_MATERIAL.bin
gラップされたキー・マテリアルにbase64エンコーディングを適用してからインポートし、CLIを介してキーを作成します。
base64 WRAPPED_KEY_MATERIAL.bin -w 0 > WRAPPED_KEY_MATERIAL.base64
-
OCI CLIを使用して、キー・マテリアルを外部キーとしてインポートします。
oci kms management key import --wrapped-import-key <wrapped_key_material> --compartment-id <compartment_id> --display-name <key_name> --endpoint <control_plane_URL> --key-shape <key_encryption_information> --protection-mode <key_protection_mode>
echo "{ \"wrappingAlgorithm\": \"RSA_OAEP_AES_SHA256\", \"keyMaterial\": \"$(cat WRAPPED_KEY_MATERIAL.base64)\" }" > WRAPPED_IMPORT_KEY.json
echo "{ \"algorithm\": \"RSA\", \"length\": \"256\" }" > KEY_SHAPE.json
oci kms management key import --wrapped-import-key file://WRAPPED_IMPORT_KEY.json --compartment-id ocid1.compartment.oc1..aaaaaaaabbbbbbbbbccccccccdddddddeeeeeefffff --display-name IMPORTEDKEY --endpoint https://abcdefghijk-management.kms.us-phoenix-1.oraclecloud.com --key-shape file://KEY_SHAPE.json --protection-mode SOFTWARE
タスク2: 2番目のリージョンの仮想ボールトへの同じキーのインポート(例: アッシュバーン)
-
非対称キー(RSA)を仮想Vaultにインポートするには、次のスクリプトを使用します。
-
コマンド・プロンプトを開き、次のスクリプトを実行します(必要に応じてサンプルのファイル名および値を置き換えます)。
#!/bin/bash #This script is for demonstration purposes only. It provides #a functioning set of calls to show how to import RSA keys #into the OCI Vault service. set -e; #set -x; #OPENSSL_PATH="<path to patched openssl.sh>" #PRIVATE_KEY="<path to target private key which needs to be imported>" #KEY_SIZE="<key size in bytes>" #DISPLAY_NAME="<Display Name>" #VAULT_KEYMANAGEMENT_ENDPOINT="<Vault Management Endpoint>" #COMPARTMENT_ID="<Compartment OCID>" #Sample OPENSSL_PATH="$HOME/local/bin/openssl.sh" PRIVATE_KEY="$HOME/local/bin/PRIVATEKEY.pem" KEY_SIZE="256" DISPLAY_NAME="IMPORTEDKEY" VAULT_KEYMANAGEMENT_ENDPOINT="https://abceefghijk-management.kms.us-ashburn-1.oraclecloud.com" COMPARTMENT_ID="ocid1.compartment.oc1..aaaaaaaabbbbbbccccccccdddddddeeeeeeeffffffff" WORK_DIR=$(mktemp -d -t kms_XXXX) BASE64="base64" echo "Openssl Path: ${OPENSSL_PATH}" echo "Work Dir: ${WORK_DIR}" #Getting Vault Public RSA Wrapping Key oci kms management wrapping-key get --endpoint ${VAULT_KEYMANAGEMENT_ENDPOINT} --raw-output --query 'data."public-key"' > ${WORK_DIR}/vault_public_wrapping_key.pem WRAPPING_KEY="${WORK_DIR}/vault_public_wrapping_key.pem" #Convert the private key to PKCS8 DER format. target_key_path=${WORK_DIR}/target_key.key ${OPENSSL_PATH} pkcs8 -topk8 -nocrypt -inform PEM -outform DER -in ${PRIVATE_KEY} -out ${target_key_path} #Generate a temporary AES key. temp_aes_key_path=${WORK_DIR}/temp_aes_key.key ${OPENSSL_PATH} rand -out ${temp_aes_key_path} 32 #Wrap the temporary AES key by using RSA-OAEP with SHA-256. wrapped_temp_aes_key=${WORK_DIR}/wrapped_temp_aes_key.bin ${OPENSSL_PATH} pkeyutl -encrypt -in ${temp_aes_key_path} -inkey ${WRAPPING_KEY} -pubin -out ${wrapped_temp_aes_key} -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 #Wrap the target RSA key. wrapped_target_key=${WORK_DIR}/wrapped_target_key.bin temp_aes_key_hexdump=$(hexdump -v -e '/1 "%02x"' < ${temp_aes_key_path}) ${OPENSSL_PATH} enc -id-aes256-wrap-pad -iv A65959A6 -K ${temp_aes_key_hexdump} -in ${target_key_path} -out ${wrapped_target_key} #Create the wrapped key material. wrapped_key_material_bin=${WORK_DIR}/wrapped_key_material.bin cat ${wrapped_temp_aes_key} ${wrapped_target_key} > ${wrapped_key_material_bin} echo "Binary wrapped key for console is available at: ${wrapped_key_material_bin}" #Import the wrapped key to the Vault service after base64 encoding the payload. wrapped_key_material_base64=${WORK_DIR}/wrapped_key_material.base64 ${BASE64} ${wrapped_key_material_bin} -w 0 > ${wrapped_key_material_base64} echo "Base64 encoded wrapped key for CLI or API is available at: ${wrapped_key_material_base64}" #####1. IMPORT NEW KEY USING CONSOLE ##### #browse and upload ${WORK_DIR}/wrapped_key_material.bin file in key import section on console. #####2. IMPORT NEW KEY USING OCI_CLI ##### key_material=$(${BASE64} ${wrapped_key_material_bin}) echo "{ \"wrappingAlgorithm\": \"RSA_OAEP_AES_SHA256\", \"keyMaterial\": \"$(cat ${wrapped_key_material_base64})\" }" > wrapped_import_key.json echo "{ \"algorithm\": \"RSA\", \"length\": ${KEY_SIZE} }" > key_shape.json oci kms management key import --wrapped-import-key file://wrapped_import_key.json --compartment-id ${COMPARTMENT_ID} --display-name ${DISPLAY_NAME} --endpoint ${VAULT_KEYMANAGEMENT_ENDPOINT} --key-shape file://key_shape.json --protection-mode SOFTWARE
タスク3: データの暗号化と復号化
ボールトにキーが作成されたため、それを使用してデータを暗号化および復号化できます。
-
作成した鍵の鍵IDを取得します。キーIDを確認するには、ボールト内のキーをクリックし、キーの詳細ペインで「キーID」フィールドを探します。
-
キーを使用してデータを暗号化および暗号化できます。リクエスト例に含まれるプレーンテキストは、UTF-8文字列のbase64-encoded値です。
-
プレーンテキスト: OCIはセキュリティ第一のパブリック・クラウド・インフラストラクチャです。
-
Base64: T0NJIGlzIGEgc2VjdXJpdHktZmlyc3QgcHVibGljIGNsb3VkIGluZnJhc3RydWN0dXJl
-
-
最初のリージョンのボールトに存在するRSAキーを使用して暗号化します。
oci kms crypto encrypt --key-id <key_ocid> --plaintext <plaintext Base64 Encoded> --encryption-algorithm <Encryption Algorithm> --endpoint <Vault Crypto Endpoint>
-
RSAキー暗号化を使用して暗号化するには、アルゴリズムは必須パラメータで、受け入れられる値はRSA_OAEP_SHA_1、RSA_OAEP_SHA_256です
-
-
2番目のリージョンのボールトに存在するRSAキーを使用して復号化します。
oci kms crypto decrypt --key-id <key_ocid> --ciphertext <cipher text> --encryption-algorithm <Encryption Algorithm> --endpoint <Vault Crypto Endpoint>
OCI Key Managementは、キーの冗長性を実現し、暗号化キーを安全に管理できる堅牢な機能を提供します。仮想ボールト用の仮想プライベートVaultおよびBYOK/キー・インポート・オプションのリージョン間バックアップ、リストアおよびレプリケーションでは、1つのリージョンが完全に停止している場合でも、データが安全であることを確認できます。異なるリージョンでホストされるアプリケーションでは、これらの機能を利用して、異なるリージョン間でデータを安全に暗号化および復号化できます。
関連リンク
謝辞
作成者 - Chaitanya Chintala(クラウド・セキュリティ・アドバイザ)
その他の学習リソース
docs.oracle.com/learnで他のラボをご覧いただくか、Oracle Learning YouTubeチャネルでより無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Create redundancy for Asymmetric Keys in Oracle Cloud Infrastructure Virtual Vaults
F82529-01
June 2023
Copyright © 2023, Oracle and/or its affiliates.