S3用boto,静态加密

时间:2015-02-19 13:02:32

标签: encryption amazon-s3 boto

我们正在尝试在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"
        }
      }
    }
  ]
}

现在我们botoeu-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问题)。

但是我必须在传递密钥时做错了,因为它是否被禁用无关紧要。它仍然会出现签名错误

我缺少什么?

2 个答案:

答案 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被黑客攻击,您的文件将被加密,但任何有权访问该文件或存储桶的人都可以读取它。