我的Amazon S3存储桶策略有问题吗?

时间:2012-01-27 00:41:39

标签: amazon-s3 hotlinking

我正在尝试阻止来自特定域的Cloudfront文件的热链接。通过在线示例和亚马逊自己的策略生成器的组合,我得出了这个:

{
  "Version": "2008-10-17",
  "Id": "http referer policy",
  "Statement": [{
    "Sid": "Block image requests",
    "Action": "s3:GetObject",
    "Effect": "Deny",
    "Resource": "arn:aws:s3:::mybucket/subdir/*",
    "Condition": {
      "StringLike": {
        "aws:Referer": [
          "http://example.com/*"
        ]
      }
    },
    "Principal": {
      "AWS": "*"
    }
  }]
}

我在mybucket的子目录中发送了一个文件的无效请求,然后几分钟后尝试重新加载图像,同时仍然发送了引用标头(使用Chrome的开发工具验证)。使用Ctrl + F5进行了硬重新加载,响应头包含“X-Cache:来自云端的小姐”,因此它肯定会获得最新版本的图像。

但是图像仍然显示正常并且没有被阻止。策略生成器没有“aws:Referer”键的选项,但它位于Amazon docs here。我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

更新2

重新审视您的政策我想知道您是如何实际允许CloudFront首先访问您的对象的?您是否偶然遵循了例如公共建议。 Start Using CloudFront with Amazon S3 您必须确保将对象权限设置为让所有内容公开,以用于Amazon S3存储桶中的每个对象。

在这种情况下,由于可用的三种不同的S3访问控制机制之间的相互作用,您可能偶然发现了相关的陷阱,这可能相当混乱。例如,这可以解决在Using ACLs and Bucket Policies Together中:

  

当您将ACL和存储桶策略分配给存储桶时,Amazon S3   评估现有的Amazon S3 ACL以及存储桶策略   确定帐户对Amazon S3的访问权限时   资源。如果帐户可以访问ACL或策略的资源   指定,他们能够访问所请求的资源。

因此,您需要将ACL迁移到存储桶策略(即在拒绝通过 aws:referer 之前允许CloudFront访问)并在此后删除过于宽泛的ACL。

祝你好运!


更新1

好的,现在有了客户端缓存方式,我担心这会非常简单(在AWS论坛中搜索aws:referer时很明显),因此可能需要几次迭代(特别是考虑到你已经自己研究了这个话题:

  • 遇到的最常见问题是leading whitespace error in the AWS documentation(这特别令人烦恼,因为简单的文档修复可以代表用户和AWS支持人员来弥补大量的浪费时间)
    • 您的政策没有出现此问题,但是,如果您清理了真实的域名,那么您可能已经替换了生产代码中的错误了吗?
  • 同样重要的是要意识到HTTP referer标题不一定可用,请参阅例如Referer Hiding(因此,您的政策无论如何都不会阻止恶意访问,尽管这显然不是问题)
    • 您已经说过,您已经验证它是通过Chrome开发者工具发送的,所以这也不适用(我提到它是为了强调降低的安全级别)。

该政策乍看起来很不错 - 在进一步深入此方向之前,我建议您确保成功绕过Chrome的缓存,notoriously less straight forward比其他浏览器习惯的那样;特别是,Ctrl + F5 只是重新加载页面,但不 Bypass the cache (至少不可靠)!

如同在那里记录的那样,您可以使用其他一个组合键重新加载页面并绕过缓存(包括第一个重新加载后的第二个Ctrl + F5混乱),但是,我建议改为提供以下两种选择之一:

  • Chrome的开发者工具为没有缓存的浏览提供专门支持 - 工具箱面板的右下角是设置的齿轮图标,单击此按钮会触发带有选项面板的叠加层,其中您将找到选项< em>禁用缓存在网络
  • 部分下
  • Chrome Incognito mode Ctrl + Shift + N让Google Chrome无法存储您访问过的网站的信息,截至今天(当然可能随时更改)似乎包括缓存的内容,cookie,DNS等等,因此现在是一个更快,但不太明确的选项。