AWS S3 IAM根据标记

时间:2017-05-31 14:48:35

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

我正在尝试授予一组用户访问具有特定标记的所有s3-buckets,但不能访问所有其他用户。 我拼凑在一起的政策看起来像这样:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowListAll",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "AllowAllIfGroup",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Condition: : {
                "StringEquals" : {
                        "s3.ResourceTag/allow-group": "s3-access-group"
                }
            },
            "Resource": [
                "arn:aws:s3:::*",
                "arn:aws:s3:::*/*"
            ]
        }
    ] 
}

我无法让它工作我已经尝试模拟ListBucket和ListAllMyBuckets的策略对着标记的Bucket的arn,ListAllMyBuckets工作,ListBucket失败。

如果我将此政策改编为ec2(如'如果标签匹配,则'授予开始/停止/终止实例'),它就像魅力一样。

这是否可行或S3不允许以这种方式匹配存储桶?

(进一步说明:我的存储桶有标签“allow-group”和“AllowGroup”设置,我不确定短划线是否有问题)

3 个答案:

答案 0 :(得分:2)

S3不支持基于存储桶标签(ResourceTag)的条件键,而仅基于对象标签。

在此处查看支持的条件键的完整列表(向下滚动至“ Amazon S3的条件键”): https://docs.aws.amazon.com/IAM/latest/UserGuide/list_amazons3.html#amazons3-policy-keys

这就是为什么它不起作用。

答案 1 :(得分:1)

我做了一些实验,也无法获得你想要的结果。

首先,对S3 ResourceTag的在线参考很少见,但AWS re:Invent 2016: AWS S3 Deep-Dive Hands-On Workshop给出了一个例子:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::EXAMPLE-BUCKET-NAME/*",
            "Condition": {
                "StringEquals": {
                    "S3:ResourceTag/HIPAA": "True"
                }
            }
        }
    ]
}

请注意,它使用S3:ResourceTag而不是S3.ResourceTag

我尝试对存储桶标记对象标记使用此逻辑,但未能成功运行。我怀疑ResourceTag是指对象级标记而不是桶级标记,但无法证明这一点,因为它无法在两种情况下都能正常工作。

我使用了这样的政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceTag/AllowGroup": "s3-access-group"
                }
            }
        }
    ]
}

但是,即使存储桶和对象都有适当的标记,它也不会让我访问对象。

答案 2 :(得分:1)

AWS 文档在此处提供了所有支持与 AWS IAM 和资源标记配合使用的服务的参考 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html

目前,仅支持 S3 中的对象级标记:

¹ Amazon S3 supports tag-based authorization for only object resources.

² Amazon S3 supports service-linked roles for Amazon S3 Storage Lens.

深入研究文档,在撰写本文时似乎不支持对象上的 PUT 和 DELETE 操作:https://docs.aws.amazon.com/AmazonS3/latest/userguide/tagging-and-policies.html