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

SASL — это инфраструктура для аутентификации в протоколах, ориентированных на соединения. В настоящее время QHB реализует два механизма аутентификации SASL: SCRAM-SHA-256 и SCRAM-SHA-256-PLUS. В будущем могут быть добавлены и другие. Перечисленные ниже этапы показывают, как в целом осуществляется аутентификация SASL, а в следующем подразделе более подробно рассматриваются SCRAM-SHA-256 и SCRAM-SHA-256-PLUS.

Поток сообщений аутентификации SASL

  1. Чтобы начать обмен аутентификационной информацией SASL, сервер передает сообщение AuthenticationSASL. Оно содержит список механизмов аутентификации SASL, которые сервер может принять, в порядке предпочтений сервера.

  2. Клиент выбирает один из поддерживаемых механизмов из списка и передает серверу сообщение SASLInitialResponse. Это сообщение содержит имя выбранного механизма и, возможно, «Начальный ответ клиента», если это использует выбранный механизм.

  3. За этим последует одно или несколько сообщений вызова от сервера и ответа от клиента. Каждый вызов от сервера передается в сообщении AuthenticationSASLContinue, за которым следует ответ от клиента в сообщении SASLResponse. Конкретные детали этих сообщений зависят от механизма.

  4. Наконец, когда обмен аутентификационной информацией успешно завершается, сервер передает сообщение AuthenticationSASLFinal и сразу за ним сообщение AuthenticationOk. В AuthenticationSASLFinal содержатся дополнительные данные от сервера клиенту, содержимое которых определяется выбранным механизмом аутентификации. Если механизм аутентификации не использует дополнительные данные, посылаемые в завершение обмена, сообщение AuthenticationSASLFinal не передается.

В случае ошибки сервер может прервать аутентификацию на любом этапе и передать ErrorMessage.



Аутентификация SCRAM-SHA-256

На сегодняшний день реализованы следующие механизмы SASL: SCRAM-SHA-256 и его вариант со связыванием каналов SCRAM-SHA-256-PLUS. Они подробно описываются в RFC 7677 и RFC 5802.

Когда в QHB применяется SCRAM-SHA-256, сервер игнорирует имя пользователя, которое клиент передает в client-first-message. Вместо этого используется имя пользователя, переданное ранее в сообщении о запуске. Хотя SCRAM требует, чтобы для имени пользователя применялась кодировка UTF-8, QHB поддерживает несколько кодировок символов, поэтому представить имя пользователя QHB в UTF-8 не всегда возможно.

Спецификация SCRAM требует, чтобы пароль тоже был в UTF-8 и обрабатывался алгоритмом SASLprep. Однако QHB не требует, чтобы для пароля применялась кодировка UTF-8. Когда устанавливается пароль пользователя, он обрабатывается SASLprep так, как если бы был в UTF-8, независимо от фактической кодировки. Однако если он представлен недопустимой для UTF-8 последовательностью байтов или содержит последовательности байтов UTF-8, которые запрещены алгоритмом SASLprep, ошибка выдана не будет, а будет использован исходный пароль, без обработки SASLprep. Это позволяет нормализовать пароль, если он в UTF-8, но при этом использовать и пароль не в UTF-8, и не требует, чтобы система знала, в какой кодировке задан пароль.

Связывание каналов поддерживается в QHB, собранной с поддержкой SSL. Имя механизма SASL для SCRAM со связыванием каналов — SCRAM-SHA-256-PLUS. QHB использует тип связывания каналов tls-server-end-point.

В SCRAM без связывания каналов сервер выбирает случайное число, которое передается клиенту для смешивания с предоставленным пользователем паролем в передаваемом в ответ хеше пароля. Хотя это препятствует успешной повторной передаче хеша пароля в последующем сеансе, но не помешает поддельному серверу между настоящим сервером и клиентом передать случайное число сервера и успешно пройти аутентификацию.

SCRAM со связыванием каналов предотвращает такие атаки через посредника путем подмешивания подписи сертификата сервера в передаваемый хеш пароля. Хотя поддельный сервер может повторить передачу сертификата настоящего сервера, у него нет доступа к закрытому ключу, соответствующему этому сертификату, и поэтому он не сможет доказать, что является его владельцем, что приведет к сбою при установке SSL-соединения.

Пример

  1. Сервер передает сообщение AuthenticationSASL. Оно содержит список механизмов аутентификации SASL, которые сервер может принять. Если сервер собран с поддержкой SSL, сюда войдут SCRAM-SHA-256-PLUS и SCRAM-SHA-256, иначе — только последний.

  2. Клиент отвечает, передавая сообщение SASLInitialResponse, где указан выбранный механизм, SCRAM-SHA-256 или SCRAM-SHA-256-PLUS. (Клиент волен выбрать любой механизм, но для большей безопасность ему следует выбирать вариант со связыванием каналов, если он это поддерживает.) В поле «Начальный ответ клиента» это сообщение содержит данные client-first-message SCRAM. client-first-message также содержит выбранный клиентом тип связывания каналов.

  3. Сервер передает сообщение AuthenticationSASLContinue, содержащее данные SCRAM server-first-message.

  4. Клиент передает сообщение SASLResponse, содержащее данные SCRAM client-final-message.

  5. Сервер передает сообщение AuthenticationSASLFinal, содержащее данные SCRAM server-final-message, и сразу за ним сообщение AuthenticationOk.