53.3. SASL аутентификация#
53.3. SASL аутентификация #
SASL — это фреймворк для аутентификации в протоколах с установлением соединения. В данный момент Tantor SE реализует три механизма аутентификации SASL: SCRAM-SHA-256, SCRAM-SHA-256-PLUS и OAUTHBEARER. В будущем могут быть добавлены и другие. Следующие шаги иллюстрируют, как в общем выполняется аутентификация SASL, а в следующих подразделах приводятся более подробные сведения о конкретных механизмах.
Поток сообщений аутентификации SASL
Для начала обмена аутентификацией SASL сервер отправляет сообщение AuthenticationSASL. Оно включает список механизмов аутентификации SASL, которые сервер может принять, в предпочтительном порядке сервера.
Клиент выбирает один из поддерживаемых механизмов из списка и отправляет серверу сообщение SASLInitialResponse. Сообщение включает имя выбранного механизма и необязательный начальный ответ клиента, если выбранный механизм его использует.
Следует ожидать одно или несколько сообщений server-challenge и client-response. Каждый server-challenge отправляется в сообщении AuthenticationSASLContinue, за которым следует ответ клиента в сообщении SASLResponse. Подробности сообщений зависят от конкретного механизма.
Наконец, когда обмен аутентификацией успешно завершен, сервер отправляет необязательное сообщение AuthenticationSASLFinal, за которым сразу следует сообщение AuthenticationOk. AuthenticationSASLFinal содержит дополнительные данные от сервера к клиенту, содержание которых зависит от выбранного механизма аутентификации. Если механизм аутентификации не использует дополнительные данные, отправляемые при завершении, сообщение AuthenticationSASLFinal не отправляется.
При возникновении ошибки сервер может прервать аутентификацию на любом этапе и отправить сообщение об ошибке.
53.3.1. Аутентификация SCRAM-SHA-256 #
SCRAM-SHA-256
, и его вариант с привязкой к каналу
SCRAM-SHA-256-PLUS
, являются механизмами аутентификации на основе пароля. Они подробно описаны в
RFC 7677
и RFC 5802.
Когда в PostgreSQL используется SCRAM-SHA-256, сервер игнорирует имя пользователя,
которое клиент отправляет в client-first-message
. Вместо этого
используется имя пользователя, которое уже было отправлено в сообщении о запуске.
Tantor SE поддерживает несколько кодировок символов, в то время как SCRAM
требует использования UTF-8 для имени пользователя, поэтому может быть невозможно
представить имя пользователя PostgreSQL в UTF-8.
Спецификация SCRAM предписывает, что пароль также должен быть в кодировке UTF-8 и обрабатываться с помощью алгоритма SASLprep. Однако Tantor SE не требует использования UTF-8 для пароля. При установке пароля пользователя он обрабатывается с помощью SASLprep, как если бы он был в кодировке UTF-8, независимо от фактической кодировки. Однако, если это не является допустимой последовательностью байтов UTF-8 или содержит последовательности байтов UTF-8, запрещенные алгоритмом SASLprep, будет использоваться исходный пароль без обработки SASLprep, вместо генерации ошибки. Это позволяет нормализовать пароль, когда он находится в кодировке UTF-8, но все же позволяет использовать пароль, не находящийся в кодировке UTF-8, и не требует знания системой кодировки пароля.
Привязка канала поддерживается в сборках PostgreSQL с поддержкой SSL. Имя механизма SASL для SCRAM с привязкой канала - SCRAM-SHA-256-PLUS
. Тип привязки канала, используемый PostgreSQL - tls-server-end-point
.
В SCRAM без привязки канала сервер выбирает случайное число, которое передается клиенту для смешивания с предоставленным пользователем паролем в переданном хеше пароля. Это предотвращает успешное повторное передачу хеша пароля в последующей сессии, но не предотвращает поддельный сервер между реальным сервером и клиентом от передачи случайного значения сервера и успешной аутентификации.
SCRAM с привязкой канала предотвращает подобные атаки "человек посередине", смешивая подпись сертификата сервера в передаваемый хеш пароля. Хотя фальшивый сервер может повторно передать сертификат реального сервера, у него нет доступа к закрытому ключу, соответствующему этому сертификату, и поэтому он не может доказать, что является владельцем, что приводит к сбою SSL-соединения.
Пример
Сервер отправляет сообщение AuthenticationSASL. Оно включает список механизмов аутентификации SASL, которые сервер может принять. Это будет
SCRAM-SHA-256-PLUS
иSCRAM-SHA-256
, если сервер собран с поддержкой SSL, иначе только последний.Клиент отвечает, отправляя сообщение SASLInitialResponse, которое указывает выбранный механизм,
SCRAM-SHA-256
илиSCRAM-SHA-256-PLUS
. (Клиент может выбрать любой механизм, но для лучшей безопасности он должен выбрать вариант с привязкой канала, если он может его поддерживать). В поле Initial Client response сообщение содержит SCRAMclient-first-message
.client-first-message
также содержит выбранный клиентом тип привязки канала.Сервер отправляет сообщение AuthenticationSASLContinue с содержимым SCRAM
server-first-message
.Клиент отправляет сообщение SASLResponse с содержимым SCRAM
client-final-message
.Сервер отправляет сообщение AuthenticationSASLFinal с
server-final-message
, сразу за которым следует сообщение AuthenticationOk.
53.3.2. Аутентификация OAUTHBEARER #
OAUTHBEARER
является механизмом на основе токенов для федеративной
аутентификации. Он подробно описан в
RFC 7628.
Типичный обмен отличается в зависимости от того, есть ли у клиента уже сохраненный маркер доступа для текущего пользователя. Если его нет, обмен будет происходить через два соединения: первое соединение "обнаружения" для получения метаданных OAuth с сервера, и второе соединение для отправки маркера после того, как клиент его получит. (libpq в настоящее время не реализует метод кеширования как часть своего встроенного процесса, поэтому использует обмен через два соединения.)
Этот механизм инициируется клиентом, как и SCRAM. Начальный ответ клиента
состоит из стандартного заголовка "GS2", используемого SCRAM, за которым следует список
key=value
пар. Единственный ключ, поддерживаемый
сервером в настоящее время, это auth
, который содержит токен носителя.
OAUTHBEARER
дополнительно указывает три необязательных
компонента начального ответа клиента (это authzid
заголовка GS2, и ключи host
и
port
), которые в настоящее время игнорируются сервером.
OAUTHBEARER
не поддерживает привязку канала, и не существует механизма "OAUTHBEARER-PLUS". Этот механизм не использует данные сервера во время успешной аутентификации, поэтому сообщение AuthenticationSASLFinal не используется в обмене.
Пример
Во время первого обмена сервер отправляет сообщение AuthenticationSASL с рекламируемым механизмом
OAUTHBEARER
.Клиент отвечает, отправляя сообщение SASLInitialResponse, которое указывает механизм
OAUTHBEARER
. Предполагая, что у клиента еще нет действительного маркера-носителя для текущего пользователя, полеauth
пусто, указывая на соединение для обнаружения.Сервер отправляет сообщение AuthenticationSASLContinue, содержащее ошибку
status
вместе с известным URI и областями, которые клиент должен использовать для проведения OAuth-потока.Клиент отправляет сообщение SASLResponse, содержащее пустое множество (один
0x01
байт), чтобы завершить свою часть обмена обнаружением.Сервер отправляет ErrorMessage, чтобы завершить первый обмен с ошибкой.
На этом этапе клиент проводит один из множества возможных OAuth-потоков для получения токена-носителя, используя любые метаданные, с которыми он был настроен, в дополнение к тем, которые предоставлены сервером. (Это описание оставлено намеренно расплывчатым;
OAUTHBEARER
не определяет и не предписывает какой-либо конкретный метод получения токена.)Как только у него есть токен, клиент переподключается к серверу для финального обмена:
Сервер снова отправляет сообщение AuthenticationSASL с
OAUTHBEARER
механизмом, указанным в рекламе.Клиент отвечает, отправляя сообщение SASLInitialResponse, но на этот раз поле
auth
в сообщении содержит маркер носителя, который был получен в процессе работы клиента.Сервер проверяет токен в соответствии с инструкциями поставщика токенов. Если клиент авторизован для подключения, он отправляет сообщение AuthenticationOk, чтобы завершить обмен SASL.