我正在尝试使用具有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策略拒绝所有没有服务器端加密的上传,这很好。
我想知道我是否误解了服务器端加密,或者我做错了什么?任何帮助表示赞赏。
答案 0 :(得分:2)
不幸的是,我认为您在S3中误解了服务器端加密。就像你指出的那样,来自S3服务器端加密(SSE)docs:
服务器端加密是关于保护静态数据。
当S3收到您的对象时,它会调用KMS创建数据密钥,使用该数据密钥(而不是主密钥)加密您的数据,并将加密的数据密钥与加密数据一起存储。
当您尝试下载加密文件时,S3会看到它已加密,要求KMS解密数据密钥(使用主密钥),然后使用解密的数据密钥在返回给您之前解密数据。我对文档以及SSE和KMS工作方式的理解是,没有假设用户需要访问主密钥才能使用它 - 这足以让S3有权访问它。
您描述的用例更类似于S3 client-side encryption:
客户端加密是指在发送数据之前加密数据 亚马逊S3。
在这种情况下,S3客户端(而不是后端的S3)将要求提供KMS数据密钥(从主密钥派生),加密数据客户端并上传它。在服务器上解密它是不可能的,当客户端下载(加密)文件时,需要在客户端进行解密(不过S3客户端会为你解决这个问题)。