S3 のデフォルトバケット暗号化を有効にしている場合の、PUTリクエスト時の挙動について教えてください

2022.10.14

困っている内容

S3バケットにて、デフォルトバケット暗号化を有効にしようと考えています。

デフォルトバケット暗号化が有効の状態では、オブジェクトアップロード時に暗号化オプションを指定する必要があるのか、また指定した場合どういう挙動になるのか教えてください。

どう対応すればいいの?

バケットのデフォルトの暗号化を有効にしている場合、AWS CLIやREST APIでPUT リクエスト時に暗号化オプションを指定しなくても、設定時に選択した暗号化キータイプに応じて、バケット側で暗号化が行われます。

また、コンソール上から直接オブジェクトをアップロードした際も同様に暗号化が行われます。

Amazon S3 のデフォルトバケット暗号化の有効化 - Amazon Simple Storage Service

Amazon S3 バケットでデフォルトの暗号化動作を設定して、すべてのオブジェクトがバケットに保存される際に暗号化されるようにします。オブジェクトは、Amazon S3 マネージド キー (SSE-S3) または AWS Key Management Service (AWS KMS) キーのいずれかで、サーバー側の暗号化を使って暗号化されます。

PUT リクエスト時に暗号化情報を指定した場合は、指定した暗号化方式を使用してバケットに保存される前に暗号化が行われます。

Amazon S3 のデフォルトバケット暗号化の有効化 - Amazon Simple Storage Service

デフォルト暗号化を有効にした後、オブジェクトをアップロードするとします。
PUT リクエストヘッダーに暗号化情報が含まれていない場合、Amazon S3 はオブジェクトを暗号化するために、バケットのデフォルトの暗号化設定を使用します。
PUT リクエストヘッダーに暗号化情報が含まれている場合、Amazon S3 は PUT リクエストの暗号化情報を使用してオブジェクトを Amazon S3 に保存する前に暗号化します。

注意点

以下の例のようにアップロード時にサーバー側の暗号化を要求する x-amz-server-side-encryption ヘッダーを必須とするようなバケットポリシーを設定している場合は、暗号化オプションを指定しないとPUT リクエストが拒否されます。

その為バケットポリシーの設定にはご注意ください。

{
  "Version": "2012-10-17",
  "Id": "PutObjectPolicy",
  "Statement": [
    {
      "Sid": "DenyIncorrectEncryptionHeader",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::awsexamplebucket1/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": "AES256"
        }
      }
    },
    {
      "Sid": "DenyUnencryptedObjectUploads",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::awsexamplebucket1/*",
      "Condition": {
        "Null": {
          "s3:x-amz-server-side-encryption": "true"
        }
      }
    }
  ]
}

参考資料

Amazon S3 が管理する暗号化キーによるサーバー側の暗号化 (SSE−S3) を使用したデータの保護 - Amazon Simple Storage Service

Amazon S3 のデフォルトバケット暗号化の有効化 - Amazon Simple Storage Service