IBM Cloud: VPC-Gen2のストレージをBYOKを使って暗号化する

#1. はじめに

- VPC Gen2のPrimary boot volumeとSecondary data volumeはIBM管理の鍵でデフォルトでAES256で暗号化されている。
- IBM管理の鍵ではなく、自分の鍵を持ち込んでVPC Gen2のストレージを暗号化したいので、その手順を確認したのがこの記事の目的
- 公式docsは[こちら](https://cloud.ibm.com/docs/vpc?topic=vpc-vpc-encryption-about)。
- VPC-Gen2のBlock Storageの暗号化の仕組みの詳細については、[この記述](https://cloud.ibm.com/docs/vpc?topic=vpc-vpc-encryption-about#vpc-customer-managed-encryption)が参考になる。

>With customer-managed encryption, you provision customer root keys (CRKs) to protect your encrypted resources in the cloud. Root keys serve as key-wrapping keys that safeguard LUKS passphrases. You decide whether to import your existing root keys ("bring your own key"), or have a supported IBM key management service (KMS) create one for you.
Block storage volumes are assigned a unique master encryption key generated by the instance's host hypervisor. The master key for each volume is encrypted with a unique KMS-generated LUKS passphrase, which is then encrypted by the CRK and stored in the KMS. 


#2. KeyProtectを購入
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fed390a5-6506-e8e8-86e2-47cb1d52d628.png">

注文後
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/b1da234e-679d-43a4-d6c1-3d13d8862880.png">


#3. コマンドラインの初期セットアップ

鍵の持ち込み自体はGUIからでもできるが、汎用的な手順を示すためにCLIで行うことにする。

```shell-session:初期セットアップ
#pluginの導入
$ ibmcloud plugin install kp

#KeyProtectを作成したリージョン、リソースグループに変更
$ ibmcloud target -g Common -r jp-tok

#作成したKey Protectの名称が"KeyProtect-Tokyo"のため、この名称を元にIDを探索
$ ibmcloud resource service-instance "KeyProtect-Tokyo" --id
Retrieving service instance KeyProtect-Tokyo in all resource groups under account IBM as xxxx@xx.xx.xx...
crn:v1:bluemix:public:kms:jp-tok:a/039dbe6794084c7cb514a276dd2345da:6efdc301-0119-4472-872c-86de0b6dd8c7:: 6efdc301-0119-4472-872c-86de0b6dd8c7

#環境変数の設定
$ export KP_INSTANCE_ID=6efdc301-0119-4472-872c-86de0b6dd8c7

#鍵のチェック（まだ作成していないので何もない）
$ ibmcloud kp keys
Retrieving keys...
The Key Protect instance does not have any associated keys.
```

#4. Root Keyの作成

KeyProtectによってRoot Keyを生成する方法と、自身の鍵をRoot Keytとして持ち込む方法の２種類が存在する。

##4.1 KeyProtectによってRootKeyを生成する方法

```
$ ibmcloud kp key create SYASUDA_ROOT-KEY
Creating key: 'SYASUDA_ROOT-KEY', in instance: '6efdc301-0119-4472-872c-86de0b6dd8c7'...
OK
Key ID                                 Key Name
e3e396fe-aa85-4985-860f-0c4bd4104c90   SYASUDA_ROOT-KEY
```

GUIの場合はこちらから可能
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d150426e-a719-f037-0d38-8d336a886382.png">

##4.2 KeyProtectに自身の鍵をRoot Keyとして持ち込む方法

[Root Keyとしての持ち込み要件](https://cloud.ibm.com/docs/key-protect?topic=key-protect-import-root-keys&locale=en)としては、128bit, 192bit, 256bitのいずれかである必要がある。つまり、16 byte, 24 byte, 32 byteである。

例として
`596sGYh!F7t.AN/gfEM347$KK8*Zu7CZ`
という鍵を持ち込むことにする。（本来はHSMなどでちゃんと生成したり、隠蔽して構成するべきですが、今回は手順確認のためわざとパスワードを表示しています）

```shell-session:持ち込み鍵の作成
#パスワードを環境変数にセット
$ PASSWORD='596sGYh!F7t.AN/gfEM347$KK8*Zu7CZ'

#KeyProtectに保管する際にはbase64エンコーディング化する必要があるため変換
$ KEY_MATERIAL=`echo $PASSWORD |base64 -w 0`

#Root KeyとしてImport
$ ibmcloud kp key create SYASUDA_ROOT-KEY -k $KEY_MATERIAL
Creating key: 'SYASUDA_ROOT-KEY', in instance: '6efdc301-0119-4472-872c-86de0b6dd8c7'...
OK
Key ID                                 Key Name
e3e396fe-aa85-4985-860f-0c4bd4104c90   SYASUDA_ROOT-KEY
```

<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/48ea64bb-f4cb-9a9a-5863-96d21d9c5224.png">

GUIの場合はこちらから可能
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/02ae5784-162d-9beb-1c5c-cae6578401d6.png">


#5. IAMでの権限付与

ここでは構成を簡単にするために、本アカウント内のCloud Block Storageは任意のKey Protectにアクセスできるように権限を与える。
(2020/08/12現在、KeyProtectの特定のリソースグループのみを指定して権限付与するやり方だとうまくいかないようです）
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/02ae999a-c694-e4dd-2bec-ee5fb70f5b8c.png">


#6.VPCでサーバーを注文する

デフォルトでは`Provider Managed`になっているので、`Edit`にて編集を行い、
<img width="988" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/293103dc-9403-b835-8a2c-ebb7decd0d78.png">

該当のKeyProtectおよび鍵を選択する。
<img width="613" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/67bea87e-46b8-66d7-0271-51309cfabe22.png">


#7. 注文後の確認


VSI側のStorageでもBYOKで暗号化されていることがわかる。
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/f2606e73-a387-a6ee-d2b6-600a768687d7.png">

KeyProtect側にもこのストレージ情報が紐づけられている。
<img width="1279" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c7f1437d-ff2e-8caf-54ae-d60475c52f1d.png">