使用CLI进行AWS S3服务器端加密

时间:2016-09-08 08:39:02

标签: amazon-web-services encryption amazon-s3 amazon-kms

我正在尝试使用具有AWS KMS设置的server side encryption将对象上传到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策略拒绝所有没有服务器端加密的上传,这很好。

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

1 个答案:

答案 0 :(得分:2)

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

  

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

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

当您尝试下载加密文件时,S3会看到它已加密,要求KMS解密数据密钥(使用主密钥),然后使用解密的数据密钥在返回给您之前解密数据。我对文档以及SSE和KMS工作方式的理解是,没有假设用户需要访问主密钥才能使用它 - 这足以让S3有权访问它。

您描述的用例更类似于S3 client-side encryption

  

客户端加密是指在发送数据之前加密数据   亚马逊S3。

在这种情况下,S3客户端(而不是后端的S3)将要求提供KMS数据密钥(从主密钥派生),加密数据客户端并上传它。在服务器上解密它是不可能的,当客户端下载(加密)文件时,需要在客户端进行解密(不过S3客户端会为你解决这个问题)。