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, заголовки, тело запроса).
Процесс подписи состоит из нескольких этапов:
- Формирование канонического запроса (Canonical Request): создаётся строка, включающая HTTP-метод (GET, PUT, POST), канонический URI, канонические строки запроса (query string), канонические заголовки (в алфавитном порядке) и хеш тела запроса (SHA256). Если тело отсутствует (GET-запрос), хеш вычисляется от пустой строки.
- Формирование строки для подписи (String to Sign): строится из алгоритма (
AWS4-HMAC-SHA256), даты и времени, области действия (scope — строка видаYYYYMMDD/region/service/aws4_request) и хеша канонического запроса.
- Вычисление ключа подписи (Signing Key): на основе секретного ключа доступа, даты, региона и сервиса последовательно вычисляется HMAC-SHA256. Получается ключ, действительный только для конкретного дня, региона и сервиса.
- Вычисление подписи (Signature): с помощью ключа подписи и строки для подписи вычисляется HMAC-SHA256. Результат преобразуется в шестнадцатеричную строку.
- Добавление подписи в запрос: подпись передаётся в заголовке
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, включая:
- Amazon S3 (хранилище объектов)
- Amazon EC2 (виртуальные серверы)
- Amazon DynamoDB (NoSQL база данных)
- AWS Lambda (бессерверные вычисления)
- Amazon API Gateway (управление API)
- Amazon CloudFront (CDN)
Кроме того, 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 для получения временных ключей, что может быть альтернативой для некоторых сценариев.
Источники
- AWS Documentation: "Signature Version 4 Signing Process" (Amazon Web Services, Inc.)
- AWS Documentation: "Authenticating Requests (AWS Signature Version 4)" (Amazon Web Services, Inc.)
- AWS Security Blog: "AWS Signature Version 4: A New Standard for API Authentication" (2014)
- RFC 2104: "HMAC: Keyed-Hashing for Message Authentication"
- AWS SDK for Python (boto3) — документация по аутентификации
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →