🐾

AWS S3の暗号化について

に公開

目的

SAA学習中にS3の暗号化に何種類もあって分からなくなりそうなのでまとめました。

S3の暗号化の種類

S3での暗号化の方式には、サーバー側(SSE)での暗号化とクライアント側(CSE)での暗号化の2種類から選択できる。

SSEとは(Server Side Encryption)

Sever=S3で、S3側で暗号化するという意味。データがストレージに書き込まれるときに暗号化され、読み出されるときに復号される。具体的には、オブジェクトのアップロードリクエスト(HTTP/HTTPS)処理の際に暗号化用のヘッダーが付与されて暗号化が実施される。
 ※異なる種類のSSEを同時にオブジェクトに適用することはできない。

CSEとは(Crient Side Encryption)

  • クライアントライブラリの使用(Amazon S3 Encryption Client)
  • AWS SDKを使用をしてアプリケーション側で暗号化する仕組みを作る(復号かするときもAWS SDKを使用する)
  • AWS SDK for PHPだとAws\S3\MultipartUploaderを使用する
  • S3に送信する前に自分でデータを暗号化する + S3からデータを取得する際にクライアント自身で復号化する

SSEの種類

SSE-S3

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

  • S3ではデフォルトでこちらが設定されている。(2023/1〜)追加料金は発生しない
  • S3側で暗号化用のAmazon S3 マネージドキー (SSE-S3) を作成・管理し、それを利用して暗号化をしてくれる
  • AES-256(Advanced Encryption Standard)を使用してデータを暗号化している

設定方法(コンソール画面)

設定方法(AWS SDK for PHP)

S3Client::putObject()を使用する際に、リクエストに以下の記述を追加する。

// Upload a file with server-side encryption.
$result = $s3->putObject([
    'Bucket'               => $bucket,
    'Key'                  => $keyname,
    'SourceFile'           => $filepath,
    'ServerSideEncryption' => 'AES256',  // ここ
]);

この記述で、アップロードリクエストに x-amz-server-side-encryption リクエストヘッダーが追加される。

SSE-KMS(Key Management Service)

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

  • ユーザー側がAWS Key Management Service (AWS KMS) で作成した暗号化用のカスタマーマネージドキーを指定して暗号化する
  • 従量課金制
  • KMSではデータの暗号化に際して、データキーでデータを暗号化してから、そのデータキーをKMSキーで暗号化(エンベロープ暗号化)している
  • AES-256(Advanced Encryption Standard)を使用してデータを暗号化している

設定方法(コンソール画面)

設定方法(AWS SDK for PHP)

S3Client::putObject()を使用する際に、リクエストに以下の記述を追加する。

// Upload a file with server-side encryption.
$result = $s3->putObject([
    'Bucket'               => $bucket,
    'Key'                  => $keyname,
    'SourceFile'           => $filepath,
    'ServerSideEncryption' => 'aws:kms', // SSE-KMSを有効にする
]);

SSE-C(Crient)

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

  • AWS外でユーザーが作成した暗号化用のマネージドキーを使用した暗号化形式
  • 追加料金はかからない
  • AWSコンソールで設定できない
  • S3では、ディスクに書き込む際のデータ暗号化と、オブジェクトにアクセスする際のデータ復号を管理する
  • S3では暗号化キーを保存・管理をしない
  • リクエストヘッダーに暗号化キーのデータを付与して暗号化する(キーとオブジェクトと同時に送る)

設定方法(AWS SDK for PHP)

S3Client::putObject()を使用する際に、リクエストに以下の記述を追加する。

$result = $s3->putObject([
    'Bucket'               => $bucket,
    'Key'                  => $keyname,
    'SourceFile'           => $filepath,
    'ServerSideEncryptionCustomerAlgorithm' => 'AES256', // SSE-Cを有効にするアルゴリズム
    'SSECustomerKey'     => 'your-customer-key', // カスタマープロバイダキー
    'SSECustomerKeyMD5'  => 'md5-hash-of-customer-key', // カスタマープロバイダキーのMD5ハッシュ
]);

参考書籍

https://amzn.asia/d/9eAvfJs

まとめ

AWS S3の暗号化にはサーバーサイドで行う方法とクライアントサイドで行う方法がある。
デフォルトはSSE-S3で追加料金はかからない。
管理方法や利用コストによって使い分ける必要がありそう。

Discussion