Amazon AWS Signature Version 4
AWS Signature Version 4 (SigV4) — это протокол аутентификации запросов к API веб-сервисов Amazon Web Services (AWS), основанный на криптографическом хэшировании с использованием симметричного ключа (секретного ключа доступа). Версия 4 является стандартным методом подписи для всех сервисов AWS, начиная с 2014 года, и обеспечивает целостность, подлинность и защиту от повторного воспроизведения (replay attacks) запросов.
История и предпосылки создания
До появления Signature Version 4 в AWS использовалась версия Signature Version 2 (SigV2), которая была менее безопасной. SigV2 применяла устаревшие алгоритмы хэширования (SHA-1) и не требовала включения в подпись некоторых критических элементов запроса, таких как тело запроса или заголовки. Это делало возможным подделку или повторное использование перехваченных запросов.
В 2011 году, после ряда инцидентов безопасности, связанных с утечкой ключей доступа, AWS начала разработку более надёжного протокола. Signature Version 4 была представлена в 2013 году для сервиса Amazon S3, а затем распространена на все остальные сервисы. С 2014 года SigV2 была объявлена устаревшей, а с 2023 года AWS полностью прекратила её поддержку для большинства сервисов.
Принцип работы
SigV4 использует алгоритм HMAC-SHA256 (Keyed-Hash Message Authentication Code с хэш-функцией SHA-256). Процесс подписи состоит из нескольких этапов, которые выполняются на стороне клиента перед отправкой запроса.
Ключевые компоненты
- Access Key ID — публичный идентификатор ключа доступа.
- Secret Access Key — секретный ключ, известный только клиенту и AWS.
- Region — регион AWS (например,
us-east-1,eu-west-1). - Service — имя сервиса (например,
s3,iam,ec2). - Timestamp — метка времени в формате ISO 8601 (например,
20240315T120000Z). - Payload — тело запроса (для GET-запросов — пустая строка).
Алгоритм подписи
- Создание канонического запроса (Canonical Request). Клиент формирует строку, включающую:
- HTTP-метод (GET, POST, PUT и т.д.)
- URI (путь запроса)
- Query-параметры (отсортированные по алфавиту)
- Заголовки (отсортированные по алфавиту, в нижнем регистре)
- Хэш тела запроса (SHA-256)
- Создание строки для подписи (String to Sign). Включает:
- Алгоритм (
AWS4-HMAC-SHA256) - Метка времени
- Область подписи (Scope):
YYYYMMDD/region/service/aws4_request - Хэш канонического запроса
- Вычисление подписи (Signature). На основе секретного ключа последовательно вычисляются HMAC-хэши:
DateKey = HMAC-SHA256("AWS4" + SecretKey, Date)DateRegionKey = HMAC-SHA256(DateKey, Region)DateRegionServiceKey = HMAC-SHA256(DateRegionKey, Service)SigningKey = HMAC-SHA256(DateRegionServiceKey, "aws4_request")Signature = HMAC-SHA256(SigningKey, StringToSign)
- Формирование заголовка Authorization. Клиент добавляет к запросу заголовок вида:
Authorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20240315/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-date, Signature=...
Преимущества перед предыдущими версиями
- Устойчивость к повторному воспроизведению. Подпись включает метку времени, которая проверяется сервером. Запросы с просроченной меткой (по умолчанию — старше 15 минут) отклоняются.
- Целостность тела запроса. Хэш тела включается в подпись, что предотвращает изменение данных в пути.
- Защита от подмены заголовков. Подписанные заголовки фиксируются, и их изменение после подписания делает запрос недействительным.
- Региональная и сервисная изоляция. Подпись привязана к конкретному региону и сервису, что ограничивает ущерб при компрометации ключа.
Недостатки и критика
- Сложность реализации. Протокол требует точного соблюдения алгоритма, включая сортировку параметров, кодирование URI и правильное формирование канонического запроса. Ошибки в деталях приводят к отклонению запроса.
- Отсутствие асимметричной криптографии. SigV4 использует симметричные ключи, что требует их безопасного хранения на стороне клиента. Для сценариев с временными ключами (например, AWS STS) применяются дополнительные механизмы.
- Зависимость от точного времени. Необходимость синхронизации часов клиента с сервером AWS (через NTP) может быть проблемой в распределённых системах.
Применение
SigV4 используется во всех сервисах AWS, включая:
- Amazon S3 — для загрузки и скачивания объектов.
- Amazon EC2 — для управления виртуальными машинами.
- AWS Lambda — для вызова функций.
- Amazon DynamoDB — для операций с базами данных.
- AWS IAM — для управления доступом.
Кроме того, протокол применяется в некоторых сторонних сервисах, совместимых с AWS API, например, MinIO (объектное хранилище с открытым исходным кодом) и Ceph (распределённое хранилище).
Альтернативы
- OAuth 2.0 — более гибкий протокол для веб-приложений, но не обеспечивает целостность тела запроса по умолчанию.
- JWT (JSON Web Tokens) — используется для аутентификации в REST API, но требует дополнительной инфраструктуры для управления токенами.
- Mutual TLS (mTLS) — обеспечивает взаимную аутентификацию на транспортном уровне, но не защищает от повторного воспроизведения на уровне приложения.
Интересные факты
- Алгоритм SigV4 был разработан командой AWS Security под руководством Эрика Бранда (Eric Brand).
- В 2020 году AWS выпустила Signature Version 4A (SigV4A) — расширение, поддерживающее асимметричную криптографию (ECDSA) для использования в средах, где симметричные ключи нежелательны.
- Некоторые сервисы AWS, такие как Amazon CloudFront, поддерживают SigV4 для аутентификации запросов к origin-серверам.
Источники
- AWS Documentation: "Signing AWS API Requests" (Signature Version 4)
- Amazon Web Services, "AWS Signature Version 4 for API Requests" (официальное руководство)
- RFC 2104: "HMAC: Keyed-Hashing for Message Authentication"
- NIST FIPS 180-4: "Secure Hash Standard (SHS)"
- AWS Security Blog: "AWS Signature Version 4: A Deep Dive"
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →