我有一个关于在 AWS S3 上编写 IAM 策略的问题,在 Jim Scharf 的这篇不错的文章中,这个问题在这里得到了部分回答:
https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/
以 Jim 的帖子为起点,我试图实现的是防止用户在使用 S3 控制台时甚至知道存在有权访问同一存储桶的其他用户。Jim 的解决方案以及我发现的其他解决方案限制给定用户访问其他用户文件夹中的内容。但是没有一个解决方案可以阻止用户"u"执行我所谓的"部分列表",即甚至不显示其内容不允许"u"的文件夹。
以下帖子也与我的问题非常相似:
如何为多个 IAM 用户设置 S3 策略,以便每个人只能访问其个人存储桶文件夹?
但与此类帖子中的设置不同,我需要类似于一个文件系统结构,该结构在存储桶名称和用户特定文件夹之间有一个"中间"主文件夹(就像 Jim 的帖子一样):
我的桶/主页/用户1
我的桶/主页/用户2
到目前为止,我所做的如下:
- 创建了一个存储桶以及其中的许多"文件夹">
- 创建了许多用户,我已将其分组到一个组中。每个用户在存储桶内都有一个同名的相应文件夹
-
设置我已附加到组的 IAM 策略,如下所示:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowUsersToSeeBucketListInTheConsole", "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] }, { "Sid": "AllowRootAndHomeListingOfMyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}} }, { "Sid": "AllowListingOfUserFolder", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::mybucket"], "Condition":{"StringLike":{"s3:prefix":["home/${aws:username/*"]}} } ] }
我知道上面的Sid "AllowRootAndHomeListingOfMyBucket"在前缀为"home/"时授予"ListBucket"的权限。这实际上允许组中的任何用户"u"列出"主"文件夹中的整个文件夹"f"集,无论"u"是否有权访问"f"的给定元素。我不知道的是,是否有任何巧妙设计的"拒绝"规则会限制甚至列出那些不允许查看其内容"u"的文件夹。
根据鲍勃·金尼(Bob Kinney)的说法,这在2013年是不可能的:
IAM 策略,用于为用户列出 S3 存储桶中的特定文件夹
但是,我不确定在此期间情况是否发生了变化。任何建议将不胜感激。
谢谢。
不,这是不可能的,因为策略允许的不是您可以看到的内容,而是您可以要求看到的内容。 要求 S3 查看对象列表是通过前缀和分隔符完成的。
在后台导航存储桶时,控制台会要求执行以下操作:
-
单击存储桶:列出存储桶的根(前缀为空字符串,并带有分隔符
/
) -- 返回根中的所有常见前缀("文件夹")和根中的所有对象,深度不超过一个/
。 (它没有显示,但是当您使用控制台创建文件夹时,文件夹名称实际上以/
结尾 - 这是控制台将它们显示为文件夹的唯一原因 - 隐藏/
实际上是一个普通的空对象末尾)。 -
点击
home
:在前缀home/
处列出所有带有分隔符/
-- 返回所有常见的前缀和对象home/
最多一个/
-- 所以,这将返回home/david/
、home/emily
、home/genevieve/
、home/james/
等。 -
点击
david
:在前缀home/david/
处列出所有带有分隔符/
...你也许明白了。
请注意这三次单击如何与博客文章中允许的操作相对应 - 列出根目录,列出主页,在主页下列出用户的特定目录。
由于缺少列出其他用户的主目录的权限,您可以看到它们存在,但无法钻取它们。
重申。。。策略控制您可以要求的内容,而不是您可以看到的内容。 为了导航到您自己的主目录,您必须能够列出主目录,否则无法导航到您的主目录。 这就是无法使用控制台完成此操作的根本原因 - 您无法编写任何策略来阻止用户查看允许他们查看的/
分隔层次结构的单个级别中的其他条目,因为权限应用于请求,而不是响应。