Является ли X-Amz-Expires обязательным заголовком/параметром для запросов к AWS?

  1. Является ли X-Amz-Expires обязательным заголовком/параметром? Официальная документация противоречива и использует ее в некоторых примерах, но не в других.

  2. Если это не требуется, каково значение истечения срока действия подписанного запроса по умолчанию? Равно ли оно максимально возможному значению параметра X-Amz-Expires, равному 604800 (семь дней)?

  3. В документации (см. ссылки выше) о параметре X-Amz-Expires говорится только в контексте передачи параметров подписи в строке запроса. Если требуется параметр X-Amz-Expires, требуется ли он только для передачи параметров подписи в строке запроса (в отличие от передачи их с заголовком авторизации)?


Обновлять:

В документе Введение в процессы безопасности AWS на странице 17 говорится:

Запрос должен поступить в AWS в течение 15 минут после отметки времени в запросе. В противном случае AWS отклоняет запрос.

О какой отметке времени мы здесь говорим? Я предполагаю, что это X-Amz-Date. Если я прав, то возникает еще один вопрос:

  1. Как параметры X-Amz-Date и X-Amz-Expires связаны друг с другом? Для меня это звучит так, как будто алгоритм истечения срока действия запроса возвращается к 15 минутам от временной метки X-Amz-Date, если X-Amz-Expire отсутствует.

person golem    schedule 17.09.2016    source источник


Ответы (1)


Является ли X-Amz-Expires обязательным заголовком/параметром?

X-Amz-Expires используется только с аутентификацией строки запроса, а не с заголовком Authorization:.

Нет значения по умолчанию для проверки подлинности строки запроса. Это обязательный параметр, и служба отклонит запрос, если в строке запроса присутствует X-Amz-Algorithm=AWS4-HMAC-SHA256, а X-Amz-Expires=... — нет.

<Error>
  <Code>AuthorizationQueryParametersError</Code>
...

О какой отметке времени мы здесь говорим?

Это относится к X-Amz-Date: при использовании с заголовком Authorization:. Поскольку X-Amz-Date: является частью входных данных алгоритма подписи, изменение даты или времени также меняет подпись. В остальном идентичный запрос, подписанный на 1 секунду раньше или позже, имеет совершенно другую подпись. По сути, AWS позволяет часам вашего сервера ошибаться до 15 минут, не нарушая вашу способность аутентифицировать запросы. Это не запасной вариант или значение по умолчанию. Это фиксированное окно.

AWS сравнивает X-Amz-Date: из Authorization: запросов на основе заголовка с их системным временем, которое, конечно же, синхронизируется с UTC, и запрос отклоняется, если это значение отличается от UTC более чем на 15 минут на момент поступления запроса. Никакой другой проверки, связанной с аутентификацией, не происходит до проверки времени.

Проверка срока действия аутентификации строки запроса включает другую логику:

  • X-Amz-Expires не должно быть больше 604800 или меньше 0; в противном случае запрос немедленно отклоняется без дальнейшей обработки, включая сообщение, подобное приведенному выше.
  • X-Amz-Date не должно быть более чем через 15 минут в будущем, согласно системным часам AWS. Ошибка Request is not yet valid.
  • X-Amz-Date не должно быть более чем на X-Amz-Expires количество секунд в прошлом относительно системных часов AWS, и допуск на 15 минут не применяется. Ошибка Request has expired.

При возникновении любого из этих условий дальнейшая проверка подписи не выполняется, поэтому эти сообщения не будут меняться в зависимости от достоверности подписи. Это проверяется в первую очередь.

Кроме того, самые левые 8 символов вашего X-Amz-Date: должны соответствовать части даты вашего компонента Credential заголовка Authorization:. Сама дата не допускает несоответствия учетным данным (поэтому при подписании не считывайте свое системное время дважды, иначе вы рискуете создать случайную недействительную подпись около полуночи UTC).

Наконец, срок действия запросов не истекает в процессе обработки. Если вы отправляете запрос с использованием любого метода подписи, который считается действительным, когда он поступает, но срок действия которого истекает очень скоро после этого, он всегда может выполняться до завершения — например, большая загрузка S3 или запрос на создание моментального снимка EBS не запустится. , затем не удастся продолжить, поскольку таймер истечения срока действия сработал, когда запрос уже был запущен на стороне AWS. Если действие было авторизовано по запросу, оно продолжается и завершается как обычно.

person Michael - sqlbot    schedule 18.09.2016
comment
Изучив тему самостоятельно (я реализовал алгоритм подписи в соответствии со спецификацией), я в основном согласен с вашим ответом. Однако: а) Параметр X-Amz-Expires требуется только для загрузки/выгрузки объектов S3, он игнорируется для вызовов API к IAM, EC2 или DynamoDB (другие сервисы я не тестировал). б) Описание синхронизации UTC немного ошибочно. UTC — это часовой пояс, вы не синхронизируетесь с часовым поясом; запрос отклоняется, если время создания запроса отличается от времени сервера Amazon более чем на 15 минут. - person golem; 24.09.2016
comment
Что касается истечения срока действия, для меня важна техническая точность моих ответов, поэтому я проверю, протестирую и обновлю этот ответ соответствующим образом. Что касается UTC, я не имел в виду часовой пояс UTC. Всемирное скоординированное время, сокращенно UTC, является основным стандартом времени, по которому мир регулирует часы. и время. Время сервера Amazon синхронизировано со стандартом времени UTC, поэтому, если часы вашего сервера не синхронизированы, погрешность составляет менее 15 минут. Запросы терпят неудачу с часами сервера, которые более асимметричны. - person Michael - sqlbot; 24.09.2016
comment
Спасибо за этот ответ. У вас есть идеи, почему X-Amz-Expires НЕ работает с URL-адресами WebSocket? Это просто не учитывается, и всегда используется максимальное время истечения (5 минут для веб-сокетов). - person Mohammed Noureldin; 20.04.2021
comment
@MohammedNoureldin похоже, что X-Amz-Expires интерпретируется только S3, что для меня неожиданно. Другие сервисы используют жестко закодированные ограничения в 15 или 5 минут. stackoverflow.com/a/66961500/1695906 - person Michael - sqlbot; 23.04.2021
comment
@Michael-sqlbot Вчера я прочитал то же самое на GitHub. Хотя это не является серьезной проблемой, это раздражает. - person Mohammed Noureldin; 23.04.2021
comment
Это также требуется для AWS Transcribe Streaming API. - person Hari Honor; 15.06.2021