【问题标题】:AWS IAM Policy To Restrict S3 Access (Prefix) Based On IAM User's Tag基于 IAM 用户标签限制 S3 访问(前缀)的 AWS IAM 策略
【发布时间】:2019-07-07 21:45:42
【问题描述】:

各种 IAM 用户正在共享对 S3 存储桶的访问权限。 S3 存储桶具有按用户分隔的内容,因此每个用户都有他们可以访问的唯一区域。

例如:

  • S3 存储桶:example-bucket
  • IAM 用户:UserOne。该用户被标记为sampleTag=u11111
  • IAM 用户:UserTwo。该用户被标记为sampleTag=u22222
  • 更多标记的 IAM 用户。

我想编写这样的 IAM 政策:

  • UserOne 有权读取和写入 s3://example-bucket/u11111/* 的内容并从 s3://example-bucket/config/u11111/ 读取内容
  • UserTwo 可以对s3://example-bucket/u22222/* 的内容进行读+写,并从s3://example-bucket/config/u22222/ 中读取内容
  • 等等……

请注意,S3 键在路径中包含 sampleTag 的值。

我希望能够将此单一策略应用于整个 IAM 用户组,而无需为每个用户添加单独的策略。

由于${aws:PrincipalTag/sampleTag} 我认为这会在资源字符串中的该位置注入标签值,因此我希望这是可能的。但是在玩了策略模拟器之后,它似乎并没有做到这一点。

当前政策如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket",
                "arn:aws:s3:::example-bucket-test"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket",
                "arn:aws:s3:::example-bucket-test"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "",
                        "${aws:PrincipalTag/sampleTag}/"
                    ],
                    "s3:delimiter": ["/"]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket",
                "arn:aws:s3:::example-bucket-test"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": ["${aws:PrincipalTag/sampleTag}/*"]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/config/${aws:PrincipalTag/sampleTag}/*",
                "arn:aws:s3:::example-bucket-test/config/${aws:PrincipalTag/sampleTag}/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/${aws:PrincipalTag/sampleTag}/*",
                "arn:aws:s3:::example-bucket-test/${aws:PrincipalTag/sampleTag}/*"
            ]
        }
    ]
}

我认为最后两个策略不起作用。我找不到文档来说明是否可以将变量嵌入到 Resource 字符串中,但 s3:prefix 似乎不适用于 GetObjectPutObject 操作——所以我不确定如何限制这些权限的范围。

任何关于错误或如何完成此任务的想法都将不胜感激!

【问题讨论】:

  • 您应该考虑使用用户名 (${aws:username}),而不是标签。见aws.amazon.com/premiumsupport/knowledge-center/…
  • docs.aws.amazon.com/IAM/latest/UserGuide/… 确认应该可以在Resource 字符串中使用 IAM 用户标签。很难调试,因为策略模拟器 (policysim.aws.amazon.com) 只是说没有规则匹配(默认拒绝)而不是解释评估过程。 --- 我不能像上面建议的那样使用用户名,这是针对以这种方式构造的现有数据,不能重新排列到与用户名匹配的目录中。
  • 我不相信你可以在Resource 中使用PrincipalTag。您可以在Condition 声明中。
  • 你绝对可以在Resource字符串中使用aws:PrincipalTag/*。正如我上面提到的,它位于该链接的官方文档(Condition Element 之前的最后一项)部分。我实际上很确定我发布的政策可以正常工作。我目前正在参与测试,但所有迹象都表明 IAM 策略模拟器刚刚损坏/不支持它,因为经过身份验证的用户在模拟器之外采取的相同操作是允许而不是拒绝的。

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


【解决方案1】:

你是对的,最后两个策略不起作用。

根据documentation aws:PrincipalTag/tag-key string operators一起使用,因此aws:PrincipalTag/tag-key 的使用将仅在Condition 策略元素内有效。

另外,s3:prefix 条件键仅适用于 ListBucketListBucketVersions 操作:https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazons3.html#amazons3-policy-keys

【讨论】:

    【解决方案2】:

    我认为可以在策略的 Ressource 属性中使用 ${aws:PrincipalTag}。只需查看 IAM 的docs。该示例使用 PrincipalTag 作为 Ressource 值的最后一部分。

    (只需使用 Strg + F 并在文档网站上输入 PrincipalTag 即可找到示例)

    【讨论】:

      【解决方案3】:

      您可以将 PrincipalTag 作为资源的一部分。 这行得通。

          {
              "Sid": "FullPermissionOnlyForPrefix",
              "Effect": "Allow",
              "Action": "s3:*",
              "Resource": [
                  "arn:aws:s3:::mybucket/${aws:PrincipalTag/team}*",
                  "arn:aws:s3:::mybucket/${aws:PrincipalTag/team}/*"
              ]
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-24
        • 2021-05-09
        • 1970-01-01
        • 2016-01-17
        • 1970-01-01
        • 2014-04-23
        • 2012-05-18
        • 2014-10-31
        相关资源
        最近更新 更多