阅读此文档,它给出了一个在存储桶上强制加密的示例:
{
"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 甚至在这里做什么。
如果s3:x-amz-server-side-encryption key
值为 null
,则条件块中的 Null 条件的计算结果为 true。此规则正在检查缺少的标头。
在此策略的第一个规则中,将比较加密值。为了进行此比较,标头必须存在。第二条规则检测到标头丢失,从而强制进行加密选择。
总结:
第一条规则检查加密标头的值。
第二条规则检查标头是否存在。
根据文档,
使用 Null 条件运算符检查条件键是否存在 在授权时。在策略语句中,使用 true (键不存在 - 它是空的(或假(键存在并且其 值不为空(。
因此,在您的示例中,如果密钥 s3:x-amz-服务器端加密不存在,则它应该为 null 以使条件成功。
我们的应用程序略有不同,因为我们的应用程序无法设置 SSE,我们也希望避免自定义 KMS 密钥。通过利用默认存储桶加密,此策略可确保使用默认存储桶加密或 AES256 进行静态加密。
{
"Sid": "Ensure encryption at rest",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::myBucket/*",
"Condition": {
"Null": {
"s3:x-amz-server-side-encryption": "false"
},
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
}