2016-02-03 45 views
0

这个问题有点罗嗦,但这正是我期待做的。 这个问题是相对于我有here的现有(当前打开)问题。我相信理解这个概念对于回答我现有的问题是关键的,但是有足够的独特性来保证一个全新的问题。使用aws s3前缀和分隔符来区分具有公共前缀的“文件夹”和“文件”

在名为“我的-permtest”一个S3桶给了这些键:

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

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

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

我正在有效地寻找模仿传统文件系统权限,让用户访问“文件夹”中的所有“文件”,但限制访问“子文件夹”。

目前,我正在使用s3api调用和不同的前缀和分隔符值来获得这些东西的使用感受。我一直在阅读和练习这些资源,但进展缓慢,不胜感激。

+0

我没有发布超过2个链接的代表,但想列出我目前使用的文档和参考: [示例策略](http://docs.aws。 amazon.com/3/latest/dev/example-policies-s3.html) [Prefix/Delimiter docs](http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html) [ API Doc](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) –

回答

1

一旦理解文件夹本身不存在,这实际上很简单。 s3对象是键/值对。关键是表示包含“/”字符的完整路径的“文件名”。键的值是实际的文件内容。所以具有密钥s3:// my-bucket/1/2/a的s3对象不是在名为2的子文件夹中名为a的文件。它是具有看起来像完整路径的密钥的对象。

知道了这一点,并且在编写策略时应用理解:*通配符可用于匹配apply或deny语句中的键名,这有效地回答了问题。此外,为特定操作包含严格范围的对象或存储桶允许/拒绝语句很重要。因此,基本上允许get/put访问/ 1/2“文件夹”而不是1/2/a“文件”,您需要允许s3://存储桶中的列表操作/ 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 /和对象get/put访问S3://桶/ 1/2/3/*。没有访问s3:// bucket/1/2/3/*的人将在显式拒绝组中,并且有访问权限的人员将在第一个组中具有该允许。

当许多“子文件夹”有不同的组可以访问每个文件夹时,这会很快失去控制。每次创建新的嵌套“子文件夹”时更新策略都是不成立的范例。出于这个原因,当使用基于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/*。甚至不必指定拒绝/ even /因为它是隐含的。

相关问题