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

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-запросов — пустая строка).

Алгоритм подписи

  1. Создание канонического запроса (Canonical Request). Клиент формирует строку, включающую:
  • HTTP-метод (GET, POST, PUT и т.д.)
  • URI (путь запроса)
  • Query-параметры (отсортированные по алфавиту)
  • Заголовки (отсортированные по алфавиту, в нижнем регистре)
  • Хэш тела запроса (SHA-256)
  1. Создание строки для подписи (String to Sign). Включает:
  • Алгоритм (AWS4-HMAC-SHA256)
  • Метка времени
  • Область подписи (Scope): YYYYMMDD/region/service/aws4_request
  • Хэш канонического запроса
  1. Вычисление подписи (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)
  1. Формирование заголовка 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 →