Аутентификация#

Запросы к объектному хранилищу могут быть как аутентифицированными, так и неаутентифицированными. Неаутентифицированные запросы могут быть отправлены анонимными пользователями.

Объектное хранилище К2 Облака поддерживает следующие версии аутентификации AWS:

  • Signature Version 2 (AWSv2);

  • Signature Version 4 (AWSv4).

Аутентифицированные запросы должны содержать заголовок Authorization. Заголовок для аутентификации запроса в соответствии с AWSv4 включает следующие параметры:

Параметр

Описание

AWS4-HMAC-SHA256

Тип подписи AWS (AWS4) и алгоритм подписи (HMAC-SHA256)

Credential

Ключ доступа и информация о запросе в виде: <access-key>/<data>/<region>/<service>/aws4_request

SignedHeaders

Список используемых при вычислении подписи заголовков в нижнем регистре и в алфавитном порядке, например, host;x-amz-content-sha256;x-amz-date

Signature

Подпись для аутентификации запроса, вычисляемая с использованием ключа доступа, хеша тела запроса и запроса в каноническом представлении.

Пример заголовка для аутентификации запроса к сервису S3:

Authorization: AWS4-HMAC-SHA256
Credential=project:user@company/20220603/<region>/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=5d825383bc6e17bca652f2dd348eae704a30ccf900459beec3d20ddd397a0b16

Примечание

При осуществлении вызовов REST API напрямую из кода необходимо самостоятельно рассчитать подпись для аутентификации вызова. Это достаточно громоздкая процедура, поэтому для работы с API мы рекомендуем использовать AWS CLI или S3cmd.

При использовании для аутентификации AWS Signature Version 4 подпись рассчитывается следующим образом.

Подпись запроса#

Расчёт подписи состоит из четырёх основных этапов:

  1. Составление канонического заголовка. Канонически заголовок включает:

    • Используемый метод HTTP-запроса.

    • Компонент пути из запроса.

    • Параметры запроса в алфавитном порядке. Если параметры отсутствуют, то вставляется пустая строка.

    • Список подписываемых заголовков и их значений через двоеточие. Заголовки перечисляются в алфавитном порядке и пишутся в нижнем регистре без пробелов. Каждая пара заголовков и значений начинается с новой строки (\n).

    • Список подписываемых заголовков без значений в нижнем регистре. Заголовки перечисляются в алфавитном порядке и разделяются точкой с запятой.

    • SHA256-хеш тела запроса в шестнадцатеричном представлении. Если тело запроса отсутствует, то вычисляется хеш пустой строки.

    Каждый компонент канонического заголовка начинается с новой строки.

    Для запроса

    GET /?acl HTTP/1.1
    Host: bucket1.s3.k2.cloud
    X-Amz-Content-Sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    X-Amz-Date: 20220603T153057Z
    

    каноническое представление имеет следующий вид:

    GET
    /
    acl=
    host:bucket1.s3.k2.cloud
    x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    x-amz-date:20220603T153057Z
    
    host;x-amz-content-sha256;x-amz-date
    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
    
  2. Формирование подписываемой строки. При её генерации используется шестнадцатеричное представление SHA256-хеша канонического запроса, сформированного на предыдущем шаге.

    # Вместо региона при расчётах указывается пустая строка, а в качестве сервиса — s3.
    
    StringToSign = "AWS4-HMAC-SHA256" + "\n" +
      <YYYYMMDD'T'HHMMSS'Z'> + "\n" +
      <YYYYMMDD> + "/" + "<region>" + "/" + "<service>/aws4_request" + "\n" +
      Hex(SHA256Hash(<CanonicalRequest>))
    

    Для канонического заголовка из предыдущего шага подписываемая строка имеет вид:

    AWS4-HMAC-SHA256
    20220603T153057Z
    20220603/<region>/<service>/aws4_request
    954116b5d4a2103251ada9505859fffd57339730a4327eecd63451dd7acb1eeb
    
  3. Вычисление подписывающего ключа. Ключ вычисляется на основе секретного ключа доступа, который содержится в настройках доступа к API (настройки можно скачать из вашего профиля в консоли облака).

    Для получения подписывающего ключа последовательно вычисляется четыре кода аутентификации сообщений (HMAC) с использованием хеш-функции SHA256. Соответствующие функции реализованы во многих языках программирования. При расчётах ключей следует использовать бинарный дайджест (digest), а не шестнадцатеричный хеш (hex-digest).

    DateKey              = HMAC-SHA256("AWS4" + "<SecretAccessKey>", "<YYYYMMDD>"))
    DateRegionKey        = HMAC-SHA256(<DateKey>, "<region>")
    DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<service>")
    SigningKey           = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")
    

    Например, для секретного ключа

    SecretAccessKey = '7w!z%C&F)J@NcRfUjXn2r5u8x/A?D(G-'
    

    соответствующий подписывающий ключ будет иметь вид (в шестнадцатеричном представлении):

    SigningKey = fce6031213c5263262c4795957d5bb10614e66f5008bfcf3a2668a7c19380e73
    
  4. Вычисление подписи.

    Для вычисления подписи используется та же функция хеширования с ключом, что и для расчёта самих ключей. В качестве входных параметров передаются подписывающий ключ (SigningKey) и подписываемая строка (StringToSign). Результат следует конвертировать в шестнадцатеричный формат.

    Signature = Hex(HMAC-SHA256(<SigningKey>,<StringToSign>))
    

    Пример подписи:

    5d825383bc6e17bca652f2dd348eae704a30ccf900459beec3d20ddd397a0b16
    

Более подробно процедура генерации подписи для аутентификации запроса описана в документации на Amazon S3.