S3存储桶的IAM组策略:拒绝文件夹但不拒绝文件

时间:2016-02-02 20:16:58

标签: amazon-web-services amazon-s3 amazon-iam

this问题引用了我为了满足我的需求而一直试图利用的aws blog,但没有任何成功。我一直在攻击该答案中的解决方案以及它整天引用的示例策略,但没有任何成功。我基本上希望允许不同的IAM组完全访问存储桶中的公共子文件夹对象,同时根据组成员资格选择性地允许/拒绝对OTHER子文件夹对象的访问。

铲斗结构:
我的金融斗\
我的金融斗\文件
我的金融斗\我们 - 融资 - 团队\
我的金融斗\我们 - 融资 - 团队\文件
我的金融斗\我们 - 融资 - 团队\报告\
我的金融斗\我们 - 融资 - 团队\报告\文件
我的金融斗\我们 - 融资 - 团队\报告\报告1名\
我的金融斗\我们 - 融资 - 团队\报告\报告1名\文件
我的金融斗\我们 - 融资 - 团队\报告\报告2名\
我的金融斗\我们 - 融资 - 团队\报告\报告2名\文件
我的金融斗\我们 - 融资 - 团队\ DATA \
我的金融斗\我们 - 融资 - 团队\ DATA \文件
我的金融斗\我们 - 融资 - 团队\东西\
my-finance-bucket \ Our-Finance-Team \ Stuff \ files

我甚至不确定我希望做什么是可能的,但我想创建3个名为:finance-all,finance-data和finance-reports的组。

我希望所有3个小组都可以访问:
我的金融斗\
我的金融斗\文件
我的金融斗\我们 - 融资 - 团队\
我的金融斗\我们 - 融资 - 团队\文件
我的金融斗\我们 - 融资 - 团队\东西\
my-finance-bucket \ Our-Finance-Team \ Stuff \ files

另外,我有这些要求:
finance-all group有s3:*允许访问my-finance-bucket下的所有内容 (我认为这很容易,并且可能单独作为一个单独的组策略,允许s3:*到arn:aws:s3 ::: / my-finance-bucket和arn:aws:s3 ::: / my-finance-桶/ *)

finance-data group具有上面列出的共享访问权限加上s3:* Object *允许:
  我的金融斗\我们 - 融资 - 团队\ DATA \
  我的金融斗\我们 - 融资 - 团队\ DATA \文件
  无权访问未指定的任何其他内容

财务报告具有上面列出的共享访问权限,加上s3:*对象*允许:
我的金融斗\我们 - 融资 - 团队\报告\
我的金融斗\我们 - 融资 - 团队\报告\文件
我的金融斗\我们 - 融资 - 团队\报告\报告1名\
我的金融斗\我们 - 融资 - 团队\报告\报告1名\文件
我的金融斗\我们 - 融资 - 团队\报告\报告2名\
我的金融斗\我们 - 融资 - 团队\报告\报告2名\文件
无权访问未指定的任何其他内容

我知道我必须从允许“ListAllMyBuckets”开始,因此表示文件夹和文件的对象将以递归方式显示和列出所有文件夹。虽然不是最佳,但它不是一个显示停止因为查看,获取或放置文件将被拒绝给不在其适当组中的用户。

我意识到大多数人会问“你做了什么”,试图帮助纠正我已经完成的任何工作 - 但是我已经经历了几十次迭代,甚至没有任何东西接近我正在寻找的东西去做。链接答案和链接的aws博客文章中列出的代码一直是我攻击它的起点,可以作为基线

    {
 "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"
    }
 ]
}

1 个答案:

答案 0 :(得分:1)

我放弃了大约3天的时间,然后我放弃了并且说服了有这方面业务需求的人,如果他们让我重新组织这个桶,我可以在半小时内完成整件事。他们同意了,所以我最终只是创建了"子文件夹"在存储桶中然后创建了IAM组,授予对每个人的访问权限"子文件夹"。

所以我重新整理了这个桶:

我的金融桶/
我的金融桶/文件
我的金融桶/共享/
我的金融桶/共享/文件
我的金融桶/
我的金融桶/数据/
我的金融桶/数据/文件
我的金融桶/报告/
my-finance-bucket / reports / files

遵循这种模式,我压缩了现有的"子文件夹"如 我的金融桶/一些报告/ *
我的金融桶/一些,其他报告/ *
下到
我的金融桶/报告/一些报告/ *
my-finance-bucket / reports / some-other-report / *

和/ shared /和/ data /

下的事情相同

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

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

{
"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/*"
        ]
    }
]

}

请注意,凭借/ *允许列表和对象访问,访问顶级子文件夹的人也可以访问子文件夹。如果需要嵌套的子文件夹访问,我相信它与原始问题的问题相同。但是,我认为通过简单而直接地重新组织此存储桶,我可以通过明确拒绝子文件夹来实现它,并且具有显式的其他组允许这些相同的子文件夹。我相当肯定这也适用于原始问题,但是桶的组织方式会使创建和维护策略成为一项艰巨的任务。

最后,值得注意的是,此方法无法拒绝列表访问"文件夹"和"文件"。这意味着,虽然共享组中的用户可以看到数据和报告文件夹中的文件和文件夹的名称,但是他们无法执行任何其他操作(没有获取或放置也只是列表访问,没有读取,没有写入)