4

我正在尝试使用具有 AWS KMS 设置的服务器端加密将对象上传到 S3。

文档说上传的对象应该加密;

服务器端加密是关于静态数据加密——也就是说,Amazon S3 在将数据写入其数据中心的磁盘时在对象级别加密您的数据,并在您访问它时为您解密。

我已设置 KMS 主密钥并尝试使用 CLI 通过以下方式上传对象

aws s3api put-object --bucket test --key keys/test.txt --server-side-encryption aws:kms --ssekms-key-id <my_master_Key_id> --body test.txt

上传成功,我看到以下响应

{
    "SSEKMSKeyId": "arn:aws:kms:eu-central-1:<id>:key/<my_master_key>", 
    "ETag": "\"a4f4fdf078bdd5df758bf81b2d9bc94d\"", 
    "ServerSideEncryption": "aws:kms"
}

此外,在 S3 中检查文件时,我详细看到它已使用适当的主密钥在服务器端加密。

问题是,当我使用无权使用 KMS 主密钥的用户下载文件时,我可以毫无问题地打开和读取文件,而该文件应该被加密。

注意:我还有 PutObject 策略拒绝所有没有服务器端加密的上传,这很好用。

我想知道我是否误解了服务器端加密,或者我做错了什么?任何帮助表示赞赏。

4

1 回答 1

2

不幸的是,我认为您误解了 S3 中的服务器端加密。就像您指出的那样,来自 S3 服务器端加密 (SSE)文档

服务器端加密是关于保护静态数据。

当 S3 收到您的对象时,它会调用 KMS 创建数据密钥,使用该数据密钥(不是主密钥)加密您的数据,并将加密的数据密钥与加密的数据一起存储。

当您尝试下载加密文件时,S3 看到它已被加密,要求 KMS 解密数据密钥(使用主密钥),然后使用解密的数据密钥解密数据,然后返回给您。我从文档以及 SSE 和 KMS 工作方式的理解是,没有假设用户需要访问主密钥才能工作——只要 S3 可以访问它就足够了。

您描述的用例更类似于S3 客户端加密

客户端加密是指在将数据发送到 Amazon S3 之前对其进行加密。

在这种情况下,S3 客户端(而不是后端的 S3)将请求 KMS 数据密钥(从主密钥派生),在客户端加密数据并上传。无法在服务器上对其进行解密,并且当客户端下载(加密的)文件时,需要在客户端进行解密(不过,S3 客户端会为您处理)。

于 2017-04-25T14:57:29.247 回答