用于保护S3文档的Rails实现

我想通过rails app保护我的s3文件,如果我去:

www.myapp.com/attachment/5应在显示/下载文档之前对用户进行身份validation。

我已经阅读了关于stackoverflow的类似问题,但我不确定我是否已经看到任何好的结论。

根据我的阅读,您可以采取一些措施来“保护”您的S3文档。

1)模糊URL。 我做到了这一点。 我认为这是一件好事,所以没有人可以猜到这个url。 例如,如果您的S3 URL显而易见,那么很容易“遍历”URL: https : //s3.amazonaws.com/myapp.com/attachments/1/document.doc 。 有一个URL,如: https : //s3.amazonaws.com/myapp.com/7ca/6ab/c9d/db2/727/f14/document.doc似乎好多了。 这很好,但不能解决通过电子邮件或网站传递URL的问题。

2)使用如下所示的过期URL: Rails 3,paperclip + S3 – 如何存储实例并保护访问对我而言,这不是一个很好的解决方案,因为URL被暴露(即使只是很短的一段时间)并且另一个用户可能及时重用URL。 您必须调整允许下载的时间,而不会提供太多的复制时间。 这似乎是错误的解决方案。

3)通过应用程序代理文档下载。 起初我尝试使用send_file: http : //www.therailsway.com/2009/2/22/file-downloads-done-right但问题是这些文件只能是服务器上的静态/本地文件不通过其他网站(S3 / AWS)提供服务。 但是,我可以使用send_data并将文档加载到我的应用程序中,并立即将文档提供给用户。 这个解决方案的问题很明显 – 带宽的两倍和时间的两倍(将文档加载到我的应用程序然后再返回给用户)。

我正在寻找一种能够提供#3完全安全性的解决方案,但不需要额外的带宽和时间来加载。 看起来Basecamp正在“保护”他们应用程序背后的文档(通过身份validation),我认为其他网站正在做类似的事情,但我不认为他们正在使用我的#3解决方案。

建议将不胜感激。

更新

我选择了第四个解决方案:

4)使用amazon存储桶策略来控制基于引用者的文件访问: http : //docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?UsingBucketPolicies.html

再次更新:

#4井可以通过浏览器开发人员的工具轻松解决。 所以我仍然在寻找一个可靠的解决方案。

我会投票给3号,这是唯一真正安全的方法。 因为一旦您将用户传递到有效期至其到期时间的S3 URL。 一个狡猾的用户可以使用那个洞,唯一的问题是,这会影响你的应用程序吗? 也许您可以将过期时间设置得更低,从而将风险降至最低? 看一下这篇文章的摘录: 从浏览器访问私有对象

可以通过对S3服务器的经过身份validation的GET请求访问所有私有对象。 您可以为这样的对象生成经过身份validation的URL:

S3Object.url_for('beluga_baby.jpg', 'marcel_molina') 

默认情况下,经过身份validation的url会在生成后5分钟到期。

到期选项可以使用:expires选项使用epoch以来的绝对时间,也可以使用:expires_in选项指定相对于now的秒数:

我一直在尝试做类似的事情。 如果您不想两次使用带宽,那么唯一可行的方法是允许S3执行此操作。 现在我完全了解了暴露的URL。 你能想出任何替代方案吗?

我找到了一些在这方面可能有用的东西 – http://docs.aws.amazon.com/AmazonS3/latest/dev/AuthUsingTempFederationTokenRuby.html

一旦用户登录,就应该创建一个带有作为aws策略一部分的IP的aws会话,然后可以使用它来生成签名的URL。 因此,如果其他人抓住URL,签名将不匹配,因为请求的来源将是不同的IP。 让我知道这是否有意义且足够安全。