我如何向用户授予对我的 Amazon S3 桶中的特定文件夹的访问权限?
我想限制 AWS Identity and Access Management(IAM)用户仅访问 Amazon Simple Storage Service(Amazon S3)中的特定文件夹。
解决方案
如果用户和桶属于同一 AWS 账户,使用 IAM policy 向用户授予对桶文件夹的访问权限。如果 IAM policy 授予访问权限,则您无需更新桶策略。
注意: 如果 Amazon S3 桶策略明确拒绝 IAM 用户访问文件夹,您必须更新桶策略。
如果 IAM 用户和 S3 桶属于不同 AWS 账户,请同时在 IAM policy 和桶策略中授予访问权限。有关详细信息,请参阅如何向另一个 AWS 账户中的用户授予将对象上传到我的 Amazon S3 存储桶的权限?
单用户策略
以下示例 IAM policy 仅向名为 David 的用户授予对其文件夹(/home/David)的完全访问权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowStatement1", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowStatement2A", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringEquals": { "s3:prefix": [ "", "home/", "home/David" ], "s3:delimiter": [ "/" ] } } }, { "Sid": "AllowStatement3", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringLike": { "s3:prefix": [ "home/David/*" ] } } }, { "Sid": "AllowStatement4A", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/David/*" ] } ] }
此策略包括以下语句:
- **AllowStatement1:**允许用户列出属于其 AWS 账户的桶。此权限允许用户在控制台中导航到桶。
- **AllowStatement2A:**允许用户列出 DOC-EXAMPLE-BUCKET 中的文件夹。此权限允许用户在控制台中导航到文件夹。
- **AllowStatement3:**允许用户列出 DOC-EXAMPLE-BUCKET/home/David 文件夹中的内容。
- **AllowStatement4A:**仅允许在 DOC-EXAMPLE-BUCKET/home/David 文件夹内执行所有操作,如读取、写入和删除权限。
多用户策略
在某些情况下,您在编写策略时不知道资源的确切名称。例如,假设您希望允许每个用户在 Amazon S3 桶中有自己的对象。这时可以使用策略变量来创建适用于多个用户的组策略,而不是为每个用户创建单独的策略。策略变量让您能够在策略中指定占位符。当您向 AWS 发出请求时,请求中的值会在策略完成评估时替换占位符。
以下示例显示了使用策略变量 ${aws:username} 的 Amazon S3 桶的策略:
**注意:**本文使用 aws:username 键,返回用户的易记名称,如“Adele”或“David”。 此值从您在创建 IAM 用户时提供的用户名获取。在某些情况下,最好使用相应的全局唯一值。例如,当您使用 IAM 角色时,aws:username 值可能对该 IAM 实体无效。有关详细信息,请参阅主体键值。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowRootAndHomeListingOfCompanyBucket", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringEquals": { "s3:prefix": [ "", "home/" ], "s3:delimiter": [ "/" ] } } }, { "Sid": "AllowListingOfUserFolder", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringLike": { "s3:prefix": [ "home/${aws:username}/*", "home/${aws:username}" ] } } }, { "Sid": "AllowAllS3ActionsInUserFolder", "Action": [ "s3:*" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/${aws:username}/*" ] } ] }
在本策略中,当用户向 AWS 发出请求时,请求者的名字将替换变量。例如,当 David 发出请求时,${aws:username} 会解析为 David。
**注意:**IAM 用户可以在父级列出所有前缀,如 DOC-EXAMPLE-BUCKET/。用户可以在任何图形用户界面(GUI)客户端导航到主目录。如果您未在父级提供列表操作,则必须使用命令行界面直接访问特定文件夹。
根据 IAM Identity Center 用户主体限制访问权限
您可以基于 AWS IAM Identity Center(AWS 单点登录的继任者)用户主体控制对 S3 桶文件夹的访问权限。IAM Identity Center 目录中的每个用户都有一个唯一的用户 ID。对于要限制文件夹访问权限的每个用户,请使用策略变量 ${identitystore:UserId}。**注意:**创建 S3 文件夹时,请确保文件夹名称与 IAM Identity Center 目录中的用户 ID 相对应。
例如,假设 IAM Identity Center 目录中有一个用户(“John”),其对应的唯一用户 ID 为 1111111111-2a2aaa222-bb33-4444-5555-5cc5555c555c。要管理此用户,请在 S3 桶中为 John 创建一个同名文件夹:/home/1111111111-2a2aaa222-bb33-4444-5555-5cc5555c555c。要查找用户的用户 ID,请在 IAM Identity Center 控制台中导航到每个用户,或者使用 DescribeUser API。在以下示例中,IAM policy 使用了 ${identitystore:UserId} 变量:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGroupToSeeBucketListInTheConsole", "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::*" ] }, { "Sid": "AllowRootAndHomeListingOfCompanyBucket", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringEquals": { "s3:prefix": [ "", "home/" ], "s3:delimiter": [ "/" ] } } }, { "Sid": "AllowListingOfUserFolder", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET" ], "Condition": { "StringLike": { "s3:prefix": [ "home/${identitystore:UserId}/*", "home/${identitystore:UserId}" ] } } }, { "Sid": "AllowAllS3ActionsInUserFolder", "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/home/${identitystore:UserId}/*" ] } ] }
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前