はじめに
Oracle Cloud Infrastructure(OCI) には、鍵の生成・管理・ローテーションなどを便利にしてくれる Vault というサービスがあります。Vault を使うことで、面倒な鍵管理のライフサイクルを軽減できます。
... といったことが Document に書いていますが、いまいち何をどう使えば便利になるのかよくわからなかったので、OCI Vault を使ったファイルの暗号化を試してみました。今回はこの手順を紹介していきます。
Vault の作成
まず、OCI Vault を作成していきます。Security - Vault
ここで Vault を作成できます。Vault とは、暗号化・復号化を担うマスター暗号化キーを複数格納する論理的な概念です。枠組みが必要なんだな、と思ってもらえれば大丈夫です。
Create Vault
MAKE IT VIRTUAL PRIVATE VAULT のチェックを入れると、HSM(鍵管理をしてくれる物理的なHW) を占有できます。占有はそれなりな価格なので、チェックを入れずに進めます。
Create
Vault と詳細画面が表示されます。Endpoint は今後使うので、メモをしておくと良いです。
- Cryptographic Endpoint
- https://brp274vvaabe6-crypto.kms.ap-tokyo-1.oraclecloud.com
- Management Endpoint
- https://brp274vvaabe6-management.kms.ap-tokyo-1.oraclecloud.com
マスター暗号化キーを作成
次に、Vault の中でマスター暗号化キーを生成します。マスター暗号化キーとは、データ暗号化キーを暗号化・復号化に使うものです。簡単にいうと、データの暗号化に使う鍵に対する、親の概念がマスター暗号化キーです。
こんな感じの考え方です
それでは、マスター暗号化キーを作成します。Create Key
Create Key
詳細画面を見ると、マスター暗号化キーのOCID が確認できます (現在は、このマスター暗号化キーは削除済み)
ocid1.key.oc1.ap-tokyo-1.brp274vvaabe6.abxhiljre3ayxcxxr66zjuoyyjh2ld76dvkf7ogl4dgk6cd4okgbkvv5fi7q
データ暗号化キーを生成
マスター暗号化キーを生成したので、次にデータ暗号化の時に使う、データ暗号化キーを生成します。今回の手順では、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 の共通鍵となっているため、ファイルの暗号化と復号化が出来ます。つまり、データ暗号化キー(平文) が漏れてしまうと、暗号化されているファイルが復号されてしまう危険性があります。
なので、データ暗号化キー(平文)は、暗号化処理のあと、すぐに破棄します。プログラム上のメモリでのみ扱い、ファイル永続化はせずに、すぐ破棄するのが推奨です。
データ暗号化キー(平文)を破棄したら、復号化するときにはどうすればいいかというと、データ暗号化キー(暗号化)を OCI Vault に渡すことで、データ暗号化キー(平文)を返してくれます。データ暗号化キー(暗号化)は、マスター暗号化キーで暗号化されているため、OCI Vault だけが復号化出来る、というわけです。
データ暗号化をしたいときに、そのつどデータ暗号化キーを生成して暗号化処理をすることで、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