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

Posted

技术标签:

【中文标题】S3 存储桶的 IAM 组策略:拒绝文件夹但不拒绝文件【英文标题】:IAM Group Policy for S3 bucket: deny folders but not files 【发布时间】:2016-02-02 20:16:57 【问题描述】:

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

桶结构: 我的财务桶\ 我的财务桶\文件 我的财务桶\我们的财务团队\ 我的财务桶\我们的财务团队\文件 我的财务桶\我们的财务团队\报告\ 我的财务桶\我们的财务团队\报告\文件 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

我什至不确定我想要做的事情是否可行,但我想创建 3 个名为:finance-all、finance-data 和 finance-reports 的组。

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

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

finance-data 组具有上面列出的共享访问权限以及 s3:*Object* 允许: 我的财务桶\我们的财务团队\数据\ 我的财务桶\我们的财务团队\数据\文件 无法访问未指定的任何其他内容

finance-reports 具有上面列出的共享访问权限,加上 s3:*Object* 允许: 我的财务桶\我们的财务团队\报告\ 我的财务桶\我们的财务团队\报告\文件 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 博客文章中列出的代码是我对此进行黑客攻击的起点,可以作为基线

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

【问题讨论】:

你想要做的事情有点难以理解,但原则上很简单:任何没有明确允许的东西都会被拒绝,任何明确拒绝的东西总是被拒绝,即使它也是明确允许。请记住,deny StringNotLike 也是可用的,并且 not 与 allow StringLike 正好相反,因为拒绝具有优先权。因此,更广泛的允许可以“拒绝一切,但除外”例外。 感谢您的反馈。从我对该主题的阅读来看,s3 对象作为键值对的概念以及前缀和分隔符运算符的使用似乎也很有用。当我得到有用的工作时,我打算发布编辑或回答我自己的问题。我目前正在使用策略模拟器和一些测试桶来了解我不太熟悉的运算符(StringLike、StringNotLike、Prefix、Delimiter)。 【参考方案1】:

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

所以我像这样重新组织了存储桶:

我的财务桶/ 我的财务桶/文件 我的财务桶/共享/ 我的财务桶/共享/文件 我的财务桶/ 我的财务桶/数据/ 我的财务存储桶/数据/文件 我的财务桶/报告/ 我的财务桶/报告/文件

按照这种模式,我压缩了现有的“子文件夹”,例如 我的财务桶/一些报告/* 我的财务桶/其他一些报告/* 到 我的财务桶/报告/一些报告/* 我的财务桶/报告/其他一些报告/*

同样用于在 /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/*"
        ]
    
]

请注意,由于 /* 允许列表和对象访问,因此可以访问***子文件夹的人也可以访问子文件夹。如果需要嵌套子文件夹访问,我相信这将与原始问题相同。但是,我认为通过对这个存储桶进行简单直接的重组,我可以通过对子文件夹的显式拒绝以及对这些相同的子文件夹具有显式允许的其他组来实现它。我相当肯定这也适用于最初的问题,但是存储桶的组织方式会使创建和维护策略成为一项繁重的任务。

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

【讨论】:

以上是关于S3 存储桶的 IAM 组策略:拒绝文件夹但不拒绝文件的主要内容,如果未能解决你的问题,请参考以下文章

AWS S3 拒绝除 1 个用户之外的所有访问 - 存储桶策略

仅允许从 S3 存储桶的特定文件夹中删除的 IAM 策略

S3 拒绝管理员访问

Amazon Web Service S3 Access Denied with 看似不错的 IAM 策略

AWS S3 存储桶策略编辑器访问被拒绝

针对 Grafana 警报写入 s3 存储桶的 AWS IAM 策略问题