我可以在存储桶策略中通过URL限制基于Amazon S3浏览器的上载

时间:2015-04-01 13:58:53

标签: amazon-web-services amazon-s3

基于:http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html

有没有办法将基于浏览器的上传限制到Amazon S3,如果它不是来自我的安全网址(即https://www.someurl.com),就会被拒绝?

谢谢!

3 个答案:

答案 0 :(得分:1)

  

我想绝对保证帖子来自我的网站

这是不可能的。

网络是无状态的,来自“特定域”的POST只是一个有效的概念,因为Referer:标头很容易被欺骗,而恶意用户很可能知道这一点。通过EC2服务器运行将不会获得任何东西,因为它不会告诉你任何新的和有意义的。

邮政政策文件不仅会过期,还会将对象密钥约束为前缀或完全匹配。恶意用户如何打败这个?他们不能。

  

在您的客户端表单中,您拥有凭据的加密/哈希版本。

不,你没有。

您拥有的是一张签名,证明您授权S3兑现表单帖子。它不可能进行逆向工程,以便可以修改政策,这就是重点。表单必须与策略匹配,该策略无法编辑且仍然有效。

您使用仅为您和AWS知道的信息生成此签名;特别是,您的访问密钥附带的秘密。

当S3收到请求时,它会计算签名应该是什么。如果匹配,则检查拥有该密钥的特定用户的权限,以查看该请求是否已获得授权。

通过约束策略中的对象键,可以防止用户上载(或覆盖)除策略授权的特定对象之外的任何对象。或者特定的对象前缀,在这种情况下,您将用户限制为不受该前缀下的任何内容的伤害。

如果您要移交允许在整个存储桶中覆盖任何对象键的策略,那么您通过尝试将帖子限制为“来自”您的网站来解决错误的问题。

答案 1 :(得分:0)

我认为您误解了S3服务的身份验证方式。

您的服务器将拥有一个包含您的访问ID和密钥的凭证文件,然后您的服务器会在文件上传到您的S3存储桶时对其进行签名。

亚马逊的S3服务器然后检查上传的文件是否已由您的访问ID和密钥签名。

此凭据文件永远不应公开在任何地方公开,并且无法通过网络获取密钥。

对于基于浏览器的上传,您的表单应包含一个签名,该签名将传递到Amazon的S3服务器并进行身份验证。此签名是根据上传政策,您的访问ID和密钥的组合生成的,但会进行哈希处理,因此您无法返回密钥。

正如您所提到的,这可能意味着只需重复使用X-Amz-Signature标题中的签名,就可以从应用范围之外上传到您的存储桶。

这是政策的到期标头所用的内容,因为它允许您在表单上设置合理的有效期限以防止滥用。

因此,当用户转到您的上传页面时,您的服务器应生成一个截止日期较短的策略(例如,生成时间后5分钟)。然后,它应该根据此策略和您的Amazon凭据创建签名。现在,您可以在此处创建一个表单,该表单将使用相关策略和签名将任何数据发布到您的S3存储桶。

如果恶意用户然后尝试复制政策和签名并直接在其他地方使用,那么它们最初登陆您的上传页面后仍会在5分钟后过期。

您还可以使用该策略来限制其他内容,例如文件名或mime类型。

有关browser based uploads to S3how S3 authenticates requests的AWS文档中提供了更详细的信息。

要进一步限制请求的来源,您应该考虑在S3存储桶上启用Cross-Origin Resource Sharing (CORS)权限。

这允许您指定每种类型的请求可能来自哪个域。

答案 2 :(得分:0)

而不是试图阻挡门。取下门。

更好的解决方案恕我直言,可以防止任何直接上传到s3 含义删除允许陌生人上传的s3上传策略。

  1. 将它们上传到您的某个服务器。
  2. 根据需要验证上传。
  3. 如果可以接受,那么您的服务器可以将文件移动到s3。