Аутентификация 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
, если установлено, также соответствует без учета регистра.