20.2. Сопоставление имен пользователей#
20.2. Сопоставление имен пользователей #
При использовании внешней системы аутентификации, такой как Ident или GSSAPI, имя пользователя операционной системы, инициировавшего соединение, может не совпадать с именем пользователя (ролью) базы данных, которое должно быть использовано. В этом случае можно применить отображение имени пользователя для сопоставления имени пользователя операционной системы с именем пользователя базы данных. Чтобы использовать отображение имени пользователя, укажите map=map-name в поле опций в файле pg_hba.conf. Эта опция поддерживается для всех методов аутентификации, которые получают имена внешних пользователей. Поскольку для разных соединений может потребоваться разное отображение, имя отображения, которое должно быть использовано, указывается в параметре map-name в файле pg_hba.conf, чтобы указать, какое отображение использовать для каждого отдельного соединения.
Отображения имен пользователей определяются в файле карты идентификаторов, который по умолчанию называется pg_ident.conf
и хранится в
каталоге данных кластера. (Однако возможно разместить файл карты
в другом месте; см. параметр конфигурации ident_file.)
Файл карты идентификации содержит строки следующих общих форм:
map-namesystem-usernamedatabase-usernameincludefileinclude_if_existsfileinclude_dirdirectory
Комментарии, пробелы и продолжения строк обрабатываются так же, как и в pg_hba.conf. map-name - это произвольное имя, которое будет использоваться для ссылки на это отображение в pg_hba.conf. Другие два поля указывают имя пользователя операционной системы и соответствующее имя пользователя базы данных. То же самое map-name может быть использовано несколько раз для указания нескольких отображений пользователей в одном отображении.
Что касается pg_hba.conf, строки в этом файле могут
быть директивами include, следуя тем же правилам.
Файл pg_ident.conf считывается при запуске и
когда основной процесс сервера получает
сигнал SIGHUP
signal. Если вы редактируете файл на активной системе, вам потребуется отправить сигнал постмастеру (используя pg_ctl reload, вызывая SQL-функцию pg_reload_conf() или используя kill -HUP), чтобы он перечитал файл.
Системное представление pg_ident_file_mappings может быть полезным для предварительного тестирования изменений в файле pg_ident.conf или для диагностики проблем, если загрузка файла не дала желаемого эффекта. Строки в представлении с непустыми полями error указывают на проблемы в соответствующих строках файла.
Нет никаких ограничений на количество пользователей базы данных, которым может соответствовать данный пользователь операционной системы, и наоборот. Таким образом, записи в карте следует рассматривать как “этот пользователь операционной системы может подключаться как этот пользователь базы данных”, а не как подразумевающие их эквивалентность. Подключение будет разрешено, если существует любая запись в карте, которая связывает имя пользователя, полученное из внешней системы аутентификации, с именем пользователя базы данных, под которым пользователь запросил подключение. Значение all может быть использовано в качестве database-username для указания, что если system-username совпадает, то этому пользователю разрешено входить как любому из существующих пользователей базы данных. Заключение all в кавычки лишает ключевое слово его особого значения.
Если database-username начинается с
символа +, то пользователь операционной системы может войти
как любой пользователь, принадлежащий этой роли, аналогично тому, как имена пользователей,
начинающиеся с +, обрабатываются в pg_hba.conf.
Таким образом, символ + означает “соответствие любой из ролей,
которые прямо или косвенно являются членами этой роли”, в то время как имя
без символа + соответствует только этой конкретной роли. Заключение
имени пользователя, начинающегося с символа +, в кавычки
лишает символ + его специального значения.
Если поле system-username начинается с косой черты (/), оставшаяся часть поля рассматривается как регулярное выражение. (См. Раздел 9.7.3.1 для получения более подробной информации синтаксиса регулярных выражений в Tantor SE). Регулярное выражение может содержать один захват или заключенное в скобки подвыражение, которое затем может быть использовано в поле 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 SE). Невозможно использовать \1
для захвата из регулярного выражения на
system-username для регулярного выражения
на database-username.
Подсказка
Имейте в виду, что по умолчанию регулярное выражение может соответствовать только части строки. Обычно рекомендуется использовать ^ и $, как показано в приведенном выше примере, чтобы гарантировать, что соответствие будет касаться всего имени пользователя системы.
Файл pg_ident.conf может использоваться вместе с файлом pg_hba.conf в Пример 20.1. В этом примере, любой пользователь, вошедший в систему с машины в сети 192.168 и не имеющий имени пользователя операционной системы bryanh, ann или robert, не будет получать доступ. Пользователю Unix robert будет разрешен доступ только при попытке подключения от имени пользователя Tantor SE bob, а не как robert или кто-либо другой. ann будет разрешено подключаться только как ann. Пользователю bryanh будет разрешено подключаться как bryanh или как guest1.
Пример 20.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