SSE-C 暗号化されたオブジェクトはマネジメントコンソールでどこまで操作できるか確認してみた

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_1

オブジェクトのプロパティから詳細を確認すると、一部の項目でエラーが発生しています。

SSE-C_2

「サーバー側の暗号化設定」が参照できませんが、「追加のチェックサム」で以下のメッセージがあるため 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_3

そのほかのプロパティやアクセス許可、バージョンでは SSE-C 暗号化されたものとそうでないもので見え方に差異はありません。

SSE-C 暗号化されたオブジェクトをマネジメントコンソールからから操作する

S3 コンソールから操作できる内容を一通り試していきます。

SSE-C

エラーが発生するもの

ダウンロード・開く

いずれも押下すると以下のようなエラー画面となります。

SSE-C_4

「名前をつけてダウンロード」の場合も、以下画面で保存を試みるとエラーが発生します。

SSE-C_download

コピー・移動

コピーを試みると、冒頭の注意書きで SSE-C で暗号化されたオブジェクトが対応していないことが示されます。

SSE-C_copy

  • お客様が用意した暗号化キー (SSE-C) で暗号化されたオブジェクトは、S3 コンソールを使用してもコピーされません。SSE-C で暗号化されたオブジェクトをコピーするには、AWS CLI、AWS SDK、Amazon S3 REST API のいずれかを使用します。

それでも無理矢理コピーを実行すると、エラーが表示されます。

SSE-C_copy_error

「移動」もやることとしては以下であるため、同様のエラーが発生します。

  • 指定した箇所にコピーを実行する
  • 元のオブジェクトを削除する

SSE-C_move

名前・ストレージクラスの変更

両者ともに裏ではオブジェクトのコピーが発生するため、やはりエラーが発生します。

SSE-c_rename

SSE-C で暗号化されたオブジェクト

このオブジェクトはお客様が用意した暗号化キー (SSE-C) で暗号化されているため、名前を変更できません。

ストレージクラスの編集実行時のエラー。

SSE-C_storegeclass

サーバー側の暗号化の編集

エラーメッセージが誤解を招きやすい気がしますが、操作は拒否されます。

SSE-C_ssechange

オブジェクト「test-sse-c.txt」のサーバー側の暗号化を取得するアクセス許可がありません

S3 コンソールからこのオブジェクトのサーバー側の暗号化を編集するには、s3:getObject アクセス許可が必要です。

メタデータの編集

参照もできなかったため然るべし、という気もしますがエラーが表示されます。

SSE-C_metadata

S3 Select を使用したクエリ

結果は失敗となり、エラーメッセージが表示されます。

SSE-C_s3_query

The object was stored using a form of Server Side Encryption. The correct parameters must be provided to retrieve the object.

正常に操作できるもの

署名付き URL の生成

生成までは正常に実行できます。

SSE-C_presignedurl

とは言え生成された 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 では、このヘッダーを使用してメッセージの整合性を調べて、送信された暗号化キーにエラーがないことを確認します。

合計サイズを計算する

サイズの取得には暗号化の状態は関係ないようです。

SSE-C_size

タグの編集

タグ操作も暗号化の影響を受けません。

SSE-C_tag

オブジェクト ACL の編集

オブジェクト ACL の編集も問題なく行えます。

sse-c_acl

上記の画面はアクションの「ACL を使用して公開する」から操作しているイメージですが、以下画面からでも編集可能です。

SSE-C_ACL_pub

もちろん公開状態にあったとしても、リクエストに暗号化キーが含まれていない限りはアクセスは拒否されます。仮に操作を誤って公開状態にしても、影響は軽微だと言えるでしょう。

オブジェクトの削除

そして最後に忘れてはいけないのが、削除です。

SSE-C_delete

削除は SSE-C 暗号化されていても問題なく実行できます。

SSE-C_delete-0569861

SSE-C 暗号化することで GET や HEAD の操作が制限を受けるためデータの保護という観点では向上しますが、削除は防げないということを覚えておきましょう。

SSE-C で暗号化されたオブジェクトのマネジメントコンソールでの操作まとめ(再掲)

  • 以下操作ができない
    • ダウンロード・開く
    • コピー・移動
    • 一部の参照(暗号化設定、メタデータ、チェックサム)
    • 一部の編集(名前、ストレージクラス、暗号化設定、メタデータ)
    • S3 Select クエリ
  • 以下操作はできる
    • 署名付き URL の生成(生成はできるがその URL ではアクセスできない)
    • 合計サイズの計算
    • タグ付け操作
    • オブジェクト ACLの編集
    • 削除

終わりに

SSE-C 暗号化されたオブジェクトをマネジメントコンソールからどう操作できるか(あるいはできないか)を確認してみました。メタデータも含めデータの中身についてはほとんど手出しできなくなっていることが分かりました。

マネジメントコンソールからの操作に限定した話ではありませんが、仮に IAM の権限が流出したとしてもカスタマー側で指定した暗号化キーをリクエストに含めないとほとんどの操作ができないため、別のレイヤでセキュリティが向上していると捉えられるかもしれません。

一方で、削除は問題なく実行できてしまうこと、暗号化に指定したキーや組み合わせをロストすると正規の利用者も中身を参照できなくなってしまうことは注意してください。

SSE-C の利用を検討する際の参考になれば幸いです。

以上、 チバユキ (@batchicchi) がお送りしました。

参考