如何在S3存储桶策略中执行OR条件?

时间:2017-02-28 16:41:37

标签: json amazon-web-services amazon-iam

我正在研究S3存储桶策略。我们的想法是明确拒绝访问帐户中的所有IAM用户,但明确授予的用户除外。

我发现了一篇博文,介绍了如何限制对特定用户的访问。它运作良好。但是,我想扩展语法以包括将被允许访问的第二个IAM用户。实际上,这是OR条件。

但是,我对JSON非常陌生,而且我不确定该怎么做。

以下是适用于限制对单个用户的访问的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "AIDA<obfuscated id>:*",
                        "AIDA<obfuscated id>",
                        "111111111111"
                    ]
                }
            }
        }
    ]
}

任何人都可以帮我编辑上面的JSON以允许OR条件,我可以在其中指定允许访问的其他用户ID吗?

AdvThanksance!

2 个答案:

答案 0 :(得分:1)

您不需要创建此拒绝规则,因为除非有明确的允许规则,否则所有请求都是denied by default

要授权多个IAM用户,可以将它们列为数组元素。因此,您可以按如下方式编写存储桶策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowAllS3ActionsForSpecificIAMUsers",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::<account-number-without-hyphens>:user/<username1>",
          "arn:aws:iam::<account-number-without-hyphens>:user/<username2>"
        ]
      },
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::my-bucket", 
        "arn:aws:s3:::my-bucket/*"
      ]
    } 
  ]
}

您可以详细了解Principal元素here

答案 1 :(得分:1)

好的,我想出来了。

首先,我尝试向StringgNotLike添加第二个Condition子句,但这不起作用。

在做了更多的阅读之后,我意识到Condition子句接受多个键/值对。事实上,我在问题中展示的原始政策已经做到了。我只需要为已经存在的数组添加更多值。

有效的政策如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my-private-bucket",
                "arn:aws:s3:::my-private-bucket/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "AIDA<obfuscated-id-1>:*",
                        "AIDA<obfuscated-id-1>",
                        "AIDA<obfuscated-id-2>:*",
                        "AIDA<obfuscated-id-2>",
                        "111111111111"
                    ]
                }
            }
        }
    ]
}

当我意识到密钥已经指定了一个值数组时,我只是将第二个用户ID添加到数组中,它运行得很好。