AWS アカウント内の全ての S3 バケットに対して SSE-C 暗号化をブロックする設定へ変更する

AWS アカウント内の全ての S3 バケットに対して SSE-C 暗号化をブロックする設定へ変更する

2026.04.25

Amazon S3 の汎用バケットにおいて、SSE-C 暗号化をブロックする設定が 2025年11月に追加されており、2026年4月にはデフォルトでブロックする設定になっています。ただし、既存のバケットでは明示的に設定を変更する必要があります。本ブログでは、AWS アカウント内の全ての汎用バケットにおいて SSE-C 暗号化をブロックする設定に一括変更するシェルスクリプト例を紹介します。

https://dev.classmethod.jp/articles/update-amazon-s3-block-sse-c-encryption/

SSE-C 暗号化をブロックする設定に変更するスクリプト

AWS アカウント内で作成済みの全ての Amazon S3 汎用バケットにおいて SSE-C 暗号化をブロックする設定へ変更するシェルスクリプト例です。

#!/bin/bash

# アカウント内のバケットを取得
aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
| while read BUCKET; do
  echo "### Update blocked encryption types: ${BUCKET}"

  # 既存設定を取得
  CURRENT=$(aws s3api get-bucket-encryption --bucket "$BUCKET" \
    --query "ServerSideEncryptionConfiguration" --output json)
  echo "CURRENT rule"
  echo "$CURRENT" | jq .

  # 既存設定を維持しつつ BlockedEncryptionTypes のみ更新
  UPDATED=$(echo "$CURRENT" | jq '
    .Rules[0].BlockedEncryptionTypes.EncryptionType = ["SSE-C"]
  ')

  # 更新する設定の確認
  echo "UPDATED rule"
  echo "$UPDATED" | jq .

  # 既存設定と更新設定の diff 確認
  echo "diff result"
  diff <(echo "$CURRENT" | jq .) <(echo "$UPDATED" | jq .)

  # 設定変更
  if aws s3api put-bucket-encryption \
     --bucket "$BUCKET" \
      --server-side-encryption-configuration "$UPDATED"; then
    echo "SUCCEEDED: ${BUCKET}"
  else
    echo "ERROR: ${BUCKET}"
  fi
done

上記を update-blocked-encryption-type.sh などの任意の名前で保管して、AWS CloudShell から次のコマンドで実行可能です。

sh update-blocked-encryption-type.sh

実行結果例です。出力結果におけるバケットでは、スクリプト実行前は下記の設定をしていました。

バケット名 デフォルト暗号化設定 SSE-C 暗号化ブロック設定
test-bucket-20260425-01 SSE-KMS 暗号化 設定無し
test-bucket-20260425-02 SSE-S3 暗号化 設定無し
test-bucket-20260425-03 SSE-S3 暗号化 ブロックする設定
$ sh update-blocked-encryption-type.sh 
### Update blocked encryption types: test-bucket-20260425-01
CURRENT rule
{
  "Rules": [
    {
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "aws:kms",
        "KMSMasterKeyID": "arn:aws:kms:ap-northeast-1:111122223333:key/2ce19c06-c3eb-4524-82ae-f1fb9example"
      },
      "BucketKeyEnabled": true,
      "BlockedEncryptionTypes": {
        "EncryptionType": [
          "NONE"
        ]
      }
    }
  ]
}
UPDATED rule
{
  "Rules": [
    {
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "aws:kms",
        "KMSMasterKeyID": "arn:aws:kms:ap-northeast-1:111122223333:key/2ce19c06-c3eb-4524-82ae-f1fb9example"
      },
      "BucketKeyEnabled": true,
      "BlockedEncryptionTypes": {
        "EncryptionType": [
          "SSE-C"
        ]
      }
    }
  ]
}
diff result
11c11
<           "NONE"
---
>           "SSE-C"
SUCCEEDED: test-bucket-20260425-01
### Update blocked encryption types: test-bucket-20260425-02
CURRENT rule
{
  "Rules": [
    {
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
      },
      "BucketKeyEnabled": true,
      "BlockedEncryptionTypes": {
        "EncryptionType": [
          "NONE"
        ]
      }
    }
  ]
}
UPDATED rule
{
  "Rules": [
    {
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
      },
      "BucketKeyEnabled": true,
      "BlockedEncryptionTypes": {
        "EncryptionType": [
          "SSE-C"
        ]
      }
    }
  ]
}
diff result
10c10
<           "NONE"
---
>           "SSE-C"
SUCCEEDED: test-bucket-20260425-02
### Update blocked encryption types: test-bucket-20260425-03
CURRENT rule
{
  "Rules": [
    {
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
      },
      "BucketKeyEnabled": true,
      "BlockedEncryptionTypes": {
        "EncryptionType": [
          "SSE-C"
        ]
      }
    }
  ]
}
UPDATED rule
{
  "Rules": [
    {
      "ApplyServerSideEncryptionByDefault": {
        "SSEAlgorithm": "AES256"
      },
      "BucketKeyEnabled": true,
      "BlockedEncryptionTypes": {
        "EncryptionType": [
          "SSE-C"
        ]
      }
    }
  ]
}
diff result
SUCCEEDED: test-bucket-20260425-03

BlockedEncryptionTypesEncryptionTypeNONE であればブロックしない設定、SSE-C であれば SSE-C 暗号化をブロックする設定となります。
仮に、バケットポリシーにより設定更新が拒否された場合は次のような出力になります

### Update blocked encryption types: <バケット名>

aws: [ERROR]: An error occurred (AccessDenied) when calling the GetBucketEncryption operation: User: arn:aws:sts::111122223333:assumed-role/AWSReservedSSO_AdministratorAccess_examples/user-name is not authorized to perform: s3:GetEncryptionConfiguration on resource: "arn:aws:s3:::<バケット名>" with an explicit deny in a resource-based policy
CURRENT rule
UPDATED rule
diff result

aws: [ERROR]: An error occurred (ParamValidation): Error parsing parameter '--server-side-encryption-configuration': Expected: '=', received: 'EOF' for input:

^
ERROR: <バケット>

また、下記のように実行結果をファイルにリダイレクトすることもできます。この場合は標準エラー出力(stderr)の内容は表示されません。

sh update-blocked-encryption-type.sh > output.txt

標準エラー出力もファイルに書き込みたい場合は次のコマンドです。

sh update-blocked-encryption-type.sh > output.txt 2>&1

また、AWS CloudShell 上で出力しつつ、ファイルに保管したい場合は次のコマンドです。標準エラー出力をファイルに書き込まない場合です。

sh update-blocked-encryption-type.sh | tee output.txt

標準エラー出力もファイルに書き込む場合です。

sh update-blocked-encryption-type.sh 2>&1 | tee output.txt

シェルスクリプトの簡単な解説

処理の流れは次のとおりです。

  1. list-buckets で全バケットの情報を取得
  2. 各バケットの現在の暗号化設定を get-bucket-encryption で取得
  3. 取得した設定に対して BlockedEncryptionTypes の値を上書き
  4. diff で変更内容を確認
  5. put-bucket-encryption で設定を反映

SSE-C 暗号化ブロックの設定は、デフォルト暗号化設定の一部であり、ブロック設定のみを変更するコマンドはないようでした。そのため、現在のデフォルト暗号化設定を全て取得して、ブロック設定の部分だけ書き換えて設定を反映するといった流れにしています。また、例えば下記の一連の流れのように SSE-C 暗号化のブロック設定部分だけを指定して設定更新した場合は、デフォルト暗号化設定が SSE-S3 暗号化になります。そのため、デフォルト暗号化を KMS 暗号化に設定しているバケットでは意図せずに SSE-S3 暗号化に変わってしまいます。それを防ぐために、既存バケットの設定を取得して BlockedEncryptionTypes 設定だけ書き換えるようにしてみました。

$ BUCKET="test-bucket-20260425-01"

$ aws s3api get-bucket-encryption --bucket "$BUCKET" --query "ServerSideEncryptionConfiguration" --output json
{
    "Rules": [
        {
            "ApplyServerSideEncryptionByDefault": {
                "SSEAlgorithm": "aws:kms",
                "KMSMasterKeyID": "arn:aws:kms:ap-northeast-1:111122223333:key/2ce19c06-c3eb-4524-82ae-f1fb9example"
            },
            "BucketKeyEnabled": true,
            "BlockedEncryptionTypes": {
                "EncryptionType": [
                    "NONE"
                ]
            }
        }
    ]
}

$ UPDATED=$(cat << 'EOF'
> {
>   "Rules": [
>     {
>       "BlockedEncryptionTypes": {
>         "EncryptionType": [
>           "SSE-C"
>         ]
>       }
>     }
>   ]
> }
> EOF
> )

$ aws s3api put-bucket-encryption --bucket "$BUCKET" --server-side-encryption-configuration "$UPDATED"

$ aws s3api get-bucket-encryption --bucket "$BUCKET" --query "ServerSideEncryptionConfiguration" --output json
{
    "Rules": [
        {
            "ApplyServerSideEncryptionByDefault": {
                "SSEAlgorithm": "AES256"
            },
            "BucketKeyEnabled": false,
            "BlockedEncryptionTypes": {
                "EncryptionType": [
                    "SSE-C"
                ]
            }
        }
    ]
}

暗号化のブロック設定を確認するコマンド

次のコマンドを実行することで、SSE-C 暗号化ブロック設定に関するBlockedEncryptionTypesEncryptionType 部分だけを出力して、設定状況を確認できます。

aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
| while read bucket; do
  echo "### Get blocked encryption types for ${bucket}"
 aws s3api get-bucket-encryption \
   --bucket ${bucket} \
   --query "ServerSideEncryptionConfiguration.Rules[0].BlockedEncryptionTypes.EncryptionType[]"
done

実行結果例です。NONE であればブロックしない設定、SSE-C であれば SSE-C 暗号化をブロックする設定となります。

### Get blocked encryption types for test-bucket-20260425-01
[
    "SSE-C"
]
### Get blocked encryption types for test-bucket-20260425-02
[
    "SSE-C"
]
### Get blocked encryption types for test-bucket-20260425-03
[
    "SSE-C"
]

さいごに

AWS アカウント内で作成済みの全ての Amazon S3 汎用バケットにおいて SSE-C 暗号化をブロックする設定へ変更するシェルスクリプト例を紹介しました。なお、AWS Organizations の RCP 機能より強制的に SSE-C 暗号化を禁止する方法もあるため、最後にそのポリシーが記載されたブログへのリンクも掲載します。

https://dev.classmethod.jp/articles/s3-ransomware-detection-with-guardduty-alerts/

以上、このブログがどなたかのご参考になれば幸いです。

この記事をシェアする

関連記事