🔑

Amazon S3 サーバーサイド暗号化について

2021/06/13に公開

Amazon S3(以下S3)の暗号化について分からなくなってきたので、整理と備忘録のために書こうと思います。今回は主にサーバーサイド暗号化について書きます。

S3における暗号化の種類と違い

S3の暗号化はサーバーサイド暗号化(SSE)とクライアントサイド暗号化(CSE)があります。

サーバーサイド暗号化(SSE)

サーバーサイド暗号化は、S3にデータを書き込まれる際にオブジェクトレベルで暗号化します。データアクセスが発生したら復号化します。

  • SSE-S3
    • S3にて作成及び管理されている暗号化キー(AES-256)で暗号化する。
    • 暗号化キーは定期的に更新されている。
    • 暗号化の追跡はしていない。
    • 暗号化における追加料金はなし。
  • SSE-KMS
    • AWS Key Management Service (AWS KMS)で管理している暗号化キーを使って暗号化する。
      • CloudTrailによる追跡監査が可能。
        • 暗号化における監査要件がある場合に選択すること。
      • キーを自動ローテーションさせることが可能。
  • SSE-C
    • ユーザが作成及び管理する暗号化キーで暗号化する。
    • S3ではデータ書き込み時の暗号化とオブジェクトアクセス時の復号化を管理する。
    • 暗号化そのものに追加費用は発生しない。ただし、暗号化設定とリクエスト時に費用発生する。

デフォルト暗号化に設定できるのは、SSE-S3とSSE-KMSです。SSE-Cを設定することはできません。

クライアントサイド暗号化(CSE)

S3にデータ送信する前に暗号化をします。サーバーサイド暗号化のみでなく、アップロードの通信経路から確実に暗号化したい場合は、CSEも実施します。

  • CSE-KMS

    • KMSで作成されたCMK(Customer Master Key)を使って暗号化する。
  • CSE-C

    • 利用者側が作成した暗号化キーで暗号化する。
      • AWS側で暗号化キーを管理することはない。

暗号化をしてみた

SSE-S3で暗号化手順のポイントを中心に書きます。そのため、S3バケットそのものの作成手順については割愛します。

SSE-S3暗号化

  1. バケット作成の際、「デフォルトの暗号化」にて
  • サーバーの暗号化:有効にする
  • 暗号化キータイプ:AmazonS3キー(SSE-S3)

を選択して、「バケットの作成」をクリックします。

  1. 作成したバケット名→プロパティ をクリックし、「デフォルトの暗号化」欄を確認します。
  • デフォルトの暗号化:有効
  • サーバー側の暗号化:Amazon S3マスターキー(SSE-S3)

と表示されていることを確認します。

  1. アップロードしたオブジェクトが暗号化されていることを確認します。

バケット名→アップロードしたオブジェクト を選択し、「サーバー側の暗号化設定」までスクロールします。

  • デフォルトの暗号化:有効
  • サーバー側の暗号化:Amazon S3マスターキー(SSE-S3)

と表示されていることを確認します。

ちなみに、AWS CLIでもオブジェクトの暗号化を確認できます。

aws s3api head-object \
--bucket ${S3_BUCKET_NAME} \
--key ${S3_OBJECT_KEY}

変数S3_BUCKET_NAMEにバケット名、S3_OBJECT_KEYにオブジェクト名を指定します。
コマンド実行すると以下のように表示されます。

{
    "AcceptRanges": "bytes",
    "LastModified": "2021-06-12T12:35:06+00:00",
    "ContentLength": 20,
    "ETag": "\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"",
    "ContentType": "text/plain",
    "ServerSideEncryption": "AES256",
    "Metadata": {}
}

"ServerSideEncryption": "AES256"と表示されれば、暗号化されています。

SSE-KMS

SSE-KMSは追加料金がかかるので設定しませんでしたが、マネコンの「デフォルトの暗号化」画面で設定可能です。

バケットキーとは?

KMSで暗号化すると、復号化の際にオブジェクトへのリクエストごとにKMSへのリクエストも発生します。これが課金対象となりますので、費用削減(リクエスト数削減)のために使うのが「バケットキー」です。

バケットキーを有効にすると、KMSはS3バケット用のキーを発行します。これは、バケット内のオブジェクトの一意のデータキーを作成するためのものです。S3バケット側でKMSで暗号化されたオブジェクトの復号化処理をできるようにすることで、KMSへのリクエスト数を削減します。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/bucket-key.html

最後に

今回はS3の暗号化、特にサーバーサイド暗号化(SSE-S3、SSE-KMS)について書きました。「完全に理解した」には程遠いですが、「チョットワカル」にはなったかもしれません。やはりユーザーガイドはちゃんと読んだ方がいいですね。以下を参考にしてなるべく自分の言葉で書きましたが、誤認識や補足などありましたら、ご指摘いただけますと幸いです。

参考

Amazon Simple Storage Service ユーザーガイド

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/bucket-encryption.html

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/UsingEncryption.html

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/UsingKMSEncryption.html

書籍

https://www.shuwasystem.co.jp/book/9784798063409.html

https://www.sbcr.jp/product/4815607388/

Discussion