はじめに
SSE-KMS (Server-Side Encryption with KMS keys) で S3 のオブジェクトを暗号化保存する際に、S3 バケットキーを有効にしていますか? S3 バケットキーを有効にせずに SSE-KMS を利用すると、 KMS の利用コストが増加する可能性があります。特に、オブジェクト数が多く、アクセス頻度が高い場合は、その影響は無視できません。
この記事では、S3 バケットキーの概要、そしてバケットキーを有効にする方法を説明します。
S3のバケットキーとは
S3 バケットキーは、バケットレベルで適用される暗号化キーのことで、SSE-KMS を利用する際の KMS 料金を削減するために設計された機能です。
SSE-KMS を利用する場合、通常はオブジェクトを暗号化または復号する度に、オブジェクト単位でKMSへのAPIリクエストが発生します。 KMSの料金はキーに対する API リクエスト数に応じた従量課金制です。そのため、オブジェクト数が多くなるほど KMS の利用料金も増加します。特に CloudTrail や ELB のログのように、小さなサイズのオブジェクトが大量に生成される場合、オブジェクトへのアクセス頻度が高いと KMS の料金が無視できなくなることがあります。
S3 バケットキーを有効に活用することで、オブジェクトごとに発生していた KMS へのリクエスト頻度を大幅に削減(最大 99% )し、KMS の利用料金を抑えることが可能です。
Amazon S3 バケットキーを使用した SSE−KMS のコストの削減 - Amazon Simple Storage Service
バケットキーを有効にする方法
バケットキーを有効にする方法としては、主に以下の 2 つがあります。
- バケットのデフォルト暗号化設定でバケットキーを有効にする
- バケット作成時、または作成済みのバケットの設定変更で有効にします
- オブジェクトのアップロード時にバケットキーを明示的に指定する
- オブジェクトごとにバケットキーの利用を指定します
1.のデフォルトの暗号化設定でバケットキーを有効にしておけば、そのバケットにアップロードされるオブジェクトは自動的にバケットキーを利用するため、個別に指定する手間が省けます。そのため、特別な理由がない限り、デフォルト暗号化設定でのバケットキー有効化を推奨します。
有効化の設定(マネジメントコンソールの場合)
マネジメントコンソールからバケットを作成する場合、初期値としてバケットキーは有効になっています。有効になっているかの確認や設定についてはデフォルトの暗号化の項目から設定が行えます。

有効化の設定(AWS CLIの場合)
AWS CLIを利用する場合は、API レベル (s3api) コマンドを利用する必要があります。高レベル (S3) コマンド aws s3 mb
で作成したバケットは、バケットキーが有効化されていません。
実際にバケットを作成し、バケットキーを有効にしてみましょう。
$ aws s3 mb s3://bucket-key-test-0001 make_bucket: bucket-key-test-0001 $ aws s3api get-bucket-encryption --bucket bucket-key-test-0001 { "ServerSideEncryptionConfiguration": { "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" }, "BucketKeyEnabled": false } ] } }
バケットキーが有効化されていないため、s3apiを利用して有効化します。
$ aws s3api put-bucket-encryption --bucket bucket-key-test-0001 --server-side-encryption-configuration '{ > "Rules": [ > { > "BucketKeyEnabled": true > } > ] > }' $ aws s3api get-bucket-encryption --bucket bucket-key-test-0001 { "ServerSideEncryptionConfiguration": { "Rules": [ { "ApplyServerSideEncryptionByDefault": { "SSEAlgorithm": "AES256" }, "BucketKeyEnabled": true } ] } }
上記の例では、KMSキーを指定していませんが、バケットキーの有効化とともに指定も可能です。詳しくはドキュメントを参照してください。
CloudTrail とバケットキー
CloudTrailでは、CloudTrail側の設定にKMSキーの指定があります。こちらを指定することにより、S3のデフォルトの暗号化の設定値がなんであろうと、KMSを利用してオブジェクトは暗号化されます。しかし、KMSキーの指定だけではオブジェクトのバケットキーは有効になりません。バケットのデフォルトの暗号化でバケットキーを有効にしておく必要があります。
Security Hub の以下のコントロールを満たすため、または非機能要件などで SSE-KMS の利用が必須となっている場合があるでしょう。S3 バケットキーの有効化は有効なコスト削減策となります。バケット作成時には、S3 バケットキーの有効化も忘れずに行いましょう。
[CloudTrail.2] CloudTrail should have encryption at-rest enabled This control checks whether CloudTrail is configured to use the server-side encryption (SSE) AWS KMS key encryption. The control fails if the KmsKeyId isn't defined.
Security Hub controls for CloudTrail - AWS Security Hub
補足
既存のバケットに対してバケットキーを有効にした場合、バケットキーが有効になった後に新規にアップロードされたオブジェクトからバケットキーが適用されます。バケットキー有効化前にアップロードされたオブジェクトには適用されません。
既存のオブジェクトに対してバケットキーを有効にしたい場合は、再度オブジェクトをアップロードする必要があります。
石田順一(記事一覧)
カスタマーサクセス部 CS3課