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

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

примечание

Эта страница переведена при помощи нейросети 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