如何使用 IAM 策略向特定用户授予对特定文件夹的访问权限?

上次更新时间:2020 年 8 月 20 日

我想使用 IAM 用户策略来限制对 Amazon S3 存储桶中特定文件夹的访问。

简短描述

您可以使用 AWS Identity and Access Management (IAM) 用户策略来控制对 Amazon Simple Storage Service (Amazon S3) 存储桶中特定文件夹拥有访问权限的用户。

解决方法

单用户策略 - 此示例策略允许某特定 IAM 用户查看存储桶第一级中的特定文件夹,然后对所需文件夹和子文件夹中的对象执行操作。此示例采用以下结构来使用名为 David 的 IAM 用户和名为 my-company 的存储桶:

/home/Adele/ /home/Bob/ /home/David/ /restricted/ /root-file.txt

{
 "Version":"2012-10-17",
 "Statement": [
   {
     "Sid": "AllowUserToSeeBucketListInTheConsole",
     "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::*"]
   },
  {
     "Sid": "AllowRootAndHomeListingOfCompanyBucket",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}}
    },
   {
     "Sid": "AllowListingOfUserFolder",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringLike":{"s3:prefix":["home/David/*"]}}
   },
   {
     "Sid": "AllowAllS3ActionsInUserFolder",
     "Effect": "Allow",
     "Action": ["s3:*"],
     "Resource": ["arn:aws:s3:::my-company/home/David/*"]
   }
 ]
}

Amazon S3 控制台使用斜杠 (/) 作为特殊字符来显示文件夹中的对象。前缀 (s3:prefix) 和分隔符 (s3:delimiter) 可帮助您组织和浏览文件夹中的对象。

多用户策略 - 在某些情况下,您在编写策略时可能不知道资源的精确名称。例如,您可能想要允许每位用户在 Amazon S3 存储桶中都拥有自己的对象,如上例所示。但是,您不想为每个用户创建单独的策略,指定用户名称作为资源的一部分,而是可以创建一个适用于组中所有用户的群组策略。

您可以通过使用策略变量实现这一点,从而允许您在策略中指定占位符。评估策略后,策略变量将替换为来自请求本身的值。

该示例展示了使用策略变量 ${aws:username} 的 Amazon S3 存储桶的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserToSeeBucketListInTheConsole",
            "Action": [
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "AllowRootAndHomeListingOfCompanyBucket",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-company"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "",
                        "home/"
                    ],
                    "s3:delimiter": [
                        "/"
                    ]
                }
            }
        },
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-company"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "home/${aws:username}/*"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-company/home/${aws:username}/*"
            ]
        }
    ]
}

注意:只有 StringLike 会将星号 (*) 识别为通配符。StringEquals 则不会。有关更多信息,请参阅字符串条件运算符。