19.2. Сопоставление имен пользователей#

19.2. Сопоставление имен пользователей

19.2. Сопоставление имен пользователей #

При использовании внешней системы аутентификации, такой как 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, строки в этом файле могут быть директивами include, следуя тем же правилам.

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

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

Если поле system-username начинается с косой черты (/), оставшаяся часть поля рассматривается как регулярное выражение. (См. Раздел 9.7.3.1 для получения более подробной информации синтаксиса регулярных выражений в Tantor BE). Регулярное выражение может содержать один захват или заключенное в скобки подвыражение, которое затем может быть использовано в поле database-username как \1 (обратная косая черта и единица). Это позволяет сопоставлять несколько имен пользователей в одной строке, что особенно полезно для простых замен синтаксиса. Например, эти записи

mymap   /^(.*)@mydomain\.com$      \1
mymap   /^(.*)@otherdomain\.com$   guest

удалит часть домена для пользователей с системными именами, которые заканчиваются на @mydomain.com, и позволит любому пользователю, чье системное имя заканчивается на @otherdomain.com, войти как guest. Кавычки вокруг database-username, содержащего \1 не заставляют \1 терять свое специальное значение.

Если поле database-username начинается с косой черты (/), оставшаяся часть поля рассматривается как регулярное выражение (см. Раздел 9.7.3.1 для подробностей о синтаксисе регулярных выражений в Tantor BE). Невозможно использовать \1 для захвата из регулярного выражения на system-username для регулярного выражения на database-username.

Подсказка

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

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

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

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

Пример 19.2. Пример файла 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