Amazon S3策略 - IP地址或HTTP Referer

时间:2014-10-24 11:39:01

标签: amazon-web-services amazon-s3

我想知道是否可以在存储桶策略中组合两个语句来实现以下方案:

  • 允许执行任何操作的特定IP地址 a.b.c.d ;
  • 允许CDN主机 http://cdn.example.com 执行 GetObject 操作以提供内容。

我不确切知道 cdn.example.com 将使用哪些IP地址,因此我不能仅仅依赖IP地址政策。

假设存储桶名为 public ,我尝试了以下策略

{
  "Version": "2012-10-17",
  "Id": "S3PolicyId1",
  "Statement": [
    {
      "Sid": "Allow CDN referrer",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::public/*",
      "Condition": {
        "StringLike": {
          "aws:Referer": "http://cdn.example.com/*"
        }
      }
    },
    {
      "Sid": "Deny everyone except for a.b.c.d",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::public/*",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "a.b.c.d"
        }
      }
    }
  ]
}

这两个陈述的行为与预期一致,但结合后的结果是只有 abcd 能够公开访问存储桶,可能是因为 cdn.example.com IP地址被第二个语句阻止。

此时,我想知道我想要实现的目标是否可行,可能使用不同的陈述,或者根本不可能。

修改

a.b.c.d IP地址不属于cdn.example.com,它是另一个组织的IP地址。

在策略中,我想启用评估HTTP referer OR IP地址的主机。

在重述了这些陈述后,我有以下内容

{
  "Version": "2012-10-17",
  "Id": "S3PolicyId1",
  "Statement": [
    {
      "Sid": "Allow CDN referrer",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::public/*",
      "Condition": {
        "StringLike": {
          "aws:Referer": "http://cdn.example.com/*"
        },
        "IpAddress": {
          "aws:SourceIp": "a.b.c.d"
        }
      }
    }
  ]
}

然而,问题是两个方案StringLikeIpAddress是在 AND 中评估的,而我需要 OR


修改

  

然而,问题是两个方案StringLikeIpAddress是在 AND 中评估的,而我需要 OR

根据文档,使用逻辑AND评估更多条件,而在OR中评估单个条件中的更多选项,并且我找不到实现我想要的方法。

2 个答案:

答案 0 :(得分:1)

要记住的关键是效果的优先顺序是先拒绝,允许第二(默认拒绝最后)。任何拒绝效果都将覆盖允许效果,如果您没有明确允许访问,则默认情况下会拒绝。

您可能想要做的是将您的第二个条件改为允许政策 - 而不是“拒绝”不是来自该IP的所有人,特别是“允许”该IP。

也可以使用复合条件定义您想要的内容(有关详细信息,请参阅documentation),但在此特定情况下,我认为将第二个策略重新定义为允许将最有效。

答案 1 :(得分:1)

您可以使用2个单独的允许条件作为 OR 条件

 {
      "Version": "2012-10-17",
      "Id": "S3PolicyId1",
      "Statement": [
        {
          "Sid": "Allow CDN referrer Http",
          "Effect": "Allow",
          "Principal": "*",
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::public/*",
          "Condition": {
            "StringLike": {
              "aws:Referer": "http://cdn.example.com/*"
            }
          }
        },
        {
          "Sid": "Allow CDN referrer IP",
          "Effect": "Allow",
          "Principal": "*",
          "Action": "s3:GetObject",
          "Resource": "arn:aws:s3:::public/*",
          "Condition": {
            "IpAddress": {
              "aws:SourceIp": "a.b.c.d"
            }
          }
        }
      ]
    }