Encryption S3存储桶的强制服务器端加密

Encryption S3存储桶的强制服务器端加密,encryption,amazon-web-services,amazon-s3,emr,Encryption,Amazon Web Services,Amazon S3,Emr,我想设置一个S3 bucket策略,这样所有上传到该bucket的请求都将使用服务器端加密,即使请求头中没有指定 我看过这篇文章(),其中有人设置了一个bucket策略,拒绝所有未指定服务器端加密的put请求,但我不想拒绝,我希望put成功,但使用服务器端加密 我的问题是将输出从EMR流式传输到S3存储桶,我无法控制发出请求的代码,而且在我看来,必须根据每个请求指定服务器端加密。S3不会自动执行此操作,您必须创建一个解决方案。我建议通过一个代理来传递请求,通过添加适当的头来“丰富”它们。要做到这

我想设置一个S3 bucket策略,这样所有上传到该bucket的请求都将使用服务器端加密,即使请求头中没有指定

我看过这篇文章(),其中有人设置了一个bucket策略,拒绝所有未指定服务器端加密的put请求,但我不想拒绝,我希望put成功,但使用服务器端加密


我的问题是将输出从EMR流式传输到S3存储桶,我无法控制发出请求的代码,而且在我看来,必须根据每个请求指定服务器端加密。

S3不会自动执行此操作,您必须创建一个解决方案。我建议通过一个代理来传递请求,通过添加适当的头来“丰富”它们。要做到这一点,我会尝试(按顺序):

1-Apache Camel内容丰富

2-NGXINX/HTTPD模块代理

3-自定义代码


我打赌也有一个非常智能的ruby http库:)

IMHO没有办法自动告诉Amazon S3为每个PUT请求打开SSE。 因此,我将调查以下内容:

  • 写一个脚本列出你的bucket

  • 对于每个对象,获取元数据

  • 如果未启用SSE,请使用PUT COPY API()添加SSE (…)复制对象时,可以保留大部分元数据(默认值)或指定新的元数据(…)

  • 如果PUT操作成功,请使用删除对象API删除原始对象

然后根据您的业务需求,每小时或每天运行该脚本。 您可以在Python()中使用s3api来简化脚本的编写

如果这种“写后更改”的解决方案在业务方面对您无效,您可以在不同的级别上工作(与上面Julio的答案一致)

  • 在API客户端和S3API之间使用代理(就像站点上的反向代理),并将其配置为为为每个PUT/POST请求添加SSE HTTP头。 开发人员必须通过代理,并且无权对S3API端点发出请求

  • 编写一个包装器库来自动添加SSE元数据,并强制开发人员在SDK上使用您的库

今天晚些时候的行动是组织中的一个纪律问题,因为在技术层面上实施这些行动并不容易


Seb

您可以使用AWS Lambda为每个通过PUT操作接触的对象设置服务器端AES256加密。检查。我没有试过,但看起来和你想要的一模一样。

我使用这个快速bash脚本来加密整个bucket

#/bin/bash
桶=1美元
echo“加密桶:${Bucket}”
回声“-------------------------------------”
#如果未指定Bucket名称,则为Bail:
如果[-z$1]]
然后
echo“用法:./encrypt_bucket.sh”
出口1
fi
#只是为了让control-c能够工作,而不是继续尝试循环:
陷阱“回波停止加密!;退出1”SIGINT SIGTERM
函数get_file_list(){
文件列表=$(aws s3 ls--汇总--递归s3://${bucket}| awk'{print$NF}'| grep-v总计)
num_files=$(aws s3 ls--summary--recursive s3://${bucket}| grep“Total Objects:| awk'{print$3}')
}
函数s3cp(){
aws s3 cp--sse s3://${bucket}/$1 s3://${bucket}/$1
}
获取文件列表
num=0
对于${file_list}中的i
做
num=$($num+1))
echo“加密文件:${num_文件}的${num}”
回声“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
s3cp${i}
回声“”
完成了
亚马逊刚刚发布了强制执行此功能的功能,使其变得非常简单

摘录自关于设置此项的说明

请注意,任何退出的bucket策略都将在任何bucket加密设置之前进行评估

AmazonS3在应用bucket之前评估并应用bucket策略 加密设置。即使启用bucket加密设置, 如果发生以下情况,则不带加密信息的PUT请求将被拒绝: 您具有拒绝此类PUT请求的bucket策略。检查你的 bucket策略,并在需要时对其进行修改


谢谢Julio,这很有意义,似乎唯一的方法就是更改请求中的头。我希望通过一个系统范围的自定义boto配置或其他方式来实现这一点,代理服务器似乎设计过度了。无论如何,我认为这是一个非常常见的用例,人们想要一个完全安全的桶。希望这将是未来版本中的一个选项。我们正在使用指令Replace执行复制对象请求。它适用于某些文件,但我们发现某些文件仍然没有加密。我想我需要尝试你的第一个解决方案,每天运行一个脚本。谢谢你的帖子,这绝对是lambda的一个有趣用法。不幸的是,在lambda函数启动的过程中,数据似乎会一直未加密地存在于存储桶中,对吗?看起来3年后亚马逊终于解决了我的问题!