AWS IAM策略,用于基于IAM用户标签限制S3访问(前缀)

时间:2019-02-13 22:54:19

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

各种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操作-因此,我不确定如何进一步限制这些权限的范围。

任何关于错在哪里或如何实现的想法都将受到赞赏!

2 个答案:

答案 0 :(得分:0)

您是对的,后两项政策无效。

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

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

答案 1 :(得分:0)

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

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