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

Карты сопоставления имен пользователей

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

При использовании внешней системы аутентификации, такой как Ident или GSSAPI, имя пользователя операционной системы, инициировавшего соединение, может не совпадать с именем пользователя базы данных (роли), которое должно использоваться. В этом случае можно применить карту имен пользователей для сопоставления имени пользователя операционной системы с пользователем базы данных. Чтобы использовать сопоставление имен пользователей, укажите map=map-name в поле параметров в pg_hba.conf. Эта опция поддерживается для всех методов аутентификации, которые получают внешние имена пользователей. Поскольку для разных соединений могут потребоваться разные сопоставления, имя карты, которую необходимо использовать, указывается в параметре map-name в pg_hba.conf, чтобы указать, какую карту использовать для каждого отдельного соединения.

Карты сопоставления имен пользователей определяются в файле карты идентификаторов, который по умолчанию называется pg_ident.conf и хранится в каталоге данных кластера. (Однако возможно разместить файл карты в другом месте; см. параметр конфигурации ident_file.) Файл карты идентификаторов содержит строки общего вида:

map-name system-username database-username
include file
include_if_exists file
include_dir directory

Комментарии, пробелы и продолжения строк обрабатываются так же, как в pg_hba.conf. map-name --- это произвольное имя, которое будет использоваться для ссылки на это сопоставление в pg_hba.conf. Два других поля указывают имя пользователя операционной системы и соответствующее имя пользователя базы данных. Один и тот же map-name может быть использован повторно для указания нескольких сопоставлений пользователей в одной карте.

Что касается pg_hba.conf, строки в этом файле могут быть директивами включения, которые следуют тем же правилам.

Файл pg_ident.conf прочитывается при запуске системы, а также в тот момент, когда основной сервер получает сигнал SIGHUP. Если редактируется файл во время работы системы, необходимо послать сигнал процессу postmaster (используя pg_ctl reload, вызвав SQL-функцию pg_reload_conf() или выполнив kill -HUP), чтобы он прочел обновленный файл.

Системное представление pg_ident_file_mappings может быть полезно для предварительной проверки изменений в файле pg_ident.conf или для диагностики проблем, когда перезагрузка этого файла не дает желаемого эффекта. Строки в этом представлении, содержащие в поле error не NULL, указывают на проблемы в соответствующих строках файла.

Нет никаких ограничений по количеству пользователей баз данных, на которые может ссылаться пользователь операционной системы, и наоборот. Тем не менее записи в файле скорее подразумевают, что «пользователь этой операционной системы может подключиться как пользователь этой базы данных», нежели показывают, что эти имена пользователей эквивалентны. Подключение разрешается, если существует запись в файле сопоставления, соединяющая имя, полученное от внешней системы аутентификации, с именем пользователя базы данных, под которым пользователь хочет подключиться. Значение all можно использовать в качестве имени-пользователя-БД, чтобы указать, что если оно совпадает с именем-системного-пользователя, то этому пользователю разрешено входить в систему как любому из существующих пользователей базы данных. Ключевое слово all теряет свое особое значение.

Если имя-пользователя-БД начинается с символа +, пользователь операционной системы может войти в систему как любой пользователь, включенный в эту роль, аналогично тому, как имена пользователей, начинающиеся с +, обрабатываются в pg_hba.conf. Таким образом, знак + означает «совпадение любых ролей, которые прямо или косвенно являются членами роли», тогда как имя без знака + является подходящим только для этой конкретной роли. Заключение имени пользователя, начинающегося с +, в кавычки приводит к тому, что + теряет свое особое значение.

В регулярном выражении может быть одна захватывающая подвыражение или подвыражение в скобках, которое затем можно сослаться в поле database-username как \1 (обратная косая черта-один). Это позволяет сопоставлять несколько имен пользователей в одной строке, что особенно полезно для простых синтаксических замен.

Например, удалит доменную часть для пользователей с системными именами пользователей, которые заканчиваются на @mydomain.com, и разрешит любому пользователю, чье системное имя заканчивается на @otherdomain.com, войти в систему как guest.

mymap   /^(.*)@mydomain\.com$      \1
mymap /^(.*)@otherdomain\.com$ guest
Совет

Имейте в виду, что по умолчанию регулярное выражение может соответствовать только части строки. Обычно целесообразно использовать ^ и $, как показано в приведенном выше примере, чтобы заставить соответствие быть ко всему имени системного пользователя.

Файл pg_ident.conf считывается при запуске и когда основной серверный процесс получает сигнал SIGHUP. При редактировании файла в активной системе необходимо послать сигнал постмастеру (с использованием команд pg_ctl reload, вызова SQL-функции pg_reload_conf() или отправки сигнала kill -HUP) для перечитывания файла.

Представление системы pg_ident_file_mappings может быть полезно для предварительного тестирования изменений файла pg_ident.conf, или для диагностики проблем, если загрузка файла не дала желаемого эффекта. Строки в представлении с непустыми полями error указывают на проблемы в соответствующих строках файла.

Файл, который можно использовать вместе с файлом pg_hba.conf в примере записи pg_hba.conf, показан в Примере «*Пример файла pg_ident.conf». В этом примере любому, кто вошел в систему на машине в сети 192.168, у которой нет имени пользователя операционной системы bryanh, ann или robert, не будет предоставлен доступ. Пользователь Unix robert сможет получить доступ только тогда, когда он попытается подключиться как пользователь PostgreSQL bob, а не как robert или кто-либо еще. ann сможет подключаться только как ann. Пользователь bryanh сможет подключаться либо как bryanh, либо как guest1.

Пример файла pg_ident.conf:

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

omicron bryanh bryanh
omicron ann ann
# bob has user name robert on these machines
omicron robert bob
# bryanh can also connect as guest1
omicron bryanh guest1