我有一个具有空存储桶策略的存储桶,禁止将公共访问权限打开(ACL和存储桶),并尝试使用与以下附带策略一起使用的STS AssumeRole用户绑定的IAM策略列出存储桶。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:GetBucket*",
"s3:ListBucket*",
"s3:ListAllMyBuckets"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-test-bucket/*"
]
}
]
}
在python(boto3)的STS会话期间使用了假定的角色凭据
s3c = boto3.client('s3',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken'])
s3c.list_buckets()
我收到此异常:
botocore.exceptions.ClientError:调用ListBuckets操作时发生错误(AccessDenied):访问被拒绝
当我尝试使用IAM策略模拟器时,它指示“被明显拒绝”。我在想是否需要为此用户访问存储桶策略?我的理解是,如果同时使用IAM和存储桶策略,这是一个交叉点。如果其中一个不存在,则另一个优先。
答案 0 :(得分:2)
呼叫list_buckets()
使用s3:ListAllMyBuckets
权限。
此权限不能限于特定的存储桶。用户可以列出帐户中所有个存储桶,也可以不列出任何一个。
在存储桶上调用操作(ListBucket, GetBucket*
)需要存储桶本身的权限。
对对象的操作需要对对象的许可(或在存储区名称后的/*
上允许对所有对象执行操作)。
因此,您可以将政策更改为:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucket*"
],
"Resource": "arn:aws:s3:::my-test-bucket"
},
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-test-bucket/*"
}
]
}
答案 1 :(得分:0)
这是一个非常普遍的问题,因为人们倾向于错过“存储桶”资源和“对象”资源之间的差异。值区以值区(arn:aws:s3:::my-test-bucket
)的名称结尾,而对象包含值区和键,并且通常在初始斜杠后加一个星号。因此,只需将您的政策更改为以下内容即可。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListAllMyBuckets"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-test-bucket"
]
},
{
"Action": [
"s3:GetObject",
"s3:GetBucket*",
"s3:ListBucket*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-test-bucket/*"
]
}
]
}