如何使在Amazon S3上托管的图像不那么公开但不完全私有?

Jay*_*dse 15 ruby acl private heroku amazon-s3

我启动了一个使用Amazon S3进行图像托管的示例应用程序.我设法哄它上班.该应用程序在github.com上托管.该应用程序允许您使用个人资料照片创建用户.上传照片时,Web应用程序将其存储在Amazon S3而不是本地文件系统上.(如果你在heroku.com上主持,非常重要)

但是,当我在页面的浏览器中执行"查看源"时,我注意到图片的URL是我分配给应用程序的S3存储桶中的Amazon S3 URL.我剪切并粘贴了URL,并且能够在同一浏览器中查看图片,并且在另一个浏览器中,我没有打开会话到我的网络应用程序或亚马逊S3.

有没有什么方法可以限制对该URL(和图像)的访问,以便只有登录到我的应用程序的浏览器才能访问它?

我发现的有关亚马逊ACL的大多数信息仅涉及只有所有者或通过亚马逊或AmazonS3认证的用户组或匿名访问者的访问权限.

编辑----更新2010年7月7日

亚马逊刚刚宣布了更多限制访问S3对象和存储桶的方法.除了其他方法之外,您现在可以通过限定HTTP引用来限制对S3对象的访问.这看起来很有趣......我不能等到他们更新他们的开发者文档.

dav*_*nal 9

对于隐私实际上重要的文件,我们按如下方式处理:

  • 文件与私有ACL一起存储,这意味着只有授权代理才能下载(或上载)它们
  • 要访问文件,我们链接到http://myapp.com/download/{s3-path},download对应于控制器(在MVC意义上)
  • ACL是在适当时实现的,以便只有登录用户才能访问该控制器/操作
  • 该控制器使用API​​下载文件,然后使用正确的mime类型,缓存标头,文件大小等将其流式传输给用户.

使用此方法,您最终会使用比您需要的更多带宽,但您仍然可以节省存储空间.对我们来说,这是有效的,因为我们倾向于以比带宽更快的速度耗尽存储空间.

对于隐私只是重要的文件,我们生成一个随机哈希,我们用于URL.这基本上是通过默默无闻的安全性,你必须要小心你的哈希很难猜测.

但是,当我在页面的浏览器中执行"查看源"时,我注意到图片的URL是我分配给应用程序的S3存储桶中的Amazon S3 URL.我剪切并粘贴了URL,并且能够在同一浏览器中查看图片,并且在另一个浏览器中,我没有打开会话到我的网络应用程序或亚马逊S3.

请记住,这与存储在文档根目录中其他位置的任何图像没有什么不同.您可能需要也可能不需要您正在寻找的那种安全性.


小智 6

亚马逊的Ruby SDK(https://github.com/aws/aws-sdk-ruby)提供了有用的方法,可以轻松完成."url_for"可以为其他私有S3对象生成临时可读URL.

以下是如何创建一个在5分钟后过期的可读URL:

object = AWS :: S3.new.buckets ['BUCKET'].objects ['KEY']

object.url_for(:read,:expires => 300).to_s

AWS文档: http ://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html#url_for-instance_method


yfe*_*lum 4

S3 是一项单独的服务,不知道您的会话。

通用解决方案是认识到为每个资产分配一个单独的、唯一的、非常长且随机的密钥(构成该资产的 URL 的一部分)的好处和安全属性。如果您愿意,您甚至可以分配一个具有 512 个有效随机位的密钥,并且该 URL 将在很长一段时间内保持不可猜测的状态。

  • 由于当时t有权访问资产的人可以简单地复制该资产以供将来参考,因此允许该人随时了解 URL 并访问该资产是有意义的。
  • 同样,由于该人可以简单地下载资产并将其分发给其他人,因此允许该人将 URL 分发给其他人是有意义的,否则他只会将资产本身分发给其他人。
  • 由于所有此类访问都是只读的,并且写入仅限于网站服务器,因此不存在任何拥有此访问权限的人恶意“黑客攻击”的风险。

您必须确定这是否足够安全。如果不是,那么 S3 可能不适合您,也许您需要将图像作为二进制列存储在数据库中并将它们缓存在 memcached 中,您可以在 Heroku 上执行此操作。

  • 逻辑点+11。为资源的每次更新生成新的随机 URL 也很重要。 (2认同)