Подписывание запросов
Многие запросы к 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********