使用 aws s3 前缀和定界符区分具有共同前缀的 "folders" 和 "files"

Using aws s3 prefix and delimiter to differentiate between "folders" and "files" with a common prefix

这个问题有点罗嗦,但这正是我想要做的。 该问题与我现有的(当前未解决的)问题有关 。我相信理解这个概念是回答我现有问题的关键,但又足够独特以保证提出一个全新的问题。

在名为 "my-permtest" 的 s3 存储桶中给出这些密钥:

/1/  
/1/a  
/1/2/b  
/1/3/c  

如何正确使用前缀和分隔符来获取不以“/”结尾的对象(IE:"files")。

最终目标是将此知识应用于 IAM 组策略,在 /1/a 上授予 ListBucket 和 getObject,同时拒绝将 getObject 或 ListBucket 授予 /1/2/、1/2/*、1/3 和 1 /3/*

我正在有效地模仿传统的文件系统权限,让用户访问 "folder" 中的所有 "files" 但限制对 "subfolders" 的访问。

目前,我正在使用 s3api 调用以及前缀和定界符选项的不同值来感受这些东西的用法。我一直在阅读和练习这些资源,但进展缓慢,将不胜感激。

一旦了解到文件夹本身不存在,这实际上就非常简单了。 s3 个对象是 key/value 对。关键是 "filename" 代表包含“/”字符的完整路径。键的值是实际的文件内容。因此具有键 s3://my-bucket/1/2/a 的 s3 对象不是 1 的子文件夹中名为 2 的名为 a 的文件。它是一个具有看起来像完整路径的键的对象。

了解这一点,并应用对 * 通配符可用于在编写策略时匹配应用或拒绝语句中的键名称的理解,可以有效地回答这个问题。此外,为特定操作包含严格限定范围的对象或存储桶 allow/deny 语句也很重要。

因此,基本上要允许 get/put 访问 /1/2 "folder" 但不允许访问 1/2/a "file",您需要允许对 s3 执行列表操作://bucket/1/2 并允许对象 get/put 在 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/ 和对象 get/put 访问s3://bucket/1/2/3/*。无法访问 s3://bucket/1/2/3/* 的人将在具有显式拒绝的组中,而具有访问权限的人将在第一个具有允许权限的组中。

当有许多 "subfolders" 并且不同的组可以访问每个时,这很快就会失控。每次创建新的嵌套 "subfolder" 时更新策略是一种站不住脚的范例。出于这个原因,在使用基于 IAM 组策略的方法来保护 s3 资源时,您应该注意以不必进行此类维护的方式组织存储桶中的数据。

请参阅我的相关回答 了解我的意思的详细信息,但基本上要避免创建具有任意限制 can/can 不能访问它们的子文件夹。您将很难说“joe 可以访问 1/3/5 和 1/3/7 但不能访问 1/2/4 或 1/2/6。移动 /1/ /3 容易得多/ 和 /5/ 到 /odd/ 下,将 /2/ /4/ 和 /6/ 移到 /even/ 下,然后只需授予允许他访问 /odd/*。你甚至不必指定拒绝 /even/因为它是隐式的。