暗号化されていないS3アップロードを拒否するIAMポリシー

サーバーサイド暗号化が指定されていない限りS3 PutObjectリクエストを拒否するIAMポリシーを作成します。すべてのオブジェクトが保存時に暗号化されることを保証します。

Advanced Patterns

詳細な説明

S3アップロードの暗号化強制

データ保護要件のコンプライアンスを確保するため、このポリシーはサーバーサイド暗号化を含まないS3 PutObjectリクエストを拒否します。暗号化ヘッダーなしでアップロードされたオブジェクトは拒否されます。

ポリシーJSON

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyUnencryptedUploads",
      "Effect": "Deny",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-secure-bucket/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": [
            "aws:kms",
            "AES256"
          ]
        }
      }
    },
    {
      "Sid": "DenyUploadWithoutEncryptionHeader",
      "Effect": "Deny",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::my-secure-bucket/*",
      "Condition": {
        "Null": {
          "s3:x-amz-server-side-encryption": "true"
        }
      }
    }
  ]
}

2つのDenyステートメント

IAM条件評価の仕組みにより2つのステートメントが必要です:

  1. ステートメント1: 暗号化ヘッダーが存在するがaws:kmsまたはAES256以外に設定されている場合に拒否します。
  2. ステートメント2: 暗号化ヘッダーがまったく存在しない場合に拒否します(Null条件)。

バケットデフォルト暗号化ではないのはなぜか

S3バケットのデフォルト暗号化は良いセーフティネットですが、暗号化されていないアップロードリクエストを防止しません — サイレントに暗号化を適用します。このIAMポリシーは非準拠のリクエストを積極的に拒否します。

ユースケース

すべてのS3アップロードがサーバーサイド暗号化を使用することを確保する必要がある保存データ暗号化要件(HIPAA、FedRAMP、PCI DSS)を持つ組織。多層防御としてバケットポリシーと併用されることが一般的です。

試してみる — AWS IAM Policy Generator

フルツールを開く