20.2. Файл сопоставления имён пользователей #
Когда используется внешняя система аутентификации, например Ident или GSSAPI, имя пользователя операционной системы, устанавливающего подключение, может не совпадать с именем целевого пользователя (роли) базы данных. В этом случае можно применить сопоставление имён пользователей, чтобы сменить имя пользователя операционной системы на имя пользователя БД. Чтобы задействовать сопоставление имён, укажите map
=имя-сопоставления
в поле параметров в pg_hba.conf
. Этот параметр поддерживается для всех методов аутентификации, которые принимают внешние имена пользователей. Так как для разных подключений могут требоваться разные сопоставления, сопоставление определяется параметром имя-сопоставления
в pg_hba.conf
для каждого отдельного подключения.
Сопоставления имён пользователя определяются в файле сопоставления ident, который по умолчанию называется pg_ident.conf
и хранится в каталоге данных кластера. (Файл сопоставления может быть помещён и в другое место, обратитесь к информации о настройке параметра ident_file.) Файл сопоставления ident содержит строки общих форм:
имя-сопоставления
имя-системного пользователя
имя-пользователя-БД
include
файл
include_if_exists
файл
include_dir
каталог
Комментарии и пробелы применяются так же, как и в файле pg_hba.conf
. имя-сопоставления
является произвольным именем, на которое будет ссылаться файл сопоставления файла pg_hba.conf
. Два других поля указывают имя пользователя операционной системы и соответствующее имя пользователя базы данных. имя-сопоставления
может быть использовано неоднократно, чтобы указывать множественные сопоставления пользовательских имён в рамках одного файла сопоставления.
Что касается 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
. Таким образом, знак +
означает «совпадение любых ролей, которые прямо или косвенно являются членами роли», тогда как имя без знака +
является подходящим только для этой конкретной роли. Заключение имени пользователя, начинающегося с +
, в кавычки приводит к тому, что +
теряет своё особое значение.
Если поле имени-системного-пользователя
начинается со знака (/
), оставшаяся его часть рассматривается как регулярное выражение. (Подробнее синтаксис регулярных выражений Postgres Pro описан в Подразделе 9.7.3.1.) Регулярное выражение может включать в себя одну группу, или заключённое в скобки подвыражение, на которое можно сослаться в поле имени-пользователя-БД
, написав \1
(с одной обратной косой). Это позволяет сопоставить несколько имён пользователя с одной строкой, что особенно удобно для простых замен. Например, эти строки
mymap /^(.*)@mydomain\.com$ \1 mymap /^(.*)@otherdomain\.com$ guest
удалят часть домена для имён пользователей, которые заканчиваются на @mydomain.com
, и позволят пользователям, чьё имя пользователя системы заканчивается на @otherdomain.com
, подключиться как guest
. Заключение имени-пользователя-БД
, содержащего \1
, в кавычки не заставит \1
потерять своё особое значение.
Если поле имени-пользователя-БД
начинается со знака (/
), оставшаяся его часть рассматривается как регулярное выражение. (Подробнее синтаксис регулярных выражений Postgres Pro описан в Подразделе 9.7.3.1.) Нельзя использовать \1
для использования захвата из регулярного выражения в имени-системного-пользователя
для регулярного выражения в имени-пользователя-БД
.
Подсказка
Помните, что по умолчанию, регулярное выражение может совпасть только с частью строки. Разумным выходом будет использование символов ^
и $
, как показано в примере выше, для принудительного совпадения со всем именем пользователя операционной системы
Файл pg_ident.conf
, который может быть использован в сочетании с файлом pg_hba.conf
(см. Пример 20.1), показан в Примере 20.2. В этом примере любым пользователям компьютеров в сети 192.168 с именами, отличными от bryanh
, ann
или robert
, будет отказано в доступе. Пользователь системы robert
получит доступ только тогда, когда подключается как пользователь Postgres Pro bob
, а не как robert
, или какой-либо другой пользователь. Пользователь ann
сможет подключиться только как ann
. Пользователь bryanh
сможет подключиться как bryanh
или как guest1
.
Пример 20.2. Пример файла pg_ident.conf
# MAPNAME SYSTEM-USERNAME PG-USERNAME omicron bryanh bryanh omicron ann ann # на этих машинах у пользователя bob имя robert omicron robert bob # bryanh также может подключаться как guest1 omicron bryanh guest1