0

我有一个带有空存储桶策略的存储桶,打开了阻止公共访问(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 和 Bucket 策略都是一个交集。如果其中一个不存在,则另一个优先。

4

2 回答 2

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/*"
        }
    ]
}
于 2020-02-19T01:45:47.027 回答
-1

这是一个很常见的问题,因为人们往往会忽略“桶”资源和“对象”资源之间的区别。存储桶以存储桶的名称 ( 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/*"
            ]
        }
    ]
}
于 2020-02-19T01:38:11.983 回答