AWS STS для перечисления корзин дает доступ запрещен

У меня есть корзина с пустой политикой корзины, включена блокировка общего доступа (ACL и Bucket), и я пытаюсь составить список корзин с помощью политики 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/*"
            ]
        }
    ]
}

Предполагаемые учетные данные роли используются во время сеанса STS в python (boto3)

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: Произошла ошибка (AccessDenied) при вызове операции ListBuckets: Доступ запрещен

Когда я пытался использовать симулятор политики IAM, он показывает "Неявно отказано". Я думаю, нужно ли мне получить доступ к политике корзины для этого пользователя? Насколько я понимаю, если и политика IAM, и политика сегмента, это пересечение. Если один из них отсутствует, другой имеет приоритет.

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

Это довольно распространенная проблема, потому что люди склонны упускать из виду разницу между ресурсом "ведро" и ресурсом "объект". Ковш заканчивается названием ведра (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/*"
            ]
        }
    ]
}
Другие вопросы по тегам