You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写AWS S3存储桶策略阻止未使用S3或KMS加密的对象上传

AWS S3 强制加密上传策略修正方案

问题核心原因

你原有策略的问题来自两个错误配置:

  • 误通过s3:x-amz-server-side-encryption-aws-kms-key-id字段判断是否使用KMS加密:判断加密类型仅需要校验s3:x-amz-server-side-encryption请求头即可,SSE-KMS加密对应的头取值就是aws:kms,不需要额外校验密钥ID字段。
  • IAM策略中同一Condition块下的多个独立条件默认是**逻辑与(AND)**关系,导致你原来的逻辑变成了「既不满足S3原生加密、也不满足KMS加密」才会触发拒绝,和预期不符。

修正后的可用策略

直接将两种合法的加密头取值放到同一个StringNotEquals条件下即可,IAM策略中同一条件运算符下的多个取值默认是**逻辑或(OR)**关系,刚好匹配你的需求:只要加密头取值不是两种合法值中的任意一种,就直接拒绝上传。

{
  "Id": "Policy1631518070654",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnforceS3OrKmsEncryption",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::webserver7/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": [
            "AES256",
            "aws:kms"
          ]
        }
      },
      "Principal": "*"
    }
  ]
}

逻辑说明

修正后的策略完全匹配你的要求:

  • 上传使用S3原生加密(SSE-S3,头取值为AES256):条件不触发,允许上传
  • 上传使用KMS加密(SSE-KMS,头取值为aws:kms):条件不触发,允许上传
  • 上传未指定加密方式、或使用其他加密类型:条件触发,直接拒绝请求

更稳妥的兼容版本

如果需要严格覆盖用户完全未提交加密头的极端场景,可以新增Null字段判断,确保所有未指定加密的请求都被拦截:

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

内容的提问来源于stack exchange,提问作者Happy coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:42:00