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

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

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


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

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

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

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

- OCIコンソールからセキュリティ -> キー管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/daf14e87-435c-9c09-8db4-1b7fe18644e1.png)

- 公開ラッピング・キーをコピーする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d7d0a954-9ccb-7b65-617e-1703e232aa34.png)

以下のように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ビットを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d68fa3b9-ade6-bf66-5cbb-d58b1320c66f.png)

- インポート完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/5488d362-7379-3081-78b7-eb66cdce0b45.png)

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

- Object Storageのバケットを作成する際に指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/4019f56e-6ef0-f88f-51bf-2884d4b8def5.png)


キー管理のドキュメントは[こちら](https://docs.cloud.oracle.com/ja-jp/iaas/Content/KeyManagement/Concepts/keyoverview.htm)

##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
```

参考になるスクリプトは[こちら](https://docs.oracle.com/en-us/iaas/Content/KeyManagement/Tasks/importingkeys.htm)
[OCI Vaultで電子署名を行う](https://qiita.com/drafts/0680e151c5ccce68111a/edit)