拒绝用户代理访问 AWS S3 中的存储桶



在我的 S3 日志中,我看到来自 NSPlayer 的多个请求,所有请求如下所示:

[29/Feb/2016:23:07:27 +0000] 188.71.221.62 - 07231C9924A44C67 休息。获取。对象 16639/tracks/7ed00e05502aeb383d8a1abde2.mp3

"GET/bucket/16639/tracks/7ed00e05502aeb383d8a1abde2.mp3 HTTP/1.1" 200 - 4122705 5639543 6305 58

"http://m.xxxxxxw.com/" "NSPlayer/12.00.9651.0000 WMFSDK/12.00.9651.0000" -

我想拒绝对此用户代理的访问,并且我已经编写了存储桶策略以及用户策略来拒绝访问。但是,访问仍然没有被拒绝。你能帮我弄清楚为什么会这样吗?

以下是存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmtxxxxxxxxx0",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxx3:user/bucket"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::bucket/*",
            "Condition": {
                "StringNotLike": {
                    "aws:UserAgent": "NSPlayer"
                }
            }
        }
    ]
}

请让我知道如何解决这个问题!

这是我

从亚马逊得到的回复:

您几乎在存储桶上拥有正确的策略来阻止来自该用户代理的访问。棘手的部分是您允许通过公共读取 ACL 访问单个对象,因此您不能在存储桶上使用限制性的"Allow"语句。您需要显式拒绝该用户代理执行 GET 请求。

例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::bucket/*",
      "Condition": {
        "StringLike": {
          "aws:UserAgent": "*NSPlayer*"
        }
      }
    }
  ]
}

上述策略将阻止从任何位置对存储桶的任何访问,如果 NSPlayer 位于用户代理字符串中。

同样仅供参考,存储桶策略优先于用户策略。