此存储桶策略的第二个条件的目的是什么?

时间:2018-01-21 15:20:39

标签: amazon-web-services amazon-s3 amazon-iam

阅读此doc,它给出了在存储桶上强制加密的示例:

{
  "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"
        }
      }
    }
  ]
}

实际上做的第二个条件是什么?为什么有必要对我来说,看起来我只需要第一个?我不明白NULL在这里做什么。

2 个答案:

答案 0 :(得分:1)

如果s3:x-amz-server-side-encryption key值为null条件块中的Null条件的计算结果为true。此规则正在检查缺少的标头。

在此策略的第一条规则中,正在比较加密值。为了进行这种比较,必须存在标题。第二条规则检测到标头丢失,从而强制执行加密选择。

要点:

第一条规则检查加密标头的值。

第二条规则检查标题是否存在。

答案 1 :(得分:1)

根据documentation

  

使用Null条件运算符检查是否存在条件键   在授权时。在政策声明中,使用true   (密钥不存在 - 它为空)或错误(密钥存在及其存在)   value不为null)。

因此,在您的示例中,如果密钥s3:x-amz-server-side-encryption不存在,则它应为null以使条件成功。