一旦理解文件夹本身不存在,这实际上很简单。 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 /因为它是隐含的。
我没有发布超过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) –