列出存储桶的 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/*"
        }
    ]
}