Перейти к основному содержимому

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

примечание

Эта страница переведена при помощи нейросети GigaChat.

GSSAPI — общепринятый промышленный стандарт безопасного механизма аутентификации, описанный в спецификации RFC 2743. PostgreSQL поддерживает этот механизм для подтверждения подлинности клиентов, шифрования трафика или одновременно обоих процессов. Благодаря GSSAPI возможна автоматическая аутентификация («единственный вход»), безопасная передача данных и защита соединений.

Поддержка GSSAPI активируется при компиляции PostgreSQL.

Когда GSSAPI интегрируется с Kerberos, он использует стандартные принципы службы (имена для аутентификации) формата _service/_hostname@REALM_. Сервер PostgreSQL не хранит информацию о конкретном принципе внутри программы; эта информация содержится в специальном файле keytab, который читает сервер для идентификации себя. Если в файле keytab указаны разные принципы, сервер принимает любой из них. Область действия сервера определяется настройками конфигурационного файла Kerberos.

Клиенты при подключении должны указывать правильное имя принципала сервера, к которому хотят присоединиться. Формат принципала выглядит как _service_/<_hostname_>@<_REALM_>. Значением по умолчанию для _service_ служит postgres, но оно может быть изменено с помощью параметра подключения krbsrvname библиотеки libpq. Полностью квалифицированное имя хоста (_hostname_) предоставляется клиентом, а область действия — это настроенная в конфигурационных файлах Kerberos предпочтительная область.

Каждый клиент обладает собственным принципалом для своей личности и должен обладать валидным билетом для этого принципала. Для успешной аутентификации клиентский принципал должен соответствовать имени пользователя базы данных PostgreSQL. Это достигается через специальный конфигурационный файл, выполняющий сопоставление принципов с именами пользователей. Либо принципал клиента может быть использован целиком в PostgreSQL без дополнительного сопоставления.

PostgreSQL поддерживает простое сопоставление клиентского принципала с именем пользователя путем исключения из него области действия. Такой способ устарел и не рекомендован, поскольку при нем становится невозможным отличать пользователей с совпадающими именами, но разными областями. Для включения этого способа установите параметр include_realm равным нулю. Простота этого подхода компенсирует риски при условии правильной настройки параметров krb_realm и поддержки одной единственной области.

Расположение файла ключей сервера задается конфигурационным параметром krb_server_keyfile. Из соображений безопасности желательно создавать уникальный ключ для сервера PostgreSQL отдельно от системного файла ключей. Доступ к этому файлу должен быть ограничен для учетной записи сервера PostgreSQL (см. раздел Учетная запись пользователя PostgreSQL).

Создание файла keytab выполняется инструментами Kerberos; детальное руководство смотрите в документации Kerberos. Ниже пример создания файла keytab с инструментом kadmin для реализации Kerberos 5 совместимой с MIT:

kadmin% addprinc -randkey postgres/server.my.domain.org
kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org

Следующие параметры аутентификации поддерживаются для метода аутентификации GSSAPI:

include_realm

: Значение 0 для параметра include_realm приводит к удалению имени области из учетной записи клиента перед сопоставлением с именами пользователей базы данных (описано в разделе «Карты сопоставления имен пользователей»). Такая настройка устаревшая и нежелательная, так как снижает безопасность в многооблачных средах, особенно при использовании параметра krb_realm.

Рекомендуемый вариант — оставить параметр include_realm со значением по умолчанию (1) и настроить явное сопоставление имен пользователей в файле pg_ident.conf, чтобы правильно преобразовывать имена аккаунтов Kerberos в имена пользователей PostgreSQL.

map

: Этот параметр управляет сопоставлением клиентских принципалов GSSAPI/Kerberos с именами пользователей базы данных. Подробности читайте в разделе «Карты сопоставления имен пользователей».

Для примера рассмотрим принципалы типа username@EXAMPLE.COM или реже встречающийся формат username/hostbased@EXAMPLE.COM. Имя пользователя, используемое для сопоставления, будет полным принципалом (username@EXAMPLE.COM или username/hostbased@EXAMPLE.COM), если параметр include_realm равен 1. Если же include_realm установлен в 0, сопоставлению подвергается сокращенное имя пользователя без домена, например, просто username или username/hostbased.

krb_realm

: Определяет область действия для сопоставления с основными именами пользователей. Если параметр задан, принимаются только пользователи указанной области. Без установленного значения разрешается подключение пользователей из различных областей в зависимости от правил сопоставления имен.

В дополнение к этим настройкам, которые могут различаться для разных записей pg_hba.conf, существует глобальный параметр конфигурации сервера krb_caseins_users. Если оно установлено в true, основные принципы клиента сопоставляются с записями карты пользователя без учета регистра. krb_realm, если установлено, также соответствует без учета регистра.