2011-06-18 26 views
10

我想保护我的S3文件落后Rails应用程序,例如,如果我去:Rails的实施为确保S3文件

www.myapp.com/attachment/5应该验证用户显示前/下载文件。

我已阅读过类似的问题在stackoverflow,但我不知道我见过任何好的结论。

从我读过的文档中,您可以做几件事来“保护”您的S3文档。

1)模糊URL。我已经做到了。我认为这是一件好事,所以没有人可以猜测URL。例如,如果您的S3网址很明显,那么可以轻松地“漫游”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)使用过期网址如下所示:Rails 3, paperclip + S3 - Howto Store for an Instance and Protect Access 但对我来说这不是一个很好的解决方案,因为URL暴露(即使只是时间很短的周期)和其他用户或许可以及时重用网址很快。您必须调整时间以允许下载,而无需提供太多时间进行复制。这似乎是错误的解决方案。

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

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

建议将不胜感激。

UPDATE

4)使用Amazon斗策略来控制访问基于引荐文件: http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?UsingBucketPolicies.html

再次更新:

我有一个4的解决方案去

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

回答

0

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

所有私有对象都可以访问通过 通过身份验证的GET请求,S3 服务器。您可以生成一个 验证URL像 这样的对象:

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

默认情况下 验证URL过期5分钟 产生后,他们。

到期选项可以指定 或者与绝对时间由于 纪元与:相对于与现在 期满选项或 用秒数:expires_in选项:

+0

谢谢你的帖子。这不是我的#2解决方案吗?我知道它是可行的,但它似乎不是一个真正安全的方法。出于某种原因,我觉得它留下了一个洞(即使它很小)。有关如何实施我的#3没有双带宽问题的任何建议? –

+0

那么它尽可能地安全,你可以得到。你可能能够使用某种反向代理来获得这个,但带宽将在某处使用。我只是将超时设置为1分钟。 –

+0

我希望我错过了一些与某些apache插件相关的解决方案,它可以根据RoR的auth重定向。是否超时(无论你设置的窗口有多小)仍然允许某种程度的不安全性?......但是,我同意这可能只是唯一的两个答案。如果没有其他人发出响声,我会将你的答案设定为正确答案。谢谢。 –

0

我有现在正在尝试做相似的事情。如果你不想使用两次带宽,那么唯一可行的方法就是允许S3执行此操作。现在,我完全了解您公开的网址。你是否能够提出任何替代方案?

我发现的东西,在这方面可能是有用的 - http://docs.aws.amazon.com/AmazonS3/latest/dev/AuthUsingTempFederationTokenRuby.html

一旦与他的IP作为AWS政策的一部分的AWS会话的用户登录,应创建,然后这可以用于生成签署的网址。因此,如果其他人抓取URL,则签名将不匹配,因为请求的来源将是不同的IP。让我知道这是否合理并且足够安全。