【问题标题】:S3 with boto, encrypt at restS3 with boto,静态加密
【发布时间】:2015-02-19 13:02:31
【问题描述】:

我们正在尝试在 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 问题)。

但是我必须在传递密钥时做错了什么,因为它是否被禁用并不重要。它仍然给出签名错误

我缺少什么吗?

【问题讨论】:

  • 这方面有什么更新吗?

标签: encryption amazon-s3 boto


【解决方案1】:

迟到的答案,但我遇到了同样的问题并发现了这个:

https://github.com/boto/boto/issues/2921

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

Boto 为包含类似内容的请求计算了不正确的签名 标题,因为它不是按标题名称而是按标题对标题进行排序 完整的标题。

一个例子是使用范围 api 的分段上传部分副本。博托 使用此顺序计算其签名,因为 - 排序之前:

x-amz-copy-source-range:bytes=5-15
x-amz-copy-source:multipart-1426209034/source

顺序不正确,应该反过来。

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

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

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

【讨论】:

    【解决方案2】:
    s3.Bucket(event['bucket']).put_object(
                                Key=event['key'],
                                Body=event['body'],
                                ServerSideEncryption='AES256'
    )
    

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

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 1970-01-01
      • 2021-11-29
      • 2014-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 2018-08-03
      相关资源
      最近更新 更多