Доступ запрещен для подписанного URL-адреса AWS CloudFront

#amazon-web-services #amazon-s3 #amazon-cloudfront

#amazon-веб-сервисы #amazon-s3 #amazon-cloudfront

Вопрос:

Я настроил следующую информацию:

  1. Создал корзину AWS S3 и загрузил несколько изображений в определенную папку
  2. Создан веб-дистрибутив AWS CloudFront:
    • Исходное доменное имя: выбранное из списка сегмент S3
    • Ограничить доступ к корзине: Да
    • Идентификатор доступа к источнику: выбран существующий идентификатор
    • Предоставить разрешения на чтение в корзине: Да, обновить политику корзины

введите описание изображения здесь

AccessDenied Отказано в доступе

Я получил подписанный URL-адрес из вышеупомянутого процесса, например

image.png?policy=xxxxx@signature=xxx@Key-Pair-Id=XXXXXXX

но я не смог получить доступ к URL-адресу

Пример JSON для политики облачного интерфейса

 {
    "Statement": [{
        "Resource": "XXXXXXXXXX.cloudfront.net/standard/f7cecd92-5314-4263-9147-7cca3041e69d.png",
        "Condition": {
            "DateLessThan": {
                "AWS:EpochTime": 1555021200
            },
            "IpAddress": {
                "AWS:SourceIp": "0.0.0.0/0"
            },
            "DateGreaterThan": {
                "AWS:EpochTime": 1554848400
            }
        }
    }]
}
  

Добавлена политика корзины CloudFront

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXXX"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::bucket_name/*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXXX"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucket_name"
        }
    ]
}
  

Комментарии:

1. Вы проверили, правильно ли преобразован файл закрытого ключа для создания подписанного URL-адреса политики?

2. Пожалуйста, покажите полную ошибку.

3. @r123 проверит

4. Похоже, что эта ошибка может исходить от S3. проверьте свою политику корзины S3, чтобы убедиться, что нет никаких явных запретов, что была применена политика OAI, и при необходимости добавьте listBucket в arn корзины, например arn:aws:s3:::bucket_name . Если у вас есть разрешение GetObject только для корзины и вы пытаетесь извлечь объект, который не существует, вы получите 403, но вы получите 404, если у вас есть разрешения ListBucket.

5. @cementblocks В политике корзины имеет разрешение на доступ к ListBucket, GetObject и putObject

Ответ №1:

Похоже, что ошибка, с которой вы сталкиваетесь, не имеет ничего общего с упомянутыми вами шагами, исходная идентификация доступа позволяет CloudFront получать доступ к S3 с помощью специального пользователя, использующего sigv4, используя вышеуказанные шаги, вы увидите, что в политику корзины добавлено разрешение.

Если это ошибка из S3, вы увидите примерно 2 идентификатора запроса, идентификаторы хоста и запроса, а также сообщение об отказе в доступе.

image.png?policy=xxxxx@signature=xxx@Key-Pair-Id=XXXXXXX Если вы видите отказ в доступе, ошибка связана с подписанным URL-адресом CloudFront (ограниченный доступ к просмотрщику).

Чтобы узнать, что не так с созданным подписанным URL-адресом CloudFront, попробуйте в base64 расшифровать значение политики и посмотреть, правильный URL-адрес ресурса / срок действия и т.д. или нет.

Комментарии:

1. Да, я попытался расшифровать значение политики, чтобы указанная дата / время не истекли, и URL ресурса также правильный

2. хм, можно поделиться примером политики декодирования или заголовками ответов? Я предполагаю, что у вас также есть правильная пара ключей-id (CloudFront не общий ключ доступа AWS).

3. @dwayneJohn вы говорите, что URL-адрес ресурса правильный, но у нас нет способа подтвердить это, не увидев пример. Ресурс должен содержать полный URL-адрес, запрашиваемый браузером, включая схему и точное имя хоста. Также подписанный URL -адрес не должен содержать , @ как вы показали , разделитель amp; . Эти детали не являются тривиальными.

4. Как сохранить закрытый ключ из хранилища параметров CloudFront?

5. Вам нужно загрузить закрытый ключ локально, чтобы использовать его в коде, кстати, URL-адрес ресурса, который вы упомянули, и URL-адрес, к которому вы обращаетесь, не совпадают или это просто пример? Поскольку вы получаете доступ к пользовательской политике с помощью CloudFront, попробуйте использовать подстановочный знак для устранения опечаток.