【发布时间】:2020-03-05 15:05:18
【问题描述】:
我正在为我的 Kubernetes 工作人员编写 IAM 政策。我希望他们对某个 S3 存储桶具有读/写访问权限,不能访问我的帐户中 中的其他 S3 存储桶,但可以读取 任何存储桶,即 可公开阅读(例如s3://1000genomes/ 存储桶,以及亚马逊或其他人已放置公共数据的其他存储桶)。
(是否授予或拒绝访问我帐户中的公共存储桶无关紧要。如果我需要授予对某个存储桶的访问权限,我可以明确地这样做。但我不能授予访问权限明确地指向世界上的每个公共存储桶。)
我可以编写一个如下所示的节来授予对世界上所有存储桶的读取权限:
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::*",
"arn:aws:s3:::*/*"
]
}
我还可以编写一个授予对我的帐户上我想要允许访问的特定命名存储桶的访问权限,并将名称填写为*。
但是如何编写拒绝访问我帐户上不是命名存储桶的存储桶的策略?或者,如果我采用不同的方法,我如何为不在我账户上的所有存储桶编写授权?我可以在那些额外的冒号之间放一些东西来做到这一点吗?我试过同时使用 Resource 和 NotResource,但 AWS 拒绝了。
作为参考,我的政策如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::vg-k8s",
"arn:aws:s3:::vg-k8s/*",
]
}
]
}
在我的节点组上实施该策略后,我无法从节点访问s3://1000genomes。要专门访问该存储桶,我可以将其更改为:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::vg-k8s",
"arn:aws:s3:::vg-k8s/*",
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::1000genomes",
"arn:aws:s3:::1000genomes/*"
]
}
]
}
但我需要一种方法来做到这一点,以便我涵盖所有公共存储桶,而不仅仅是我列出的那些,而且我不涵盖我帐户中的非公共存储桶。
【问题讨论】:
-
编写一个对所有存储桶都具有 ALLOW 的策略,然后在您的存储桶上显式地拒绝。
-
@hephalump 我怎样才能拒绝我的所有存储桶,除了我想要允许的存储桶?我可以拒绝我的所有个存储桶,但是拒绝将胜出,我将无法访问我的任何个存储桶。
标签: amazon-web-services amazon-s3 amazon-iam