Ruby on rails 如何通过rails应用程序代理S3中的文件以避免泄密?

Ruby on rails 如何通过rails应用程序代理S3中的文件以避免泄密?,ruby-on-rails,ruby-on-rails-3,proxy,amazon-s3,paperclip,Ruby On Rails,Ruby On Rails 3,Proxy,Amazon S3,Paperclip,为了避免热链接、S3带宽不足等问题,我想让我的bucket私有化,并通过Rails应用程序提供文件。一般来说,这个概念听起来很简单,但我不完全确定哪种方法最适合这种情况 我使用回形针进行一般资产管理。是否有任何内置方式来实现这种类型的代理 一般来说,我可以很容易地从回形针解析url,并将它们指向我自己的控制器。从这一点上应该发生什么?我是否应该简单地使用Net::HTTP下载图像,然后为其提供send_数据?在这两者之间,我想记录referer并设置适当的控制缓存头,因为我在应用程序前面有一个反

为了避免热链接、S3带宽不足等问题,我想让我的bucket私有化,并通过Rails应用程序提供文件。一般来说,这个概念听起来很简单,但我不完全确定哪种方法最适合这种情况

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

一般来说,我可以很容易地从回形针解析url,并将它们指向我自己的控制器。从这一点上应该发生什么?我是否应该简单地使用Net::HTTP下载图像,然后为其提供send_数据?在这两者之间,我想记录referer并设置适当的控制缓存头,因为我在应用程序前面有一个反向代理。在这种情况下,Net::HTTP+发送数据的方式合理吗

也许由于某些原因,整个想法真的很糟糕,我现在还不知道?我一般认为,公开S3与公共桶的直接链接是危险的,并且在某些严重问题上会出现泄漏/热链接

更新:


如果你有任何其他的想法,可以减少S3的费用,并防止热链接在任何情况下,请分享,即使他们没有直接关系到Rails

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

你需要考虑到,如果你每次下载图像,你可能还会增加带宽账单。此外,通过脚本处理每个图像,还需要更多的CPU和RAM。不是最美好的前景——我不知道

我可能会为AmazonS3编写一个小型工具来分析使用情况,并在使用情况失控时更改bucket/对象的权限。每隔10分钟左右将其作为cronjob运行一次,您是否应该保存

你也可以使用。他们还提供免费计划

编辑:根据我对Varnish的建议,我正在添加一个链接。

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

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


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

由于上面没有具体的答案,下面是一个如何流式传输存储在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
 }

根据您的Web服务器,这可能(mongrel)也可能(webrick)起作用,因此,如果在开发过程中没有流式传输,请不要太沮丧。

提供临时预签名URL:

   def show
      redirect_to Aws::S3::Presigner.new.presigned_url(
         :get_object, 
         bucket: 'mybucket', 
         key: '/folder/file.pdf'
         expires_in: 60)
    end

S3仍在分发内容,因此您可以从Rails(速度非常慢)卸载工作,处理HTTP缓存、HEAD操作,并使用Amazon CDN。

您当前是否有窃听问题?我不愿意做一些会大大降低我的应用程序速度的事情,只是为了解决我将来可能遇到的问题。这不仅仅是解决潜在问题的问题。我只是不想有一天醒来时发现账单压得我喘不过气来。。。我不确定这是否会“显著”降低应用程序的运行速度,因为此时memcache/reverse proxy中的资产将被保留。当然,我知道它的缺点,这就是为什么我需要一个解决方案的想法。总的来说,情况并不那么糟糕。请记住,在大多数情况下,图像可以被大量兑现。在进行一些研究时,我得出了一个结论:最有效的方法是在S3而不是rails应用程序前面使用反向代理。我可以在那里做任何事情——检查参考资料,做一些广泛的日志分析。这样的前端将戏剧性地重播S3账单,最终性能不应该再低。是的,听起来不错——我推荐清漆。:)请记住,即使图像被缓存,您也可以通过添加另一个服务来运行更复杂的设置。而且可能还需要更高的代理处理能力(例如,一个实例或至少是资源)。这是一种智能的重定向,这样,如果你将链接放在电子邮件或其他地方,一旦重定向,他们总是会得到一个新的链接,新的过期日期。