用于热链接的S3存储桶策略阻止写入

时间:2013-09-24 10:53:29

标签: amazon-s3 railo

我有一个网站,可以从Amazon S3提供我们的内容。目前,我能够从我的网络服务器/网站上很好地读取和写入数据到S3。 ACL权限很好 - 我拥有网站的完全权限,只需阅读公众的权限。

然后,我添加了一个S3 Bucket Policy以防止热链接。您可以在下面看到S3政策。

此策略运行良好 - 除了一个问题 - 它现在阻止来自我的网络服务器的文件写入请求。因此,虽然我的公共网站提供的内容很好,但当我尝试进行文件或目录操作时,例如上传图像或移动图像(或目录),我现在收到“拒绝访问”错误。 (由我的Web应用程序服务器,即Railo / Coldfusion)

我不确定为什么会这样?最初我认为可能是因为我的网络服务器和S3之间的文件读/写请求来自我的IP而不是我的域名。但即使在添加我的IP之后,错误仍然存​​在。

如果我删除该政策,一切正常。

有谁知道是什么导致了这个或我在这里缺少什么?感谢

       {
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "Allowinmydomains",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::cdn.babeswithbraces.com/*",
      "Condition": {
        "StringLike": {
          "aws:Referer": [
            "http://www.babeswithbraces.com/*",
            "http://babeswithbraces.com/*",
            "http://64.244.61.40/*"
          ]
        }
      }
    },
    {
      "Sid": "Givenotaccessifrefererisnomysites",
      "Effect": "Deny",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::cdn.babeswithbraces.com/*",
      "Condition": {
        "StringNotLike": {
          "aws:Referer": [
            "http://www.babeswithbraces.com/*",
            "http://babeswithbraces.com/*",
            "http://64.244.61.40/*"
          ]
        }
      }
    }
  ]
}

1 个答案:

答案 0 :(得分:2)

使用存储桶策略时,拒绝始终会覆盖授权。由于您拒绝从您的存储分区政策中访问与您的特定引荐人列表不匹配的所有帐户(包括经过身份验证的用户)的GetObject,因此您的应用会产生Access denied错误。

默认情况下,S3中的对象将其ACL设置为private。如果您的存储区属于这种情况,则您的存储分区策略中不需要AllowDeny规则。只有Allow条件才能授予匿名用户(与某些特定引用者匹配)访问存储桶中对象的权限。

在上述情况下,您的存储分区策略应如下所示:

{
  "Id": "Policy1380565362112",
  "Statement": [
    {
      "Sid": "Stmt1380565360133",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::cdn.babeswithbraces.com/*",
      "Condition": {
        "StringLike": {
          "aws:Referer": [
            "http://www.babeswithbraces.com/*",
            "http://babeswithbraces.com/*",
            "http://64.244.61.40/*"
          ]
        }
      },
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

如果对象ACL已允许公共访问,您可以删除这些ACL以使对象默认为私有,或者在存储桶策略中包含Deny规则,并修改从应用程序发送到S3的请求以包括预期的引用者标题。目前,您的存储分区策略中无法生成Deny规则,只会影响匿名请求。