SSE-C 暗号化されたオブジェクトはマネジメントコンソールでどこまで操作できるか確認してみた
コンバンハ、千葉(幸)です。
最近 Amazon S3 の SSE-C 暗号化を試す機会がありました。
SSE-C 暗号化を行うためにはカスタマー側で独自の暗号化キーを指定する必要があり、暗号化後のオブジェクトの操作リクエストにも暗号化キーを含める必要があります。
マネジメントコンソールでの操作では上記太字部を満たすことができないため、多くの操作が影響を受けます。どこまでできてどこからができないのか?を試してみました。
SSE-C で暗号化されたオブジェクトのマネジメントコンソールでの操作まとめ
- 以下操作ができない
- ダウンロード・開く
- コピー・移動
- 一部の参照(暗号化設定、メタデータ、チェックサム)
- 一部の編集(名前、ストレージクラス、暗号化設定、メタデータ)
- S3 Select クエリ
- 以下操作はできる
- 署名付き URL の生成(生成はできるがその URL ではアクセスできない)
- 合計サイズの計算
- タグ付け操作
- オブジェクト ACLの編集
- 削除
下準備をする
ローカルにあるtest.txt
を以下の 2 パターンで S3 バケットにアップロードしてみます。
- SSE-S3(バケットのデフォルト暗号化設定に準じる)
- SSE-C
% cat test.txt hello hello hello%
まずはtest-sse-s3.txt
として暗号化オプションの指定なしでアップロード。
% aws s3api put-object\ --bucket chibayuki-hoge-hoge\ --key test-sse-s3.txt\ --body test.txt { "ETag": "\"1a6f8abe44f6b9c5a7c2435c43749dea\"", "ServerSideEncryption": "AES256", "VersionId": "NnHSdEoNR9e5j0bayD6YB6ZMl8NRihyu" }
↑バケットのデフォルト暗号化設定によって SSE-S3 で暗号化されてアップロードされました。
続いて暗号化キーを指定してtest-sse-c.txt
としてアップロード。
# 32byte 文字列を生成 % SSE_CUSTOMER_KEY=$(openssl rand -hex 16) # 生成した文字列を暗号化キーとして指定しアップロードの実行 % aws s3api put-object\ --bucket chibayuki-hoge-hoge\ --key test-sse-c.txt\ --body test.txt\ --sse-customer-algorithm AES256\ --sse-customer-key $SSE_CUSTOMER_KEY { "ETag": "\"cb3d7ce5406652ee579ccaf477e46695\"", "VersionId": "vck6UyCjT3y7LozBafzmOmq5ukpa_l04", "SSECustomerAlgorithm": "AES256", "SSECustomerKeyMD5": "XMFX5OCwq8trOlxVLmuqnw==" }
↑ SSE-C で暗号化されてアップロードされました。
SSE-C 暗号化されたオブジェクトをマネジメントコンソールから参照する
アップロードしたオブジェクトを S3 コンソールから確認します。なお、操作にはAdministratorAccess
をアタッチした IAM ロールを利用しています。
オブジェクトの一覧画面ではこんな感じ。基本的な情報は問題なく参照できますが、ここでは暗号化タイプは判別できません。
オブジェクトのプロパティから詳細を確認すると、一部の項目でエラーが発生しています。
「サーバー側の暗号化設定」が参照できませんが、「追加のチェックサム」で以下のメッセージがあるため SSE-C で暗号化されていることが読み取れます。
SSE-C で暗号化されたオブジェクト
S3 コンソールを使用して、お客様が用意した暗号化キー (SSE-C) で暗号化されたオブジェクトの追加のチェックサムを表示することはできません。SSE-C で暗号化されたオブジェクトの追加のチェックサムを表示するには、AWS CLI、AWS SDK、Amazon S3 REST API のいずれかを使用します。
また、画面下部の「メタデータ」ではエラーメッセージは表示されていませんが正常に取得できていない状態です。
SSE-S3 で暗号化されたオブジェクトでの表示イメージは以下です。メタデータとしてContent-Type:binary/octet-stream
が含まれていることが分かります。
そのほかのプロパティやアクセス許可、バージョンでは SSE-C 暗号化されたものとそうでないもので見え方に差異はありません。
SSE-C 暗号化されたオブジェクトをマネジメントコンソールからから操作する
S3 コンソールから操作できる内容を一通り試していきます。
エラーが発生するもの
ダウンロード・開く
いずれも押下すると以下のようなエラー画面となります。
「名前をつけてダウンロード」の場合も、以下画面で保存を試みるとエラーが発生します。
コピー・移動
コピーを試みると、冒頭の注意書きで SSE-C で暗号化されたオブジェクトが対応していないことが示されます。
- お客様が用意した暗号化キー (SSE-C) で暗号化されたオブジェクトは、S3 コンソールを使用してもコピーされません。SSE-C で暗号化されたオブジェクトをコピーするには、AWS CLI、AWS SDK、Amazon S3 REST API のいずれかを使用します。
それでも無理矢理コピーを実行すると、エラーが表示されます。
「移動」もやることとしては以下であるため、同様のエラーが発生します。
- 指定した箇所にコピーを実行する
- 元のオブジェクトを削除する
名前・ストレージクラスの変更
両者ともに裏ではオブジェクトのコピーが発生するため、やはりエラーが発生します。
SSE-C で暗号化されたオブジェクト
このオブジェクトはお客様が用意した暗号化キー (SSE-C) で暗号化されているため、名前を変更できません。
ストレージクラスの編集実行時のエラー。
サーバー側の暗号化の編集
エラーメッセージが誤解を招きやすい気がしますが、操作は拒否されます。
オブジェクト「test-sse-c.txt」のサーバー側の暗号化を取得するアクセス許可がありません
S3 コンソールからこのオブジェクトのサーバー側の暗号化を編集するには、s3:getObject アクセス許可が必要です。
メタデータの編集
参照もできなかったため然るべし、という気もしますがエラーが表示されます。
S3 Select を使用したクエリ
結果は失敗となり、エラーメッセージが表示されます。
The object was stored using a form of Server Side Encryption. The correct parameters must be provided to retrieve the object.
正常に操作できるもの
署名付き URL の生成
生成までは正常に実行できます。
とは言え生成された URL を用いてアクセスしても拒否されます。生成された URL は以下のような内容となっており、 SSE-C で暗号化されたオブジェクトに対するリクエストに必要なヘッダーが含まれていません。
https://chibayuki-hoge-hoge.s3.ap-northeast-1.amazonaws.com/test-sse-s3.txt ?response-content-disposition=inline &X-Amz-Security-Token=IQoJb3JpZ2luX2VjEFQaDmFwLW5vcnR以下略 &X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Date=20220815T130708Z &X-Amz-SignedHeaders=host &X-Amz-Expires=3600 &X-Amz-Credential=ASIAQ3BIIH73XXXXXXXX/20220815/ap-northeast-1/s3/aws4_request&X-Amz-Signature=a21ea2d785以下略
以下ページにあるリクエストヘッダーを頑張ってつけてあげれば、アクセスできるかもしれません。(未検証)
名前 | 説明 |
---|---|
x-amz-server-side-encryption-customer-algorithm |
暗号化アルゴリズムを指定するには、このヘッダーを使用します。ヘッダーの値は "AES256" である必要があります。 |
x-amz-server-side-encryption-customer-key |
Amazon S3 でデータを暗号化または復号するために使用する base64 でエンコードされた 256 ビットの暗号化キーを指定するには、このヘッダーを使用します。 |
x-amz-server-side-encryption-customer-key-MD5 |
RFC 1321 に従って、暗号化キーの base64 エンコードされた 128 ビット MD5 ダイジェストを指定するには、このヘッダーを使用します。Amazon S3 では、このヘッダーを使用してメッセージの整合性を調べて、送信された暗号化キーにエラーがないことを確認します。 |
合計サイズを計算する
サイズの取得には暗号化の状態は関係ないようです。
タグの編集
タグ操作も暗号化の影響を受けません。
オブジェクト ACL の編集
オブジェクト ACL の編集も問題なく行えます。
上記の画面はアクションの「ACL を使用して公開する」から操作しているイメージですが、以下画面からでも編集可能です。
もちろん公開状態にあったとしても、リクエストに暗号化キーが含まれていない限りはアクセスは拒否されます。仮に操作を誤って公開状態にしても、影響は軽微だと言えるでしょう。
オブジェクトの削除
そして最後に忘れてはいけないのが、削除です。
削除は SSE-C 暗号化されていても問題なく実行できます。
SSE-C 暗号化することで GET や HEAD の操作が制限を受けるためデータの保護という観点では向上しますが、削除は防げないということを覚えておきましょう。
SSE-C で暗号化されたオブジェクトのマネジメントコンソールでの操作まとめ(再掲)
- 以下操作ができない
- ダウンロード・開く
- コピー・移動
- 一部の参照(暗号化設定、メタデータ、チェックサム)
- 一部の編集(名前、ストレージクラス、暗号化設定、メタデータ)
- S3 Select クエリ
- 以下操作はできる
- 署名付き URL の生成(生成はできるがその URL ではアクセスできない)
- 合計サイズの計算
- タグ付け操作
- オブジェクト ACLの編集
- 削除
終わりに
SSE-C 暗号化されたオブジェクトをマネジメントコンソールからどう操作できるか(あるいはできないか)を確認してみました。メタデータも含めデータの中身についてはほとんど手出しできなくなっていることが分かりました。
マネジメントコンソールからの操作に限定した話ではありませんが、仮に IAM の権限が流出したとしてもカスタマー側で指定した暗号化キーをリクエストに含めないとほとんどの操作ができないため、別のレイヤでセキュリティが向上していると捉えられるかもしれません。
一方で、削除は問題なく実行できてしまうこと、暗号化に指定したキーや組み合わせをロストすると正規の利用者も中身を参照できなくなってしまうことは注意してください。
SSE-C の利用を検討する際の参考になれば幸いです。
以上、 チバユキ (@batchicchi) がお送りしました。