使用aws s3前缀和分隔符来区分具有公共前缀的“文件夹”和“文件”

时间:2016-02-03 15:32:12

标签: amazon-s3 delimiter prefix amazon-iam

问题有点罗嗦,但这正是我想要做的。 这个问题与我现有的(目前公开的)问题有关here。我相信理解这个概念是回答我现有问题的关键,但足以保证一个全新的问题。

在名为“my-permtest”的s3存储桶中给出这些键:

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

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

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

我实际上希望模仿传统的文件系统权限,让用户访问“文件夹”中的所有“文件”,但限制访问“子文件夹”。

目前,我正在使用s3api调用以及不同的前缀和分隔符选项值来感受这些内容的使用。我一直在阅读和练习这些资源,但进展缓慢,非常感谢协助。

1 个答案:

答案 0 :(得分:3)

一旦了解文件夹本身不存在,这实际上非常简单。 s3对象是键/值对。关键是"文件名"表示包含" /"的完整路径;字符。密钥的值是实际的文件内容。所以带有键s3:// my-bucket / 1/2 / a的s3对象不是名为2的子文件夹中名为a的文件。它是一个带有看似完整路径的键的对象。

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

所以,基本上允许获取/放置访问/ 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://桶/ 1/2/3 / *。无法访问s3:// bucket / 1/2/3 / *的人将在具有显式拒绝的组中,并且具有访问权限的人将位于具有allow的第一个组中。

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

有关我的意思的详细信息,请参阅我的相关答案here,但基本上避免创建具有任意限制的子文件夹,谁可以/无法访问它们。你会很难说"乔可以访问1/3/5和1/3/7而不是1/2/4或1/2/6。移动/ 1 / / 3 /和/ 5 / under / odd /以及/ 2 / / 4 /和/ 6 / under / even /然后只允许他访问/ odd / * 。你甚至不必指定deny to / even /因为它是隐含的。