[Oracle Cloud] OCI Vault データ暗号化キーを使ったユーザーデータ暗号化

# はじめに

Oracle Cloud Infrastructure(OCI) には、鍵の生成・管理・ローテーションなどを便利にしてくれる Vault というサービスがあります。Vault を使うことで、面倒な鍵管理のライフサイクルを軽減できます。

... といったことが Document に書いていますが、いまいち何をどう使えば便利になるのかよくわからなかったので、OCI Vault を使ったファイルの暗号化を試してみました。今回はこの手順を紹介していきます。



# Vault の作成

まず、OCI Vault を作成していきます。Security - Vault

![1605366366410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/17255c5a-67a5-538f-05b0-184167c162de.png)



ここで Vault を作成できます。Vault とは、暗号化・復号化を担うマスター暗号化キーを複数格納する論理的な概念です。枠組みが必要なんだな、と思ってもらえれば大丈夫です。

Create Vault

![1605366405464.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/88f61a44-477f-b251-50bd-41b2c2e3fc77.png)



MAKE IT VIRTUAL PRIVATE VAULT のチェックを入れると、HSM(鍵管理をしてくれる物理的なHW) を占有できます。占有はそれなりな価格なので、チェックを入れずに進めます。

Create

![1605366449362.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/dfce688d-41a7-754a-7837-93e8c6abce87.png)



Vault と詳細画面が表示されます。Endpoint は今後使うので、メモをしておくと良いです。

```
- Cryptographic Endpoint
- https://brp274vvaabe6-crypto.kms.ap-tokyo-1.oraclecloud.com

- Management Endpoint
- https://brp274vvaabe6-management.kms.ap-tokyo-1.oraclecloud.com
```

![1605366657345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/9077da85-3d09-1b7f-182b-5698772c9ba3.png)



# マスター暗号化キーを作成

次に、Vault の中でマスター暗号化キーを生成します。マスター暗号化キーとは、データ暗号化キーを暗号化・復号化に使うものです。簡単にいうと、データの暗号化に使う鍵に対する、親の概念がマスター暗号化キーです。

こんな感じの考え方です

![1605415368535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/017b0e1b-e48d-12a8-6f18-53b75e895df4.png)



それでは、マスター暗号化キーを作成します。Create Key

![1605367341069.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/ca0a5457-da1b-e1c0-090a-904d211f43db.png)



Create Key

![1605367386481.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/b09ca078-aa2c-9575-d959-554c7617ff1c.png)



詳細画面を見ると、マスター暗号化キーのOCID が確認できます (現在は、このマスター暗号化キーは削除済み)

```
ocid1.key.oc1.ap-tokyo-1.brp274vvaabe6.abxhiljre3ayxcxxr66zjuoyyjh2ld76dvkf7ogl4dgk6cd4okgbkvv5fi7q
```

![1605367481962.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/ef39b67d-ccbf-8363-c27d-f54c8a1a5162.png)







# データ暗号化キーを生成

マスター暗号化キーを生成したので、次にデータ暗号化の時に使う、データ暗号化キーを生成します。今回の手順では、OCI CLI を使った生成方法を紹介します。

- key-id : マスター暗号化キーの OCID を指定
- include-plaintext-key : true を指定
- endpoint : Vault の Cryptographic Endpoint を指定
- key-shape : データ暗号化キーのパラメータを指定 : AES の 32byte(256bit)

```
oci kms crypto generate-data-encryption-key \
--key-id ocid1.key.oc1.ap-tokyo-1.brp274vvaabe6.abxhiljre3ayxcxxr66zjuoyyjh2ld76dvkf7ogl4dgk6cd4okgbkvv5fi7q \
--include-plaintext-key true \
--endpoint https://brp274vvaabe6-crypto.kms.ap-tokyo-1.oraclecloud.com \
--key-shape '
{
  "algorithm": "AES",
  "length": 32
}
'
```



実行例 (既にこの鍵は削除しています。また、大事なデータは暗号化していません)。

データ暗号化キーが生成されています。1つのデータ暗号化キーが返ってきていますが、暗号化の有無で2つ行が表示されています。

- ciphertext : データ暗号化キー (暗号化) ※マスター暗号化キーで、暗号化されている
- plaintext : データ暗号化キー (平文)

```
{
  "data": {
    "ciphertext": "QQ3XJE+0vKZMABbKgdAZRMp2k8cknCqsKWSLvKzZCLJcM/V4k2ny7zDiG+IJHykdEzS5KlxZlWyt1ywAakScueAMbwYiUwAAAAA=",
    "plaintext": "uD3u9zYtpvVtTNxjzvG3EJTx8XpcceKVqsc9YpOe0Nc=",
    "plaintext-checksum": "1583272555"
  }
}
```



データ暗号化キー(暗号化) と、データ暗号化キー(平文)の2つが返ってきている理由は、セキュリティを向上できるためです。まず、データ暗号化キー(平文)は、AES の共通鍵となっているため、ファイルの暗号化と復号化が出来ます。つまり、データ暗号化キー(平文) が漏れてしまうと、暗号化されているファイルが復号されてしまう危険性があります。

![1605416384595.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/939e8751-10ec-8e6e-63a1-d22040ea5610.png)



なので、データ暗号化キー(平文)は、暗号化処理のあと、すぐに破棄します。プログラム上のメモリでのみ扱い、ファイル永続化はせずに、すぐ破棄するのが推奨です。

![1605416439148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/0f810439-428a-2739-51b9-64f7ff7a03dc.png)



データ暗号化キー(平文)を破棄したら、復号化するときにはどうすればいいかというと、データ暗号化キー(暗号化)を OCI Vault に渡すことで、データ暗号化キー(平文)を返してくれます。データ暗号化キー(暗号化)は、マスター暗号化キーで暗号化されているため、OCI Vault だけが復号化出来る、というわけです。

![1605416632415.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a655909c-d3cd-4d7e-d40c-afe4468d56e8.png)



データ暗号化をしたいときに、そのつどデータ暗号化キーを生成して暗号化処理をすることで、1個のデータ暗号化キーが暗号化した範囲を小さくできます。暗号化の度に毎回使う鍵を変えているため、セキュリティが高い、というわけです。また、OCI IAM の運用を適切に行うことで、安全な暗号鍵の運用をOCI Vault で行うことができるメリットもあります。



それででは、実際に暗号化と復号化の処理を見て行きましょう。



# データ暗号化キー(平文)を使って暗号化

先ほど生成したデータ暗号化キー(平文) を使って、暗号化処理をしていきましょう。まず、暗号化するためのテストファイルを作成します。

```
cat <<'EOF' > /home/opc/work/rawtext.txt
Hello, OCI Vault! I am test file!
EOF
```



暗号化の方法はたくさんありますが、今回は簡単に OpenSSL で暗号化をしていきます

- e : 暗号化の指定 (Encrypt)

- in : 暗号化したいテストファイル
- out : 新たに作成する暗号化したファイル
- pass : データ暗号化キー(平文) を指定

```
openssl aes-256-cbc -e \
-in /home/opc/work/rawtext.txt \
-out /home/opc/work/encrypted.txt \
-pass pass:uD3u9zYtpvVtTNxjzvG3EJTx8XpcceKVqsc9YpOe0Nc=
```



生成されるファイルは暗号化されていて、中身を見てもよくわからなくなっています

```
[opc@vault01 work]$ cat /home/opc/work/encrypted.txt
Salted__��;�`���P{�;
                     ������'��q�eD�Շ2�䭌Ƃ;kf�%u�F���
```



データ暗号化キー (平文) は、ここで削除します。保管するのは推奨されていません。



# データ暗号化キー(暗号化)から、データ暗号化キー(平文)を生成

では次に、暗号化したファイルを復号化していく手順を見て行きましょう。データ暗号化キー(暗号化)を OCI Vault に渡すことで、データ暗号化キー(平文)を返してくれます。データ暗号化キー(暗号化)は、マスター暗号化キーで暗号化されているため、decrypt API を使うことで復号化が出来ます。

- key-id : マスター暗号化キーの OCID を指定
- ciphertext : データ暗号化キー(暗号化)の文字列を指定
- endpoint : Vault の Cryptographic Endpoint を指定

```
oci kms crypto decrypt \
--key-id ocid1.key.oc1.ap-tokyo-1.brp274vvaabe6.abxhiljre3ayxcxxr66zjuoyyjh2ld76dvkf7ogl4dgk6cd4okgbkvv5fi7q \
--ciphertext "QQ3XJE+0vKZMABbKgdAZRMp2k8cknCqsKWSLvKzZCLJcM/V4k2ny7zDiG+IJHykdEzS5KlxZlWyt1ywAakScueAMbwYiUwAAAAA=" \
--endpoint https://brp274vvaabe6-crypto.kms.ap-tokyo-1.oraclecloud.com 
```



実行例
データ暗号化キー(平文)が返ってきています

```
[opc@vault01 work]$ oci kms crypto decrypt \
> --key-id ocid1.key.oc1.ap-tokyo-1.brp274vvaabe6.abxhiljre3ayxcxxr66zjuoyyjh2ld76dvkf7ogl4dgk6cd4okgbkvv5fi7q \
> --ciphertext "QQ3XJE+0vKZMABbKgdAZRMp2k8cknCqsKWSLvKzZCLJcM/V4k2ny7zDiG+IJHykdEzS5KlxZlWyt1ywAakScueAMbwYiUwAAAAA=" \
> --endpoint https://brp274vvaabe6-crypto.kms.ap-tokyo-1.oraclecloud.com
{
  "data": {
    "plaintext": "uD3u9zYtpvVtTNxjzvG3EJTx8XpcceKVqsc9YpOe0Nc=",
    "plaintext-checksum": "1583272555"
  }
}
```





# データ暗号化キー(平文) を使って復号化

では、返ってきたデータ暗号化キー(平文)を使って、暗号化されたファイルを復号化します。

OpenSSL で復号化

- d : 復号化の指定 (Decrypt)

- in : 復号化したいファイル
- out : 新たに作成する復号化したファイル
- pass : データ暗号化キー(平文) を指定

```
openssl aes-256-cbc -d \
-in /home/opc/work/encrypted.txt \
-out /home/opc/work/decrypted.txt \
-pass pass:uD3u9zYtpvVtTNxjzvG3EJTx8XpcceKVqsc9YpOe0Nc=
```



復号化されている

```
[opc@vault01 work]$ cat /home/opc/work/decrypted.txt
Hello, OCI Vault! I am test file!
```



はい、これで OCI Vault を使ってセキュアに鍵管理が出来る方法が確認できました。



# 参考URL

OpenSSL
https://www.slogical.co.jp/tech/openssl_command_aes.html

opensslコマンドで簡単なファイル暗号化
https://qiita.com/ikuwow/items/1cdb057352c06fd3d727