[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 の使い方が気になる方はこちらをどうぞ。
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 で検証をします。

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

[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 を見ると、ファイルが格納されています。ダウンロードを押してみると...

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

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