这个问题有点啰嗦,但这正是我想做的。这个问题与我在这里遇到的一个现有(当前未解决的(问题有关。我相信理解这个概念是回答我现有问题的关键,但足够独特,足以保证一个全新的问题。
在名为"my-permtest"的 S3 存储桶中给定这些键:
/1/
/1/a
/1/2/b
/1/3/c
如何正确使用前缀和分隔符来获取不以"/"结尾的对象(IE:"文件"(。
最终目标是将此知识应用于 IAM 组策略,在/1/a 上授予 ListBucket 和 getObject,同时拒绝 getObject 或 ListBucket 到
/1/2/、1/2/*、1/3 和 1/3/*我实际上是在模仿传统的文件系统权限,允许用户访问"文件夹"中的所有"文件",但限制对"子文件夹"的访问。
目前,我正在使用 s3api 调用以及前缀和分隔符选项的不同值来感受这些东西的用法。我一直在阅读和练习这些资源,但进展缓慢,帮助将不胜感激。
一旦了解文件夹本身不存在,这实际上非常简单。 S3 对象是键/值对。 键是"文件名",它表示包含"/"字符的完整路径。 键的值是实际的文件内容。 因此,键为 s3://my-bucket/1/2/a 的 S3 对象不是名为 1 的子文件夹中名为 2 的文件。 它是一个带有看起来像完整路径的键的对象。
了解这一点,并应用理解 * 通配符可用于在编写策略时匹配应用或拒绝语句中的键名称可以有效地回答问题。此外,为特定操作包含严格作用域的对象或存储桶允许/拒绝语句也很重要。
因此,基本上要允许获取/放置访问/1/2"文件夹"而不是 1/2/a"文件",您需要允许对 s3://bucket/1/2执行列表操作,并允许对 s3://bucket/1/2/* 执行对象获取/放置操作。 请注意,关键是要了解将 s3 对象操作和 s3 存储桶列表操作分离到策略中的不同语句的重要性。
如果要拒绝对 s3://bucket/1/2/3/* 的访问,则需要向同一策略添加 2 个语句。第一个拒绝列表对 s3://bucekt/1/2/3 的访问,第二个拒绝 get/put 对象对 s3://bucket/1/2/3* 的访问。
现在,如果您想允许某些人访问 s3://bucket/1/2/3/a,如果您尝试使用此策略,您将处于绑定状态,因为 s3://1/2/3/* 已被明确拒绝。由于显式拒绝,任何授予访问权限的策略都将被忽略。唯一的选择是拥有两个几乎相同的策略。一个包含原始允许 s3://bucket/1/2/3/* 和另一个包含原始内容以及拒绝对 s3://bucket/1/2/3/的列表访问和对象获取/放置访问 s3://bucket/1/2/3/* 。 无法访问 s3://bucket/1/2/3/* 的人将属于明确拒绝的组,而有权访问的人将属于第一个只有允许权限的组。
当有许多"子文件夹"具有不同的组可以访问每个子文件夹时,这种情况很快就会失控。每次创建新的嵌套"子文件夹"时更新策略是一种站不住脚的范例。因此,在使用基于 IAM 组策略的方法保护 s3 资源时,您应注意以不必执行此类维护的方式组织存储桶中的数据。
有关我的意思的详细信息,请参阅我的相关答案,但基本上避免创建具有任意限制谁可以访问/无法访问它们的子文件夹。你很难说"joe 可以访问 1/3/5 和 1/3/7,但不能访问 1/2/4 或 1/2/6。在/odd/下移动/1//3/和/5/并在/even/下移动/2//4/和/6/要容易得多,然后只需允许他访问/odd/* 即可。您甚至不必为/even/指定 deny 因为它是隐式的。