暗号化されていない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: 暗号化ヘッダーが存在するが
aws:kmsまたはAES256以外に設定されている場合に拒否します。 - ステートメント2: 暗号化ヘッダーがまったく存在しない場合に拒否します(
Null条件)。
バケットデフォルト暗号化ではないのはなぜか
S3バケットのデフォルト暗号化は良いセーフティネットですが、暗号化されていないアップロードリクエストを防止しません — サイレントに暗号化を適用します。このIAMポリシーは非準拠のリクエストを積極的に拒否します。
ユースケース
すべてのS3アップロードがサーバーサイド暗号化を使用することを確保する必要がある保存データ暗号化要件(HIPAA、FedRAMP、PCI DSS)を持つ組織。多層防御としてバケットポリシーと併用されることが一般的です。