列出存储桶的 AWS STS 拒绝访问
AWS STS to list buckets gives access denied
我有一个带有空存储桶策略的存储桶,块 public 访问已打开(ACL 和存储桶)并尝试使用 IAM 策略列出存储桶,该策略与使用 STS AssumeRole 的用户绑定,并带有以下附加策略。
{
"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: An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
当我尝试使用 IAM 策略模拟器时,它显示 "Implicitly denied"。我在想是否需要访问该用户的存储桶策略?我的理解是,如果 IAM 和 Bucket 策略都是交叉点。如果其中一个不存在,则另一个优先。
这是一个很常见的问题,因为人们往往会忽略 "bucket" 资源和 "object" 资源之间的区别。存储桶以存储桶的名称 (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/*"
]
}
]
}
调用 list_buckets()
使用 s3:ListAllMyBuckets
权限。
此权限不能限制到特定的存储桶。用户可以列出帐户中的 所有 个存储桶,或者列出 none 个存储桶。
调用存储桶上的操作 (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/*"
}
]
}
我有一个带有空存储桶策略的存储桶,块 public 访问已打开(ACL 和存储桶)并尝试使用 IAM 策略列出存储桶,该策略与使用 STS AssumeRole 的用户绑定,并带有以下附加策略。
{
"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: An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
当我尝试使用 IAM 策略模拟器时,它显示 "Implicitly denied"。我在想是否需要访问该用户的存储桶策略?我的理解是,如果 IAM 和 Bucket 策略都是交叉点。如果其中一个不存在,则另一个优先。
这是一个很常见的问题,因为人们往往会忽略 "bucket" 资源和 "object" 资源之间的区别。存储桶以存储桶的名称 (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/*"
]
}
]
}
调用 list_buckets()
使用 s3:ListAllMyBuckets
权限。
此权限不能限制到特定的存储桶。用户可以列出帐户中的 所有 个存储桶,或者列出 none 个存储桶。
调用存储桶上的操作 (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/*"
}
]
}