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



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

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

我认为可以在策略的ressource属性中使用$ {aws:principaltag}。只需查看IAM的文档即可。该示例使用princtalTag作为ressource值的最后一部分。

(只需在文档网站上使用strg f并键入principaltag,您找到了示例)

您是对的,最后两个策略将行不通。

根据文档aws:PrincipalTag/tag-key 与字符串操作员一起使用,因此aws:PrincipalTag/tag-key的用法仅在Condition策略元素中使用。

另外,s3:prefix条件密钥仅适用于ListBucket&ListBucketVersions操作:https://docs.aws.amazon.com/iam/latest/userguide/list_amazons3.html#amazons3-policy-keys

您可以将主塔作为资源的一部分。这有效。

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

相关内容

  • 没有找到相关文章

最新更新