オブジェクトにメタデータをつける
ConoHaオブジェクトストレージでオブジェクトとしてファイルを上げる際にファイルにメタデータをつけることができます。
そのため暗号化されたファイルをオブジェクトとして上げる場合、復号化キーのようなものをつけることができます。
メタデータはHTTPヘッダー「X-Object-Meta-{任意の名前}」に加える形で紐づけが可能です。
bundle exec ruby chino.rb -m FILE_CONTROL_KEY:1234567890ABCDEF -s ~/Grahics/wtest2/go.jpg -d /hogehoge
upload_url -> https://objectstore-r1nd1001.cnode.jp/v1/098203482342/hogehoge/go.jpg
{
"Content-Type"=>"image/jpeg",
"X-Auth-Token"=>"d402844f5bdd46a0aee716caaf623150",
"X-Object-Meta-FILE_CONTROL_KEY"=>"1234567890ABCDEF"
}
http_status -> 201
上記でオブジェクトには「FILE_CONTROL_KEY="1234567890ABCDEF"」
という情報が紐づけられます。
ファイルを"1234567890ABCDEF"というキーで暗号化していた場合、このメタデータから復号化することが可能です。
通常のトークン経由のアクセスであればこの仕様で問題ありません。
しかし、このオブジェクトをWEB公開モードでWEB公開していた場合、このメタデータは果たして一般公開されるのでしょうか?
オブジェクトをWEB公開したときメタデータは公開されてしまうのか?
$ curl -v https://objectstore-r1nd1001.cnode.jp/v1/98394824/go.jpg -O
> GET objectstore-r1nd1001.cnode.jp/v1/98394824/go.jpg HTTP/1.1
> User-Agent: curl/7.37.1
> Host: objectstore-r1nd1001.cnode.jp
> Accept: */*
>
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0< HTTP/1.1 200 OK
< Date: Tue, 20 Jan 2015 14:36:16 GMT
< Content-Type: image/jpeg
< Content-Length: 551367
< Connection: keep-alive
< Accept-Ranges: bytes
< Last-Modified: Tue, 20 Jan 2015 14:29:34 GMT
< Etag: 9876d66107098fef488e86225d941999
< X-Timestamp: 1421764173.86525
< X-Object-Meta-File-Control-Key: 1234567890ABCDEF
< X-Trans-Id: tx080a6f5fcaa14cd094614-0054be67e0
<
・・としっかり、X-Object-Meta-File-Control-Keyの値が返却されるようになっていました。
解決策
オブジェクトに紐づけるメタデータをそのファイル自体の機密情報(たとえばファイル復号化キーや、ファイル削除を許可するキー)とする場合は、そのメタデータ自体を暗号化してひもづけるという手段で解決できます。
そうすることでHTTPヘッダーにその情報が流れても第三者がそのデータを復元することは困難な状態となります。