Обзор pg_ident.conf
Файл pg_ident.conf позволяет настроить сопоставление имен пользователей для методов аутентификации, использующих внешние идентификаторы: имена пользователей операционной системы, принципалы Kerberos и клиентские SSL-сертификаты. Сопоставления применяются в соответствии с правилами, заданными в файле pg_hba.conf.
На мастер-хосте файл pg_ident.conf находится в каталоге $MASTER_DATA_DIRECTORY.
Вы можете получить дополнительную информацию о файле pg_ident.conf в соответствующем разделе документации PostgreSQL: User Name Maps.
Поддерживаемые методы аутентификации
Сопоставление имен пользователей поддерживается следующими методами аутентификации:
-
peer — сопоставляет имя пользователя операционной системы с ролью Greengage DB для локальных подключений через сокеты домена Unix.
-
ident — сопоставляет имя пользователя операционной системы с ролью Greengage DB для TCP/IP-подключений с использованием протокола Ident. См. раздел Настройка сопоставления пользователей.
-
gss — сопоставляет имя принципала Kerberos с ролью Greengage DB. См. раздел Настройка GSSAPI-аутентификации.
-
cert — сопоставляет поле
CN(Common Name) клиентского SSL-сертификата с ролью Greengage DB. См. раздел Сопоставление CN (Common Name) и имени пользователя.
Обзор формата pg_ident.conf
Для включения сопоставления имен пользователей необходимо изменить файлы pg_hba.conf и pg_ident.conf.
В pg_hba.conf имя сопоставления задается через параметр аутентификации map:
# pg_hba.conf
# connection-type database user address auth-method auth-options
... ... ... ... ... map=<map-name>
В файле pg_ident.conf определите правило сопоставления, используя то же имя:
# pg_ident.conf
<map-name> <system-username> <database-username>
...
где:
-
map-name— произвольное имя сопоставления, на которое можно ссылаться в файле pg_hba.conf. -
system-username— внешний идентификатор пользователя, полученный от метода аутентификации (например, системное имя пользователя, Kerberos-принципал илиCNиз SSL-сертификата). -
database-username— соответствующее имя пользователя базы данных.
Одно и то же значение map-name можно использовать для определения нескольких сопоставлений.
Количество пользователей базы данных, которым может соответствовать один внешний идентификатор, не ограничено (и наоборот). Каждая запись в файле сопоставления определяет явное разрешение: указанный внешний идентификатор может войти как соответствующий пользователь базы данных. Это не означает полную идентичность или эквивалентность двух учетных записей.
Аутентификация проходит успешно, если при подключении в файле сопоставления найдется хотя бы одна запись, связывающая идентификатор, полученный от внешнего метода аутентификации, с пользователем базы данных, указанным клиентом.
Настройка сопоставления пользователей
В этом разделе приведен пример настройки сопоставления имен пользователей для подключений, использующих метод аутентификации ident.
Создание нового пользователя операционной системы
Перед определением сопоставления в pg_ident.conf создайте пользователя операционной системы:
-
Войдите на мастер-хост под пользователем с правами
sudo. -
Создайте системного пользователя
dbadmin:$ sudo useradd dbadmin -r -m -s /bin/bash
Редактирование pg_hba.conf и pg_ident.conf
-
Переключитесь на пользователя
gpadmin:$ sudo su - gpadmin -
Откройте pg_hba.conf для редактирования:
$ vi $MASTER_DATA_DIRECTORY/pg_hba.confДобавьте следующую строку, чтобы включить сопоставление пользователей для метода аутентификации
ident:# connection-type database user auth-method auth-options local all gpadmin ident map=admin_map -
Откройте файл pg_ident.conf:
$ vi $MASTER_DATA_DIRECTORY/pg_ident.confДобавьте следующие записи сопоставления:
# MAPNAME SYSTEM-USERNAME PG-USERNAME admin_map gpadmin gpadmin admin_map dbadmin gpadminЭти записи позволяют системным пользователям
gpadminиdbadminподключаться от имени роли базы данныхgpadmin, используя сопоставлениеadmin_map. -
Перезагрузите конфигурацию для применения изменений:
$ gpstop -u
Подключение к базе данных
-
Переключитесь на созданного пользователя
dbadmin:$ sudo su - dbadmin -
Настройте окружение Greengage DB:
$ source /usr/local/gpdb/greengage_path.shПуть зависит от того, как был установлен Greengage DB.
-
Попробуйте подключиться без указания пользователя базы данных. По умолчанию
psqlиспользует имя текущего пользователя операционной системы:$ psql postgresПопытка подключения завершается ошибкой, поскольку pg_hba.conf разрешает подключения только для пользователя базы данных
gpadmin:FATAL: no pg_hba.conf entry for host "[local]", user "dbadmin", database "postgres", SSL off
-
Попробуйте подключиться как
gpadmin:$ psql postgres -U gpadminПодключение выполняется успешно, поскольку для пользователя операционной системы
dbadminнастроено сопоставление с пользователем базы данныхgpadmin:psql (9.4.26) Type "help" for help. postgres=#
Регулярные выражения
Если значение в поле system-username начинается с косой черты (/), остальная часть интерпретируется как регулярное выражение.
Подробности о синтаксисе регулярных выражений PostgreSQL см. в разделе Regular Expression Details.
Регулярное выражение может включать одну группу (подвыражение в скобках), на которую можно ссылаться в поле database-username как \1.
Это позволяет сопоставлять несколько имен пользователей в одной строке, что особенно удобно для подстановок.
Пример pg_hba.conf ниже включает аутентификацию GSSAPI для пользователей из группы gss_users:
# connection-type database user address auth-method auth-options
host all +gss_users samenet gss include_realm=1 krb_realm=EXAMPLE.COM map=user_map
Параметр include_realm=1 сохраняет область (realm) Kerberos в аутентифицированном принципале пользователя.
Чтобы удалить область из имен пользователей, оканчивающихся на @EXAMPLE.COM, обновите pg_ident.conf следующим образом:
# MAPNAME SYSTEM-USERNAME PG-USERNAME
user_map /^(.*)@EXAMPLE\.COM$ \1
Чтобы разрешить любому пользователю с системным именем, заканчивающимся на @OTHERDOMAIN.ORG, подключаться как guest, добавьте следующее сопоставление:
# MAPNAME SYSTEM-USERNAME PG-USERNAME
user_map /^(.*)@OTHERDOMAIN\.ORG$ guest
Помните, что по умолчанию регулярное выражение может совпасть с любой частью строки.
Чтобы задать совпадение со всем системным именем пользователя, используйте символы ^ и $, как показано в примере выше.