S3 只允许加密策略不起作用

S3 allow only encrypted policy doesn't work

我正在使用示例 provided by Amazon 禁止上传到未启用加密的 S3,如下所示:

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

然后当我尝试使用预签名的 URL 上传时,我从 S3 返回了一个 "access denied"。如果我删除该策略(它是存储桶中唯一的一组),它就会起作用。预签名的 URL 看起来像

'https://mybucket.s3.amazonaws.com/myfile.txt?Signature=6UxyYNjZDLFHlibwx3Aypicx7o4%3D&Expires=1432059554&AWSAccessKeyId=AKI1234567890&x-amz-server-side-encryption=AES256'

出了什么问题?

编辑:我使用 AWS boto 提供的 generate_url 函数生成 URL。

您可能无法将 SSE 指定为 PUT 的一部分,或者条件在 pre-signed URL 上不可用,因为它只查看 headers.

我通过从表单上传(使用 POST)和阻止上传的策略 kicks-in 进行了测试,因为它没有 server-side 加密,但没有办法将加密指定为 FORM-based 上传的一部分。

但是,您提供的策略成功阻止了通过其他方法上传,除非它们指定了 SSE。