【发布时间】: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)。
标签: amazon-web-services amazon-s3 amazon-iam