Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption S3与boto,静止时加密_Encryption_Amazon S3_Boto - Fatal编程技术网

Encryption S3与boto,静止时加密

Encryption S3与boto,静止时加密,encryption,amazon-s3,boto,Encryption,Amazon S3,Boto,我们试图在AWS中有一个完全加密的bucket 我们有一个密钥,key=“arn:aws:kms:****”,一个bucketName,bucketName=“MyUniqueBucket”和一些我想在静止时上传和加密的json:有效载荷={“foo”:“bar”} 加密部队政策: policy = { "Version": "2012-10-17", "Id": "PutObjPolicy", "Statement": [{ "Sid": "DenyUnEncryptedO

我们试图在AWS中有一个完全加密的bucket

我们有一个密钥,
key=“arn:aws:kms:****”
,一个bucketName,
bucketName=“MyUniqueBucket”
和一些我想在静止时上传和加密的json:
有效载荷={“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,我们现在要设置该策略:

bucket = get_bucket()
bucket.set_policy(json.dumps(policy))
现在接下来我想上传一个文件,并用我的安全密钥对其进行加密(以启用轮换,因为默认主密钥不允许轮换)

但是,它会引发一个错误:

<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
我查到的是:

我有权使用钥匙 我与v4签名连接 我可以上传到一个桶没有加密 我可以上传设置为加密的标题,而无需使用自己的自定义密钥(即使用默认密钥)(注意,这会导致MD5与ETAG之间的问题)

但我一定是在传递密钥时出错了,因为不管它是否被禁用。它仍然会给出签名错误


我遗漏了什么

回答晚了,但我碰到了同样的问题,发现了以下问题:

boto中的SSE-KMS支持实际上存在两个问题。 引用github的:

Boto为包含类似内容的请求计算了不正确的签名 标题,因为它不是按标题名称而是按 完成标题

一个例子是带有范围api的多部分上载部分副本。博托 使用此顺序计算其签名,因为-排序早于:

x-amz-copy-source-range:字节=5-15
x-amz-copy-source:多部分-1426209034/源

顺序不正确,应该相反

由于md5签名不匹配,即使在修补boto代码之后,仍然无法工作。 同样是qoute,这次来自用户hoppinghol(链接可以在上面提到的pull请求下的讨论线程中找到):

既然v4签名已修复,那么当KMS加密头也已设置时 在S3上传时,md5校验和将不匹配,就像sse-c上传一样。这 添加标头检查以跳过md5检查,方法与sse-c上载相同

这两项更改都尚未合并到boto主分支中。我不得不对boto库进行修补(我知道这不是最好的主意,但这只是检查更改是否有帮助),它对我起了作用

s3.Bucket(event['bucket']).put_object(
                            Key=event['key'],
                            Body=event['body'],
                            ServerSideEncryption='AES256'
)

使用默认的AWS S3键。如果S3遭到黑客攻击,您的文件将被加密,但任何有权访问该文件或存储桶的人都可以读取它

这方面有更新吗?
s3.Bucket(event['bucket']).put_object(
                            Key=event['key'],
                            Body=event['body'],
                            ServerSideEncryption='AES256'
)