我们正在尝试在AWS中使用完全加密的存储桶。
我们有一个密钥key = "arn:aws:kms:*****"
,一个bucketName,bucketName = "MyUniqueBucket"
和一些我要上传的json&加密休息:payload = { "foo": "bar" }
加密限制政策:
policy = {
"Version": "2012-10-17",
"Id": "PutObjPolicy",
"Statement": [{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": ("arn:aws:s3:::%s/*") % bucketName,
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption":"aws:kms"
}
}
}
]
}
现在我们boto
与eu-west-1
:
def get_bucket():
conn = s3.connect_to_region("eu-west-1")
try:
return conn.get_bucket(bucketName)
except S3ResponseError:
return conn.create_bucket(bucketName, location=Location.EU)
使用存储桶我们现在要设置该策略:
bucket = get_bucket()
bucket.set_policy(json.dumps(policy))
现在接下来我想上传一个文件并用我的安全密钥对其进行加密(以启用旋转,因为默认主密钥不允许这样做)。
headers = {
"x-amz-server-side-encryption-aws-kms-key-id": key,
"x-amz-server-side-encryption" : "aws:kms"
}
bucketKey = Key(bucket, "fileName.json")
bucketKey.set_metadata("Content-Type", "application/json")
bucketKey.set_contents_from_string(json.dumps(payload), headers = headers)
然而它引发了一个错误:
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
我检查了什么:
我有权使用密钥 我与v4签名相关联 我可以在没有加密的桶中上传 我可以使用设置为加密的标头上传而不使用我自己的自定义密钥(即使用默认密钥)(通知提供MD5与ETAG问题)。
但是我必须在传递密钥时做错了,因为它是否被禁用无关紧要。它仍然会出现签名错误
我缺少什么?
答案 0 :(得分:1)
迟到的答案,但我遇到了同样的问题并发现了这个:
https://github.com/boto/boto/issues/2921
boto实际上有两个SSE-KMS支持问题。 引用github的comment by tpodowd:
Boto为包含类似的请求计算了错误的签名 标题,因为它不是通过标题名称而是通过标题对标题进行排序 完整标题。
一个例子是带有范围api的分段上传部件副本。宝途 使用此订单计算其签名,因为 - 之前排序:
的x AMZ-复制源范围:字节= 5-15
的x AMZ-复制源:多-1426209034 /源订单不正确,应该是另一种方式。
即使修补了boto代码仍然无效,由于md5签名不匹配。 再次qoute,这次来自用户hoppinghol(链接可以在上面提到的pull请求下的讨论主题中找到):
现在已修复v4签名,同时还设置了KMS加密标头 在S3上传时,md5校验和将不匹配,就像sse-c上传一样。这个 添加标题检查以跳过md5检查,与sse-c上传相同。
这两项修改都尚未合并到boto master分支中。我不得不猴子补丁boto库(我知道这不是最好的主意,但它只是检查变化是否有帮助)并且它对我有用。
答案 1 :(得分:-1)
s3.Bucket(event['bucket']).put_object(
Key=event['key'],
Body=event['body'],
ServerSideEncryption='AES256'
)
使用默认的AWS S3密钥。如果S3被黑客攻击,您的文件将被加密,但任何有权访问该文件或存储桶的人都可以读取它。