Amazon S3のバケットの暗号化設定は「デフォルト」でしかない
タイトルをこれにするか「『バケットの暗号化』という設定は存在しない」にするか迷いました。
これは私が当初しばらく勘違いしていたことでした。
S3における暗号化とは
S3において暗号化はバケットではなくオブジェクトに対して施すものです。
言い換えると、「オブジェクトを暗号化する」という操作はありますが、「バケットを暗号化する」という操作や概念はないということです。
S3コンソールでオブジェクトのプロパティを見ると、そのオブジェクトの暗号化の状態を見ることができます。もしかしたら、その暗号化状態が、必ずしもそのオブジェクトが置かれたバケットのデフォルトの暗号化設定とは一致しないことに気づくかもしれません。
バケットの「デフォルトの暗号化」設定とは
先述のとおりS3の暗号化はオブジェクトに対して施すものですので、通常、オブジェクトをどのように暗号化するかは、オブジェクトをバケットにPUTするときに指定します。
では、バケットの「デフォルトの暗号化」設定とは何かというと「オブジェクトPUT時に暗号化方法が指定されなかった場合に、そのオブジェクトをどのように暗号化するか」を指定するものです。それゆえ、バケットの暗号化に関する設定項目は「デフォルトの(=他の指定があれば上書きされてしまう)暗号化」と呼ばれるのですね。
この挙動は、公式ガイドで以下のように説明されています。
- デフォルト暗号化を有効にした後、オブジェクトをアップロードするとします。
PUT
リクエストヘッダーに暗号化情報が含まれていない場合、Amazon S3 はオブジェクトを暗号化するために、バケットのデフォルトの暗号化設定を使用します。PUT
リクエストヘッダーに暗号化情報が含まれている場合、Amazon S3 はPUT
リクエストの暗号化情報を使用して、オブジェクトを Amazon S3 に保存する前に暗号化します。
CloudTrailでS3出力する際の暗号化はCloudTrail側で設定する
したがって、CloudTrailやConfigなどデータをS3出力できるサービスで保管時の暗号化を設定する場合は、CloudTrailやConfigなどデータを出力する側で暗号化を設定する必要があります。S3バケットのデフォルトの暗号化設定は無視されます。
一方で、フローログのように、フローログ側には暗号化設定がなく、S3バケットのデフォルトの暗号化に従って暗号化されるサービスもあります。このように、暗号化の挙動はサービスごとに異なるため、注意するようにしましょう[1]。
-
ALBのアクセスログのように「SSE-S3だけがサポートされているため、バケットのデフォルトの暗号化をSSE-S3に設定する必要がある」サービスもあります(2023/9現在)。ただし抜け穴もあるようです。ややこしいですね……
ALB アクセスログの格納時の暗号化は KMS カスタマキーで行えるのか? - 継続は力なり ↩︎
Discussion