1

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

然后,我添加了一个 S3 存储桶策略来防止盗链。您可以在下面查看 S3 策略。

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

我不确定为什么会这样?最初我认为这可能是因为我的 Web 服务器和 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/*"
          ]
        }
      }
    }
  ]
}
4

1 回答 1

2

当您使用存储桶策略时,拒绝总是会覆盖授权。因为您拒绝GetObject从您的存储桶策略访问与您的特定引荐来源列表不匹配的所有账户(包括经过身份验证的用户),所以您的应用程序会产生Access denied错误。

默认情况下,S3 中的对象将其 ACL 设置为私有。如果您的存储桶属于这种情况,则无需在您的存储桶策略中添加Allow和规则。有一个条件来授予与某些特定引用者匹配的匿名用户访问存储桶中对象的权限Deny就足够了。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在您的存储桶策略中设置仅影响匿名请求的规则。

于 2013-09-30T18:31:05.787 回答