Открыть сервис

AWS Signature Version 4

AWS Signature Version 4 (SigV4) — это протокол аутентификации запросов к сервисам Amazon Web Services (AWS), основанный на криптографическом хешировании с использованием симметричного ключа (секретного ключа доступа). Он обеспечивает целостность и подлинность HTTP-запросов, защищая их от подделки и атак повторного воспроизведения (replay attacks). SigV4 является стандартным методом аутентификации для всех публичных API AWS, начиная с 2014 года, и заменил более ранние версии Signature Version 2 и Signature Version 3.

История

До появления SigV4 в AWS использовались более простые схемы аутентификации. Signature Version 2 (SigV2) была основана на подписи строки запроса с использованием ключа доступа и HMAC-SHA1. Однако она имела ограничения по безопасности, в частности, не поддерживала обязательную привязку к конкретному региону и сервису, что делало её уязвимой для некоторых типов атак. Signature Version 3 (SigV3) была переходным решением, но не получила широкого распространения.

В 2014 году AWS представила Signature Version 4 как часть общего обновления архитектуры безопасности. Основные причины внедрения SigV4:

  • Усиление защиты от повторного воспроизведения: подпись включает временную метку и уникальный идентификатор запроса.
  • Привязка к контексту: подпись зависит от региона (us-east-1), сервиса (s3, ec2) и даты, что ограничивает область действия скомпрометированного ключа.
  • Использование HMAC-SHA256: более стойкий алгоритм хеширования по сравнению с SHA1, использовавшимся в SigV2.
  • Поддержка потоковой передачи данных: возможность подписывать запросы с неизвестным заранее размером тела (chunked transfer encoding).

С 2014 года SigV4 стал обязательным для всех новых сервисов AWS, а с 2020 года — для большинства старых (например, для Amazon S3 поддержка SigV2 была прекращена в 2020 году).

Принцип работы

Протокол SigV4 основан на вычислении подписи (signature) для каждого HTTP-запроса. Подпись вычисляется с использованием:

  • Ключа доступа (Access Key ID) — идентификатор, который не является секретным.
  • Секретного ключа доступа (Secret Access Key) — секретный симметричный ключ, известный только владельцу аккаунта AWS.
  • Даты и времени запроса (в формате UTC).
  • Региона (например, us-east-1).
  • Сервиса (например, s3).
  • Канонического представления запроса (HTTP-метод, URI, заголовки, тело запроса).

Процесс подписи состоит из нескольких этапов:

  1. Формирование канонического запроса (Canonical Request): создаётся строка, включающая HTTP-метод (GET, PUT, POST), канонический URI, канонические строки запроса (query string), канонические заголовки (в алфавитном порядке) и хеш тела запроса (SHA256). Если тело отсутствует (GET-запрос), хеш вычисляется от пустой строки.
  1. Формирование строки для подписи (String to Sign): строится из алгоритма (AWS4-HMAC-SHA256), даты и времени, области действия (scope — строка вида YYYYMMDD/region/service/aws4_request) и хеша канонического запроса.
  1. Вычисление ключа подписи (Signing Key): на основе секретного ключа доступа, даты, региона и сервиса последовательно вычисляется HMAC-SHA256. Получается ключ, действительный только для конкретного дня, региона и сервиса.
  1. Вычисление подписи (Signature): с помощью ключа подписи и строки для подписи вычисляется HMAC-SHA256. Результат преобразуется в шестнадцатеричную строку.
  1. Добавление подписи в запрос: подпись передаётся в заголовке Authorization в формате:

AWS4-HMAC-SHA256 Credential=<AccessKeyID>/<date>/<region>/<service>/aws4_request, SignedHeaders=<list>, Signature=<signature>

Структура заголовка Authorization

Заголовок Authorization в SigV4 содержит три обязательных компонента:

  • Credential: строка вида <AccessKeyID>/<YYYYMMDD>/<region>/<service>/aws4_request. Указывает, какой ключ и какой контекст (дата, регион, сервис) использовались для подписи.
  • SignedHeaders: список заголовков запроса, включённых в подпись (например, host;x-amz-date). Сервер AWS проверяет, что указанные заголовки совпадают с фактическими.
  • Signature: вычисленная подпись в шестнадцатеричном формате.

Пример полного заголовка: `` Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-date;x-amz-content-sha256, Signature=fe5f80f77d5fa3beca038eb248ff027d0445342fe2855ddc963176630326f102 ``

Особенности и улучшения по сравнению с предыдущими версиями

  • Обязательная временная метка: запрос должен содержать заголовок x-amz-date (или Date в формате HTTP). Допускается расхождение не более 15 минут с серверным временем AWS.
  • Привязка к региону и сервису: подпись действительна только для конкретного региона и сервиса, что снижает риск при утечке ключа.
  • Поддержка потоковой передачи (chunked upload): для больших файлов (например, загрузка в S3) можно подписывать запросы с неизвестным заранее размером тела, используя заголовок x-amz-content-sha256: STREAMING-AWS4-HMAC-SHA256-PAYLOAD.
  • Поддержка подписанных URL (Presigned URLs): SigV4 позволяет создавать временные URL, которые дают доступ к ресурсу без передачи ключей. Это используется, например, для предоставления временного доступа к объекту в S3.
  • Использование HMAC-SHA256: более стойкий алгоритм по сравнению с SHA1, использовавшимся в SigV2.

Применение

SigV4 используется во всех публичных API AWS, включая:

Кроме того, SigV4 применяется в сторонних сервисах, совместимых с AWS API (например, MinIO, Ceph), а также в инструментах разработки (AWS CLI, AWS SDK, boto3 для Python).

Критика и ограничения

  • Сложность реализации: ручная реализация SigV4 требует точного соблюдения алгоритма, особенно при работе с нестандартными заголовками или потоковой передачей. Ошибки в форматировании приводят к ошибкам аутентификации.
  • Зависимость от точного времени: требуется синхронизация часов клиента с серверным временем AWS (допуск — 15 минут). Расхождение может привести к отказу в запросе.
  • Уязвимость при утечке ключа: если секретный ключ доступа скомпрометирован, злоумышленник может подписывать запросы от имени владельца. AWS рекомендует использовать временные ключи через AWS Identity and Access Management (IAM) Roles.
  • Отсутствие поддержки асимметричной криптографии: SigV4 использует только симметричные ключи, что ограничивает возможности для некоторых сценариев (например, подписание запросов без передачи секрета).

Альтернативы

  • AWS Signature Version 2 (SigV2): устаревшая версия, не поддерживаемая с 2020 года для большинства сервисов. Использовалась в ранних версиях AWS SDK.
  • Bearer Token (JWT): используется в некоторых сервисах AWS (например, Amazon Cognito, API Gateway) для аутентификации пользователей, но не для доступа к API AWS напрямую.
  • AWS IAM Roles Anywhere: позволяет использовать сертификаты X.509 для получения временных ключей, что может быть альтернативой для некоторых сценариев.

Источники

  1. AWS Documentation: "Signature Version 4 Signing Process" (Amazon Web Services, Inc.)
  2. AWS Documentation: "Authenticating Requests (AWS Signature Version 4)" (Amazon Web Services, Inc.)
  3. AWS Security Blog: "AWS Signature Version 4: A New Standard for API Authentication" (2014)
  4. RFC 2104: "HMAC: Keyed-Hashing for Message Authentication"
  5. AWS SDK for Python (boto3) — документация по аутентификации

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →