首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >S3桶的IAM组策略:拒绝文件夹而不是文件

S3桶的IAM组策略:拒绝文件夹而不是文件
EN

Stack Overflow用户
提问于 2016-02-02 20:16:57
回答 1查看 1.2K关注 0票数 1

问题引用了我一直试图利用的aws博客,以满足我的需求,但没有取得任何成功。我在那个答案和它所引用的示例策略中一直对解决方案进行黑客攻击,但没有成功。我基本上希望允许不同的IAM组完全访问桶中的公共子文件夹对象,同时有选择地允许/拒绝基于组成员身份访问其他子文件夹对象。

桶结构:

我的-财务-桶\

我的-财务-桶\档案

我的-财务-水桶\我们-财务-团队\

我的-财务-桶\我们-财务-团队\档案

我的-财务-水桶\我们-财务-团队\报告\

my-finance-bucket\Our-Finance-Team\Reports\files

my-finance-bucket\Our-Finance-Team\Reports\report1-name\

my-finance-bucket\Our-Finance-Team\Reports\report1-name\files

my-finance-bucket\Our-Finance-Team\Reports\report2-name\

my-finance-bucket\Our-Finance-Team\Reports\report2-name\files

我的-财务-桶\我们-财务-团队\数据\

我的-财务-桶\我们-财务-团队\数据\文件

我的-财务-水桶\我们-财务-团队\东西\

my-finance-bucket\Our-Finance-Team\Stuff\files

我甚至不确定我想做的事情是否可能,但我想创建三个小组,名为:金融-所有,金融-数据,和财务-报告。

我希望这三个团体都能接触到:

我的-财务-桶\

我的-财务-桶\档案

我的-财务-水桶\我们-财务-团队\

我的-财务-桶\我们-财务-团队\档案

我的-财务-水桶\我们-财务-团队\东西\

my-finance-bucket\Our-Finance-Team\Stuff\files

此外,我还有以下要求:

金融-所有组都有s3:*允许访问我的财务桶下的所有东西。

(我认为这很容易,并且可能可以单独作为一个单独的组策略来支持s3:* to arn:aws:s3:/my-finance-bucket和arn:aws:s3:/my-finance-bucket/*)

财务-数据组具有上面列出的共享访问,加上s3:*Object*允许:

我的-财务-桶\我们-财务-团队\数据\

我的-财务-桶\我们-财务-团队\数据\文件

不能访问未指定的任何其他内容

财务-报告具有上面列出的共享访问权限,加上s3:*Object*允许:

我的-财务-水桶\我们-财务-团队\报告\

my-finance-bucket\Our-Finance-Team\Reports\files

my-finance-bucket\Our-Finance-Team\Reports\report1-name\

my-finance-bucket\Our-Finance-Team\Reports\report1-name\files

my-finance-bucket\Our-Finance-Team\Reports\report2-name\

my-finance-bucket\Our-Finance-Team\Reports\report2-name\files

不能访问未指定的任何其他内容

我知道,我必须从允许"ListAllMyBuckets“开始,因此表示文件夹和文件的对象对于所有文件夹都是可见的,并且可以递归地列出。虽然不是最优的,但它并不是一个节目的停止,因为观看,获取或放置文件将被拒绝的用户,而不是在他们的适当组。

我意识到大多数人会问“你做了什么”,试图帮助纠正我已经做过的任何工作--然而,我已经经历了几十次迭代,甚至没有任何事情接近我想要做的事情。链接答案和链接aws博客文章中列出的代码是我对此进行黑客攻击的起点,可以作为基线。

代码语言:javascript
复制
    {
 "Version":"2012-10-17",
 "Statement": [
   {
     "Sid": "AllowUserToSeeBucketListInTheConsole",
     "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::*"]
   },
  {
     "Sid": "AllowRootAndHomeListingOfCompanyBucket",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::yourbucketname"],
     "Condition":{"StringEquals":{"s3:prefix":["","yourfoldername/"],"s3:delimiter":["/"]}}
    },
   {
     "Sid": "AllowListingOfUserFolder",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::yourbucketname"],
     "Condition":{"StringLike":{"s3:prefix":["yourfoldername/*"]}}
   },
   {
     "Sid": "AllowAllS3ActionsInUserFolder",
     "Effect": "Allow",
     "Action": ["s3:GetObject"],
     "Resource": ["arn:aws:s3:::yourbucketname/yourfoldername/*"]
   },
{
      "Action": [
        "s3:*"
      ],
      "Sid": "Stmt1375581921000",
      "Resource": [
"arn:aws:s3:::yourbucketname/anotherfolder1/*",
"arn:aws:s3:::yourbucketname/anotherfolder2/*",
"arn:aws:s3:::yourbucketname/anotherfolder3/*",
"arn:aws:s3:::yourbucketname/anotherfolder4/*"
      ],
      "Effect": "Deny"
    }
 ]
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-08 19:23:04

在我放弃之前,我花了大约3天的时间,说服有业务需求的人,如果他们让我重新组织这个桶,我可以在半小时内完成全部工作。他们同意了,所以我最终只创建了桶中的“子文件夹”,然后创建了IAM组,允许访问每个单独的“子文件夹”。

所以我把桶重新整理成这样:

我的-财务-桶/

我的-财务-桶/档案

我的-财务-桶/共享/

我的-财务-桶/共享/文件

我的-财务-桶/

我的-财务-桶/数据/

我的-财务-桶/数据/文件

我的-财务-桶/报告/

我的-财务-桶/报告/档案

按照此模式,我浓缩了现有的“子文件夹”,如

我的-财务-桶/一些-报告/*

我的-财务-桶/其他-报告/*

下至

我的-财务-桶/报告/一些-报告/*

我的-财务-桶/报告/其他-报告/*

在/共享/和/数据/

这样做后,我就能够依赖固有的拒绝功能,只需使用IAM组策略为单个顶级文件夹提供允许访问。通过简单地将用户添加到这些组中,我能够有选择地授予对某些子文件夹的访问权,而不授予其他子文件夹的访问权限。

我为访问每个单独的桶而创建的所有策略都遵循以下格式:

代码语言:javascript
复制
{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "AllowListAllMyBuckets",
        "Effect": "Allow",
        "Action": [
            "s3:ListAllMyBuckets",
            "s3:GetBucketLocation"
        ],
        "Resource": [
            "arn:aws:s3:::*"
        ]
    },
    {
        "Sid": "AllowedListAccess",
        "Effect": "Allow",
        "Action": [
            "s3:ListBucket",
            "s3:GetBucketAcl",
            "s3:GetBucketLocation"
        ],
        "Resource": [
            "arn:aws:s3:::my-finance-bucket",
            "arn:aws:s3:::my-finance-bucket/shared"
        ]
    },
    {
        "Sid": "AllowedObjectAccess",
        "Effect": "Allow",
        "Action": [
            "s3:*Object*"
        ],
        "Resource": [
            "arn:aws:s3:::my-finance-bucket/shared/*"
        ]
    }
]

}

请注意,由于/*允许列表和对象访问,具有顶级子文件夹访问权限的人也可以访问子文件夹。如果需要嵌套子文件夹访问,我相信这将是与原始问题相同的问题。但是,我认为只要简单而直接地重新组织这个桶,我就可以通过对子文件夹的显式否认来实现这个任务,并通过显式允许这些子文件夹来实现额外的组。我相当肯定,这也适用于最初的问题,但桶的组织方式会使创建和维护策略成为一项繁重的任务。

最后,值得注意的是,这种方法使得无法拒绝对“文件夹”和“文件”的列表访问。这意味着,虽然共享组中的用户可以看到数据和报表文件夹中的文件和文件夹的名称,但他们不能执行任何其他操作(不能只访问get或put aka list access,不能读取或写入)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35163012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档