OCI Vaultに暗号化キーをインポートする


Oracle Cloud Infrastructureには、OCI Vaultという暗号化キーをHSMで管理することができるサービスがあります。
通常ではクラウド上で暗号化されるデータの暗号化キーはクラウドベンダーが管理していますが、ユーザー自身が暗号キーの管理を行うという要件も増えています。例えば、OCI上のオブジェクトストレージやブロックボリュームなどのストレージ領域をユーザー自身のキーで暗号化させる場合、キーをインポートする必要があります。

ここでは、OCI Vaultの特徴とキーのインポート手順について改めて整理してみます

OCI Vaultの主な特徴

  • FIPS 140-2 Level 3に対応
  • AES, RSA, ECDSAの3種類の暗号アルゴリズムに対応(2021/2時点)
  • 暗号鍵の作成・削除・ローテーション、バックアップ、モニタリング
  • OCIサービスの各サービスとシームレスに連携
  • 鍵のインポート(BYOK)も可能

2種類のVault

  • Default Vault

    • デフォルト。共有パーティションとして提供され、無料で利用可
    • ただし、キーのローテーションが20回を超えると課金
  • Virtual Private Vault

    • ユーザー専用のパーティションが提供され、排他的に利用可能。性能面でのアドバンテージあり
    • Vault単位での課金

暗号化キーのインポート手順

  • OCIコンソールからセキュリティ -> キー管理

  • 公開ラッピング・キーをコピーする

以下のようにVaultにインポートする暗号鍵を作成する

Copyした公開ラッピング・キーを貼り付けて、パブリック・キーを作成する ※ファイルに貼り付けする際改行が入らないように注意
$ vi public.pem
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtGtYW61HvGLGZDBY0tEHs/5AuRYAV5Vdwm0U4T1ly5tAqZ8h2y/T85nibk/7jovGMx/kbVGxP82uD99H8oPVgHVD664TEG0MhRspa3GlAoTna6E2mvYcbqpKr9wwPfNEjl4kGS31IrcTYiTt9152ow+NtaVnaaFxOO+ysEBf2jYyhF630cSA0+8LNUdL4STX7/x47h/sK9n4koaTIBn0BP567gQru3rn+ggF4o9X8jpfnuioKWaExRKbn5MioxEsfX0PocNVZPp3L370da+wJV1IQF1BPjDgnQ8IyartbRWuiH+W4l1CWnMUMybH6vg8H/1Vi55KNb/q6zO4OTKcvf/yFJDJPGZWC/9yDX1OCSF3M1Umj2YYr2/zg+17zyoMU/K2O+5YgNLIyyHceoOcVtKivBVhkdVoql7WIE3ufOFWVM1l3F+n5f3nANuSonQNkEj45x8eP6Z3+T7ZHio3VFvODIGuNl/T2hMdOWfpF+PJVGk16JI0js1XP1R+KbJTzAWvJpiiyZHPPEpT9pdVw7A52SUgohPhiGlp7kCPCGMcPtzQyjWf0GbtDVNoY+3HW5iKtoLGd042sqfys2T+XCtLlcnpxujy+7ymKssRbmPQ9mRGmN404Hkhzb26hmMSxlFPTjywPSrE/GDj+E5ETc5YOq69bAsxDRjHvZmJm50CAwEAAQ==
-----END PUBLIC KEY-----

暗号鍵を作成 (256bit)
$ openssl rand 32 > aes_key.bin

作成した暗号鍵をパブリック・キーでラッピングする > wrappedkey.bin (インポート用の暗号鍵)が作成される
$ openssl pkeyutl -encrypt -in "aes_key.bin" -inkey "public.pem" -pubin -out "wrappedkey.bin" -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256
  • 作成した暗号鍵を外部キーとしてインポートする。キーのシェイプは256ビットを選択

  • インポート完了

  • ポリシーに各サービスがインポートした鍵にアクセスができるようにポリシーに追加する
    Allow service blockstorage,objectstorage-<リージョン名>, FssOc1Prod, oke to use keys in compartment コンパートメント名

  • Object Storageのバケットを作成する際に指定する

キー管理のドキュメントはこちら

OCI CLIを利用した暗号化キーのインポート手順

# AESキーの作成
$ openssl rand 32 >aeskey

# Vaultのラッピングキーをコピーしwrapping_key というファイルで保存する 
-----BEGIN PUBLIC KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END PUBLIC KEY-----

# AESキーをラッピングキーで暗号化
option) -in AESキーファイル -inkey ラッピングキー -pubin -out 暗号化ラッピングされたAESキーファイル名

openssl pkeyutl -encrypt -in aeskey -inkey wrapping_key -pubin -out rapped_aeskey -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 
 
# ラッピング(暗号化)されたAESキーファイルをBase64でエンコード
base64  ./rapped_aeskey 

# インポートするキーはJSONフォーマットが必要。なのでwrapped_import_key.jsonという名前でJsonファイルを作成する
{ “wrappingAlgorithm”: “RSA_OAEP_SHA256”, “keyMaterial”: “Base64でエンコードしたラッピングキーをここに貼り付ける" }

# 暗号アルゴリズムを指定するkey_shape.jsonファイルを作成
{"algorithm": "AES", "length": 32}

# インポートの実行
option) --wrapped-import-key インポートするキー(JSON) --key-shape 指定した暗号アルゴリズム(JSON)

oci kms management key import --wrapped-import-key file://./wrapped_import_key.json --compartment-id ocid1.compartment.oc1..aaaaaaaa6it5wsxbeoyxpbxmq5aupsag7jo4mxsot7hhuxvjp5uqnvuxgf4a --display-name AEStestKey3 --endpoint https://xxxxxxxxx-management.kms.us-ashburn-1.oraclecloud.com --key-shape file://./key_shape.json

参考になるスクリプトはこちら
OCI Vaultで電子署名を行う