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