Подписывание запросов
Многие запросы к Object Storage аутентифицируются на стороне сервиса и пользователь, отправляющий запрос, должен его подписать.
Object Storage поддерживает подпись AWS Signature V4
Процесс подписывания состоит из этапов:
- Генерирование строки для подписи.
- Генерирование подписывающего ключа.
- Подпись строки с помощью ключа.
Для подписи необходимо использовать механизм HMACsign(KEY, STRING), которая выполняет кодирование входной строки по заданному ключу.
Генерирование строки для подписи
Строка для подписи (StringToSign) зависит от сценария использования Object Storage:
- Обращение к API, совместимому с Amazon S3, без помощи SDK или специализированных утилит.
- Загрузка объектов с помощью HTML-формы.
- Подписывание URL с помощью query-параметров.
Генерирование подписывающего ключа
Чтобы сгенерировать подписывающий ключ, вам необходимо иметь статические ключи доступа к Object Storage. О том, как их получить, читайте в статье Подготовка к работе.
Чтобы сгенерировать подписывающий ключ:
-
Закодируйте дату с помощью секретного ключа:
DateKey = sign("AWS4" + "SecretKey", "yyyymmdd") -
Закодируйте регион с помощью полученного на предыдущем шаге ключа
DateKey:RegionKey = sign(DateKey, "ru-central1") -
Закодируйте сервис с помощью полученного на предыдущем шаге ключа
RegionKey:ServiceKey = sign(RegionKey, "s3") -
Получите подписывающий ключ:
SigningKey = sign(ServiceKey, "aws4_request")
Подпись строки с помощью ключа
Чтобы получить подпись строки, необходимо использовать механизм HMAC с хэширующей функцией SHA256, а полученный результат преобразовать в шестнадцатеричное представление.
signature = Hex(sign(SigningKey, StringToSign))
Отладка с помощью AWS CLI
Чтобы отладить процесс формирования канонического запроса, строки для подписи и подписывающего ключа, используйте утилиту AWS CLI с параметром --debug.
Примечание
Убедитесь, что сервисный аккаунт, от имени которого вы выполняете команды aws, имеет необходимые права для выполнения запрашиваемых действий. Например, для создания бакета назначьте сервисному аккаунту роль storage.editor на каталог. Подробнее см. Обзор способов управления доступом в Object Storage.
В терминале выполните команду для создания бакета и посмотрите, как генерируются параметры для запроса:
aws s3api create-bucket \
--endpoint-url=https://storage.yandexcloud.net \
--bucket <имя_бакета> \
--debug
Результат:
2024-06-03 13:02:36,238 - MainThread - botocore.auth - DEBUG - CanonicalRequest:
PUT
/<имя_бакета>
host:storage.yandexcloud.net
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b********
x-amz-date:20240603T100236Z
host;x-amz-content-sha256;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b********
2024-06-03 13:02:36,238 - MainThread - botocore.auth - DEBUG - StringToSign:
AWS4-HMAC-SHA256
20240603T100236Z
20240603/ru-central1/s3/aws4_request
7877a13bafaa45f9751e7f345b64a63acc6de279ff927736e906d7c5********
2024-06-03 13:02:36,238 - MainThread - botocore.auth - DEBUG - Signature:
90545034742d1e057c8eeb2cca3c23a38a3ced5ef847f61ac80cb8e1********