Карты имен пользователей
Эта страница переведена при помощи нейросети 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
Комментарии, пробелы и продолжения строк обрабатываются так же, как в pg_hba.conf. map-name --- это произвольное имя, которое будет использоваться для ссылки на это сопоставление в pg_hba.conf. Два других поля указывают имя пользователя операционной системы и соответствующее имя пользователя базы данных. Один и тот же map-name может быть использован повторно для указания нескольких сопоставлений пользователей в одной карте.
Нет никаких ограничений относительно того, сколько пользователей базы данных может соответствовать одному пользователю операционной системы или наоборот. Таким образом, записи в карте должны рассматриваться как означающие «этот пользователь операционной системы имеет право подключиться к этому пользователю базы данных», а не подразумевать их эквивалентность. Подключение будет разрешено, если карта содержит хотя бы одну запись, связывающую имя пользователя из внешней системы аутентификации с именем пользователя базы данных, запрашиваемого пользователем.
Если поле system-username начинается со слэша (/), оставшаяся часть поля обрабатывается как регулярное выражение. Смотрите раздел «Детали регулярного выражения» для получения подробной информации о синтаксисе регулярных выражений PostgreSQL. Регулярное выражение может включать один захват или подвыражение в скобках. Часть имени системного пользователя, совпавшая с захватом, может быть указана в поле 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, показан в Примере 21.2. В этом примере любому, кто вошел в систему на машине в сети 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