[Oracle Cloud] Object Storage に SSE-C で暗号化してセキュアにアップロード

# はじめに

Oracle Cloud Infrastructure(OCI) の Object Storage には、データ暗号化に SSE-C(Server-Side Encryption with Customer-provided keys) が使えます。これは、Object Storage にデータをアップロードする際に、AES のキーを一緒に渡すことで、Object Storage 側でその AES キーを使いデータの暗号化をしてくれます。その後、AES キーは破棄されます。逆にデータを取り出すときは、アップロードする時に指定した AES キーを指定しないとダウンロードできません。つまり、AES キーを持っている人でないとデータのダウンロードが出来なくなり、よりセキュアなオブジェクト管理が出来ます。

今回の記事では、SSE-C の方法を紹介します。



# OCI Vault

SSE-C をするために、AES 256 bit の鍵が必要です。独自で AES キーを作っていもいいですが、鍵の管理が面倒なので、OCI Vault を使った方が楽です。OCI Vault の使い方が気になる方は[こちら](https://qiita.com/sugimount/items/c26a304d053445b87263)をどうぞ。
OCI CLI で、OCI Vault から AES 256bit (32byte) のデータ暗号化キーを生成します。

```
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
}
'
```



実行例

```
{
  "data": {
    "ciphertext": "QXLDJKpVs+vFAOfo9TSbYJUGbnZfvl9g4Vmax+Tof84DFXMm6AgIzXEKRAUa2r5aPB0UFL3U8HdN9EARr0bmJu/JC/0k1AAAAAA=",
    "plaintext": "RzUrIJZAHY22sbmhVDMLPgPcPv76pFnAi9G2a6bFXIs=",
    "plaintext-checksum": "3654972344"
  }
}
```



データ暗号化キー (平文) を、ファイル化します。OCI CLI で実施するためファイル化しますが、本来はあまり推奨できることではありません。よりセキュアにするために、SDK を使ってメモリ上でデータ暗号化キー(平文)を扱うのが望ましいでしょう。

```
echo -n "RzUrIJZAHY22sbmhVDMLPgPcPv76pFnAi9G2a6bFXIs=" > /home/opc/work/data-encrypt-key.txt
```





# Object Storageで SSE-C

sse-c-bucket という名前の Bucket で検証をします。

![1605440315815.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/9107d77c-f7c8-e685-91e9-02608eb18fa0.png)



アップロード対象のファイルを確認します。

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



SSE-C を使って、アップロードを行います

- bucket-name : Bucket 名
- file : アップロード対象のファイル
- encryption-key-file : AES 256bit のキーを指定 (データ暗号化キー(平文)を指定)

```
oci os object put \
--bucket-name sse-c-bucket \
--file /home/opc/work/rawtext.txt \
--encryption-key-file /home/opc/work/data-encrypt-key.txt
```



Object Storage を見ると、ファイルが格納されています。ダウンロードを押してみると...

![1605441105538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/0fb57bd0-fcc4-71a5-5438-38675aee00ad.png)



エラーになります。SSE-C を使っているため、ダウンロードする時にも、データ暗号化キーを指定しないとダメです。

![1605441128624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/4981e651-bd43-4f95-d15f-f9faf004a21c.png)



OCI CLI でも普通に取得してみましょう

```
oci os object get \
--bucket-name sse-c-bucket \
--name rawtext.txt \
--file /home/opc/work/get.txt
```



やはりエラーになります

```
{
    "code": null,
    "message": "The service returned error code 400",
    "opc-request-id": "nrt-1:AF2eZIzFJVmYJXztITl1P6a6M7bsk-peq0_Bdc_azNbovpdeG1-Sj4jHfzhBTTZV",
    "status": 400
}
```



データ暗号化キーを渡してダウンロードをしてみます。

```
oci os object get \
--bucket-name sse-c-bucket \
--name rawtext.txt \
--file /home/opc/work/get.txt \
--encryption-key-file /home/opc/work/data-encrypt-key.txt
```



正常にダウンロードできました。

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



# 参考URL

https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/usingyourencryptionkeys.htm