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

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

Объектное хранилище К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

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

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

Authorization: AWS4-HMAC-SHA256
Credential=project:user@company/20220603/{region}/s3/aws4_request,
SignedHeaders=host;x-amz-content-sha256;x-amz-date,
Signature=897f92a12dbd98b20bd133efc8ffa9011eac346ffa73065928368f32311b88a4

Примечание

При осуществлении вызовов 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-хеша канонического запроса, сформированного на предыдущем шаге.

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

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

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

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

    # В качестве региона можно указать пустую строку
    
     DateKey              = HMAC-SHA256("AWS4" + "<SecretAccessKey>", "<YYYYMMDD>"))
     DateRegionKey        = HMAC-SHA256(<DateKey>, "<region>")
     DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "s3")
     SigningKey           = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")
    

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

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

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

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

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

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

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

    e9c4653776e613f24e74fff7e37ed7cac817a4921a0ead6e2bd667759ab33aed
    

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