TL;DR
以下の組み合わせのダウンロード可否を調査する機会があったのでまとめます。
- サーバーサイド暗号化の種類
- なし
- SSE-S3
- SSE-KMS
- ダウンロード経路
- 静的ホスティング
- Get Object URL
- Presigned URL
- CloudFront
結果だけ気になる人は結論へ飛んでください。
サーバーサイド暗号化
S3にはサーバーサイド暗号化(Server Side Encryption、SSE)という機能があります。
保存時に暗号化が行われ、取得時に復号されるので、利用者はあまり意識せずにオブジェクトを暗号化することができます。
公式ドキュメント
サーバーサイド暗号化の種類
サーバーサイド暗号化には現在3つの暗号化の方法があります。
SSE-Cを利用するシーンは(個人的に)あまりないため、今回は「暗号化なし」「SSE-S3」「SSE-KMS」を対象に調査を行うことにします。
SSE-S3
AWSが用意したS3用の暗号鍵を用いて暗号化を行います。
公式ドキュメント
SSE-KMS
ユーザーがAWS KMSで作成した鍵を用いて暗号化を行います。
公式ドキュメント
SSE-C
ユーザーが作成した鍵を用いて暗号化を行います。
オブジェクトをS3にアップロードする際とダウンロードする際に暗号鍵を指定します。
AWS上に暗号鍵をアップロードすることなく、手元で管理することが可能です。
公式ドキュメント
S3上のオブジェクトのダウンロード経路
さて、S3上のオブジェクトをアプリケーションから取得する方法はいくつか存在します。
- S3の静的サイトホスティング機能
- S3のGet Object URL
- S3のPresigned URL(SigV4)
- CloudFrontのOriginに指定
- アプリケーション上でAWS SDKで取得
アプリケーション上でAWS SDKで取得に関しては、当然どのようなサーバーサイド暗号化であろうと取得可能なので、今回の調査では対象外とします。
実装
Terraformでサクッと調査対象のS3バケットやCloudFrontなどを実装しました。
結論
結果は以下のようになりました。
SSEなし | SSE-S3 | SSE-KMS | |
---|---|---|---|
静的ホスティング | ◯ | ◯ | × |
Get Object URL | ◯ | ◯ | × |
Presigned URL | ◯ | ◯ | ◯ |
CloudFront | ◯ | ◯ | × |
要件次第ですが、SSE-S3が無難かなと。
おまけ
SSE-KMS + CloudFrontはLambda Edgeで署名を付与することで復号できるようになるようです。
https://aws.amazon.com/jp/blogs/networking-and-content-delivery/serving-sse-kms-encrypted-content-from-s3-using-cloudfront/