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

S3桶策略中Condition为Null的第二条Deny语句的作用与必要性

关于S3桶强制加密策略的两个问题解答

先把你提到的示例策略贴出来方便对照:

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

1. 第二条Condition为Null的Deny语句的作用及必要性

你觉得只用第一条语句就够,其实是忽略了一个关键场景:第一条语句的StringNotEquals条件,只有当请求中确实存在s3:x-amz-server-side-encryption这个头部时才会生效。如果用户上传文件时根本就没加这个加密头部,第一条策略的条件判断就不会触发——因为这个头部不存在,相当于没有满足“StringNotEquals”的前提,这时上传请求就会绕过第一条策略,成功把未加密的文件传到桶里。

而第二条语句的作用就是堵上这个漏洞:它的Null条件设置为true,意思是“当s3:x-amz-server-side-encryption这个头部不存在(为Null)时,就拒绝这个PutObject请求”。这样一来,所有上传请求必须同时满足两个要求:一是必须带上加密头部,二是头部的值必须是AES256,彻底实现了桶的强制加密要求。

2. S3桶策略中Effect:Deny, Condition:Null语句的一般用途

这类语句的核心是强制要求执行某个操作时,必须携带指定的请求头部、参数或者资源属性,不允许遗漏。除了加密场景,常见的用途还有这些:

  • 强制上传对象时必须指定存储类头部(x-amz-storage-class),比如要求所有对象都用S3 Glacier存储,避免误上传到标准存储;
  • 强制删除对象时必须附带特定的条件参数,比如只有满足某个时间条件才能删除;
  • 强制上传的对象必须带有指定的标签(比如aws:tagging:TagSet),确保所有对象都被正确分类,方便后续的权限控制或者成本统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:37:32