AWS STS列出存储桶可拒绝访问

时间:2020-02-18 16:16:35

标签: amazon-web-services amazon-s3 amazon-iam assume-role

我有一个具有空存储桶策略的存储桶,禁止将公共访问权限打开(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和存储桶策略,这是一个交叉点。如果其中一个不存在,则另一个优先。

2 个答案:

答案 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/*"
            ]
        }
    ]
}