为了避免热链接,S3带宽泄露等,我想让我的存储桶保密,并通过Rails应用程序提供文件。概念听起来很容易,但我不完全确定哪种方法最适合这种情况。
我使用回形针进行一般资产管理。是否有任何内置方法来实现这种类型的代理?
一般情况下,我可以轻松地从回形针解析网址并将它们指回给我自己的控制器。从这一点来看应该发生什么?我应该只使用Net :: HTTP下载图像,然后使用send_data服务吗?在我之间我想记录referer并设置正确的Control-Cache标头,因为我在应用程序前面有一个反向代理。在这种情况下Net :: HTTP + send_data是否合理?
也许整个想法真的很糟糕,因为我现在还不知道的一些原因?我一般认为,将直接的S3链接公开到公共桶是危险的,并且在一些严重的问题中会产生泄漏/热链接......
更新
如果您有任何其他想法可以减少S3账单并防止热链接泄露,请分享,即使它们与Rails没有直接关系。
答案 0 :(得分: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
}
根据您的网络服务器,这可能(杂项)或可能不(webrick)工作,所以如果它不在开发流中,请不要太沮丧。
答案 1 :(得分:4)
使用(专用存储桶私有文件)并使用签名URL存储在S3上的文件。
签名包括到期时间(例如,从现在起10分钟,无论您想要设置什么),以及加密哈希。如果签名无效,或者过期时间已过,S3将拒绝提供文件。
这很有用,因为只有您可以在S3中为私人文件创建有效的URL,并且您可以控制URL保持有效的时长。这可以防止泄露,因为leechers无法签署自己的URL,如果他们获得您签名的URL,该URL将很快过期,之后就无法使用。
答案 2 :(得分:2)
提供临时预先签名的网址:
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。
答案 3 :(得分:1)
我可能会避免这样做 - 至少在我别无选择之前。
如果每次下载图像,您都需要考虑增加带宽费用。此外,通过脚本处理每个图像,您还需要更多的CPU和RAM来完成此操作。不是最好的展望 - 恕我直言。
对于Amazon S3,我可能会enable the access logs并编写一个小工具来分析使用情况并更改存储桶/对象的权限,以防使用情况发生。每10分钟左右运行一次作为cronjob你应该保存吗?
您也可以使用s3stat。他们还提供免费计划。
修改:根据我对Varnish的推荐,我添加了a blog entry about preventing hotlinking using Varnish的链接。