Amazon web services 如何编写AWS IAM策略,授予其他所有人读取权限';水桶是什么?
我正在为我的Kubernetes员工编写IAM政策。我希望他们对某个S3存储桶具有读/写访问权限,不访问我帐户中的其他S3存储桶,但对任何公共可读的存储桶具有读访问权限(例如Amazon web services 如何编写AWS IAM策略,授予其他所有人读取权限';水桶是什么?,amazon-web-services,amazon-s3,amazon-iam,Amazon Web Services,Amazon S3,Amazon Iam,我正在为我的Kubernetes员工编写IAM政策。我希望他们对某个S3存储桶具有读/写访问权限,不访问我帐户中的其他S3存储桶,但对任何公共可读的存储桶具有读访问权限(例如S3://1000genomes/存储桶,以及亚马逊或其他人提供公共数据的其他存储桶) (我的帐户中的公共存储桶是否被授予访问权限并不重要。如果我需要授予一个存储桶的访问权限,我可以明确地这样做。但我不能明确地授予世界上每个公共存储桶的访问权限。) 我可以编写一个类似这样的节,以提供对世界上所有存储桶的读取权限: {
S3://1000genomes/
存储桶,以及亚马逊或其他人提供公共数据的其他存储桶)
(我的帐户中的公共存储桶是否被授予访问权限并不重要。如果我需要授予一个存储桶的访问权限,我可以明确地这样做。但我不能明确地授予世界上每个公共存储桶的访问权限。)
我可以编写一个类似这样的节,以提供对世界上所有存储桶的读取权限:
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::*",
"arn:aws:s3:::*/*"
]
}
我还可以编写一个允许访问我想允许访问的帐户上的特定命名bucket的程序,在*
中填入名称
但是,我如何编写一个策略来拒绝访问我帐户上不是命名存储桶的存储桶?或者,如果我采取不同的方法,我如何为所有不属于我账户的桶写一份补助金?我能在这些额外的冒号之间加些什么吗?我尝试过同时使用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://1000基因组。要访问该存储桶,我可以将其更改为:
{
"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/*"
]
}
]
}
但我需要一种方法来做到这一点,这样我就可以覆盖所有公共存储桶,而不仅仅是我列出的那些存储桶,但我的帐户中不包括非公共存储桶
我如何编写一个策略,拒绝访问我帐户上非命名存储桶的存储桶
你没有。默认情况下,IAM策略被拒绝
如何授予对任何可公开读取的存储桶的读取权限
你没有。访问公共存储桶不需要额外的权限或策略
但是,您可能会遇到公共存储桶访问的问题,并且应该使您对公共存储桶的请求未签名
要从awscli与公共存储桶交互,请使用:
aws s3 ls s3://1000genomes/ --no-sign-request
要从boto3执行相同操作,请使用:
import boto3
from botocore import UNSIGNED
from botocore.config import Config
s3 = boto3.client('s3', config=Config(signature_version=UNSIGNED))
编写一个允许所有存储桶的策略,然后对您的存储桶进行显式拒绝。@hephalump如何拒绝我所有的存储桶,除了我想允许的存储桶?我可以拒绝我的所有存储桶,但是拒绝将获胜,我将无法访问我的任何存储桶。不幸的是,这与我观察到的行为不匹配。从我的节点(作为受组策略约束的用户运行),我不能aws s3 ls s3://1000genomes/
,除非我将公共bucketarn:aws:s3:::1000genomes
添加到允许访问bucket的策略中。一旦我这样做了,我就可以很好地访问它。尝试aws s3 ls s3://1000genomes/--无符号请求
。我授予了对1000genomes
的显式访问权,但对于一个桶,我还没有这样做(landsat pds
),这似乎是可行的。我可以列出没有签名请求的bucket,但不能没有。不幸的是,我不知道如何修改我的应用程序(它使用boto)来知道它应该和不应该对请求进行签名@jarmod,有没有办法在IAM策略级别上解决这个问题,这样即使是已签名的请求也能通过?我不知道有什么方法可以在策略级别上实现您想要的。理想情况下,您的应用程序可以被告知它正在处理一个公共存储桶,如果这不可能,那么可能只需在您被拒绝访问后重试一个未签名的基本操作。不太理想,我会答应你的。如果我找到更好的选项,将会更新。