Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 使用CLI的AWS S3服务器端加密_Amazon Web Services_Encryption_Amazon S3_Amazon Kms - Fatal编程技术网

Amazon web services 使用CLI的AWS S3服务器端加密

Amazon web services 使用CLI的AWS S3服务器端加密,amazon-web-services,encryption,amazon-s3,amazon-kms,Amazon Web Services,Encryption,Amazon S3,Amazon Kms,我正在尝试使用AWS KMS设置将对象上载到S3 文件上说上传的对象应该加密 服务器端加密是关于静态数据加密, AmazonS3在将数据写入时在对象级别加密数据 数据中心中的磁盘,并在您访问时为您解密 我已经设置了KMS主密钥,并尝试使用CLI以以下方式上载对象 aws s3api put-object --bucket test --key keys/test.txt --server-side-encryption aws:kms --ssekms-key-id <my_master_

我正在尝试使用AWS KMS设置将对象上载到S3

文件上说上传的对象应该加密

服务器端加密是关于静态数据加密, AmazonS3在将数据写入时在对象级别加密数据 数据中心中的磁盘,并在您访问时为您解密

我已经设置了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
aws s3api放置对象--bucket test--key key key/test.txt--服务器端加密aws:kms--ssekms key id--body test.txt
上传成功,我看到以下响应

{
    "SSEKMSKeyId": "arn:aws:kms:eu-central-1:<id>:key/<my_master_key>", 
    "ETag": "\"a4f4fdf078bdd5df758bf81b2d9bc94d\"", 
    "ServerSideEncryption": "aws:kms"
}
{
“SSEKMSKeyId”:“arn:aws:kms:eu-central-1::key/”,
“ETag”:“a4f4fdf078bdd5df758bf81b2d9bc94d”,
“服务器端加密”:“aws:kms”
}
此外,在S3中检查文件时,我详细地看到它已使用正确的主密钥在服务器端加密

问题是,当我在用户没有使用KMS主密钥权限的情况下下载文件时,我可以在应该加密的时候打开并读取文件,而不会出现问题

注意:我还有一个PutObject策略,在没有服务器端加密的情况下拒绝所有上传,这很好


我想知道我是否误解了服务器端加密,或者我是否做错了什么?非常感谢您的帮助。

不幸的是,我认为您误解了S3中的服务器端加密。正如您自己指出的,从S3服务器端加密(SSE):

服务器端加密是关于保护静止数据的

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

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

您描述的用例更类似于:

客户端加密是指在将数据发送到服务器之前对其进行加密 亚马逊S3


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

如何检索该对象?如果不提供kms密钥,请求甚至会失败。如果bucket中的所有对象都已加密,则可以制定一个bucket策略,在不使用参数头的情况下拒绝GetObject,但对于标记为encrypted@FrédéricHenri我尝试使用CLI get对象,也尝试直接从AWS S3控制台下载这两种情况。我有PutObject策略,但不适用于get,这是一个好主意。我会尝试为get添加该策略。@FrédéricHenri您能给我看一下文档,其中需要密钥来下载对象吗?你说请求应该失败,但我认为那是不对的。我认为服务器端加密只会加密存储在S3服务中某个磁盘卷上的数据。S3在您下载对象时自动解除加密:如果对受AWS KMS保护的对象的所有GET和PUT请求不是通过SSL或使用SigV4发出的,那么它们都将失败。我很快读到,并认为它们也提到了KMS