如何通过rails应用程序从S3代理文件以避免泄漏?

mdr*_*iel 5 proxy ruby-on-rails amazon-s3 paperclip ruby-on-rails-3

为了避免热链接,S3带宽泄露等,我想让我的存储桶保密,并通过Rails应用程序提供文件.概念听起来很容易,但我不完全确定哪种方法最适合这种情况.

我正在使用回形针进行一般资产管理.是否有任何内置方法来实现这种类型的代理?

一般来说,我可以轻松地从回形针解析url并将它们指回我自己的控制器.从这一点来看应该怎么办?我应该只使用Net :: HTTP下载图像,然后使用send_data服务吗?在我之间我想记录referer并设置正确的Control-Cache标头,因为我在应用程序前面有一个反向代理.在这种情况下Net :: HTTP + send_data是否合理?

也许整个想法真的很糟糕,因为我现在还不知道的一些原因?我一般情况下,我认为将直接S3链接暴露在公共桶中是危险的,并且在一些严重问题中会产生泄漏/热链接......

更新:

如果您有任何其他想法可以减少S3账单并防止热链接反正请分享,即使它们与Rails没有直接关系.

yfe*_*lum 5

使用(私有存储桶|私有文件)并使用签名 URL 指向存储在 S3 上的文件。

签名包括到期时间(例如,从现在起 10 分钟,无论您想设置什么),以及加密散列。如果签名无效或过期时间已过,S3 将拒绝提供文件。

这很有用,因为只有您才能在 S3 中为您的私人文件创建有效的 URL,并且您可以控制 URL 保持有效的时间。这可以防止窃取,因为窃取者无法对他们自己的 URL 进行签名,如果他们获得您签名的 URL,该 URL 将很快过期,之后就无法使用。


小智 5

由于上面没有回答,这里有一个关于如何流式传输存储在S3上的文件的小代码示例.

render :text => proc { |response, output|
   AWS::S3::S3Object.stream(path, bucket) do |segment|
     output.write segment
     output.flush # not sure if this is needed
   end
 }
Run Code Online (Sandbox Code Playgroud)

根据您的网络服务器,这可能(杂项)或可能不(webrick)工作,所以如果它不在开发流中,请不要太沮丧.


Til*_*ill 1

我可能会避免这样做——至少在我别无选择之前。

您需要考虑到,如果每次下载图像,您可能还会增加带宽费用。此外,通过脚本处理每个图像,您还需要更多的 CPU 和 RAM 来执行此操作。恕我直言,这不是最好的前景。

我可能会启用 Amazon S3 的访问日志并编写一个小工具来分析使用情况并更改存储桶/对象的权限,以防使用情况达到顶峰。每 10 分钟左右运行一次这个 cronjob 就可以了?

您还可以使用s3stat。他们还提供免费计划。

编辑:根据我对 Varnish 的建议,我添加了一个指向有关使用 Varnish 防止热链接的博客条目的链接。