Внешняя авторизация через LDAP
Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.
Функциональность позволяет настраивать в централизованном LDAP-хранилище атрибуты прав пользователей (SUPERUSER, LOGIN, REPLICATION и другие) и вложенность ролей. После чего атрибуты и зависимость ролей могут быть получены из централизованного хранилища для всех экземпляров СУБД.
Внешняя авторизация работает как расширение механизма LDAP-аутентификации. Это означает, что она применяется только к тем сессиям, которые были аутентифицированы через LDAP. Если пользователь вошел в систему иным способом (например, через trust или md5), внешняя авторизация для данной сессии не будет выполняться.
В LDAP-хранилище для каждой роли также хранится список родительских ролей, в которые она входит (по аналогии с pg_auth_members), но конкретные полномочия всех этих ролей хранятся в СУБД. При этом из хранилища можно получать роли, которые не заведены в самой СУБД, и выполнять операции от их имени.
Функциональность не позволяет управлять через LDAP полномочиями отдельных ролей — только их вложенностью.
Любая нетривиальная команда UPDATE также требует привилегии SELECT, поскольку она должна ссылаться на столбцы таблицы, чтобы определить, какие строки обновить, и/или вычислить новые значения для столбцов.
Принцип работы и согласованность с аутентификацией
Внешняя авторизация больше не является самостоятельным механизмом и полностью наследует параметры подключения из pg_hba.conf.
-
Единый источник настроек: Все параметры соединения с LDAP (адрес сервера, порт, TLS, DN поиска) берутся из записи
pg_hba.conf, по которой была выполнена аутентификация текущей сессии. Это исключает рассинхронизацию настроек. -
Наследование режима Bind:
- Если аутентификация выполнена через Simple Bind, внешняя авторизация также использует Simple Bind, выполняя запросы с паролем самого пользователя.
- Если аутентификация выполнена через Search + Bind, внешняя авторизация использует параметры сервисного подключения (bind DN и пароль), заданные в
pg_hba.conf.
-
Область применения: Внешняя авторизация привязывается к факту LDAP-аутентификации сессии. Если в ходе сессии выполняется команда
SET ROLE, внешняя авторизация продолжает работать, так как решение опирается на исходного аутентифицированного пользователя.
Безопасность и хранение паролей
Для поддержки режима Simple Bind во внешней авторизации пароль пользователя должен быть доступен на протяжении всей сессии. Чтобы минимизировать риски безопасности, пароль в памяти backend-процесса хранится в зашифрованном виде. Он расшифровывается временно и только в момент непосредственного обращения к LDAP-серверу.
Кеширование ответов LDAP-сервера
Решение позволяет получать из LDAP модификаторы прав роли: флаги rolcanlogin, rolsuper и другие. Чтобы не устанавливать сетевое соединение с LDAP при каждом обращении к этим флагам, они кешируются.
Кеширование позволяет не тратить время на входы в LDAP при частой инвалидации кеша системного каталога. Однако в случае очень длительных сессий с операциями только чтения результаты авторизации могут зафиксироваться в кешах высокого уровня. Для этого предусмотрена специальная проверка: если в течение заданного промежутка времени не было ни одного входа в LDAP, выполняется инвалидация кеша системного каталога для принудительного обновления данных из LDAP.
Защита от привилегированного пользователя
Конфигурационный файл сопоставления имен ролей БД и узлов в LDAP может быть уязвимостью. Пользователь с высокими полномочиями на сервере может подменить сопоставление, чтобы роль с малыми правами получила большие полномочия из LDAP. Поэтому файл сопоставления добавлен в систему защиты от привилегированного пользователя. Если она включена, файл получается из защищенного хранилища, а локальное содержимое файла игнорируется.
Получение модификаторов прав роли
Из стандартных атрибутов LDAP
Если хранилище использует стандартные классы объектов, модификаторы прав определяются через проверку принадлежности к ролям, заданным в конфигурационном файле. Алгоритм составляет список всех значений атрибута, заданного параметром ldapparentroleattribute, и ищет в нем строки, соответствующие модификаторам прав.
Из булевых атрибутов LDAP
Если в LDAP настроены дополнительные атрибуты, в конфигурационном файле внешней авторизации можно указать имена булевых атрибутов, из которых расширение будет напрямую считывать значения модификаторов прав роли.
Создание временных ролей, которых нет в pg_authid
Система позволяет выполнять операции с БД под учетными записями, которые существуют только в LDAP. Если запись не найдена в системном каталоге СУБД, но она существует в LDAP, создается временная роль. Это избавляет администраторов от необходимости дублировать имена всех пользователей в каждой подключенной СУБД.
Сопоставление имен ролей в БД и узлов в LDAP
Имя роли в БД может не совпадать с именем узла в LDAP. Для этого используется файл сопоставления (role_mapping_filename), работающий по принципу pg_ident.conf.
Важная особенность: Сопоставление имен (mapping) применяется только на этапе внешней авторизации.
- На этапе аутентификации (входа) преобразование не выполняется: в LDAP должна существовать запись, соответствующая исходному имени пользователя БД.
- На этапе авторизации (получения прав) имя пользователя БД преобразуется через mapping, и поиск в LDAP выполняется уже по новому имени.
Структура файла сопоставления
Файл сопоставления имен имеет структуру:
имя-сопоставления pg_role операция ldap_name
Где:
-
имя-сопоставления– произвольное имя, используемое для обозначения набора правил сопоставления; -
pg_role– имя роли базы данных Pangolin; -
операция– одна из трех операций:->– задает отображение роли БД в узел LDAP (однонаправленное);<-– задает отображение узла LDAP в роль БД (однонаправленное);<->– задает взаимно-однозначное отображение между узлом LDAP и ролью БД (двунаправленное);
-
ldap_name– имя узла в хранилище LDAP.
Особенности параметров:
-
Однонаправленные отображения:
- Операция
->позволяет задать отображение роли БД в узел LDAP. - Операция
<-позволяет задать отображение узла LDAP в роль БД.
- Операция
-
Двунаправленное отображение. Операция
<->устанавливает взаимно-однозначную связь между ролью БД и узлом LDAP. Это означает, что оба направления (БД → LDAP и LDAP → БД) будут работать одновременно. -
Использование регулярных выражений:
- В полях
pg_roleиldap_nameможно использовать регулярные выражения с одной группой захвата. Регулярные выражения начинаются со знака/. - Если используется регулярное выражение, оно должно содержать не более одной группы захвата (
\1), которую можно использовать в соответствующем направлении.
- В полях
-
Ограничения. Двунаправленная операция
<->несовместима с регулярными выражениями. Для таких случаев необходимо задавать два отдельных отображения. Пример с регулярными выражениями:mymap /(\w+)_pg_role -> \1_ldap_node
mymap \1_pg_role <- /(\w+)_ldap_node
После изменений в файле сопоставления необходимо перезапустить сервер Pangolin или отправить сигнал SIGHUP.
Пример файла сопоставления
Однонаправленные отображения:
mymap2 db_admin -> ldap_admin
mymap2 ldap_guest <- db_guest
Двунаправленное отображение:
mymap3 developer <-> ldap_developer
С использованием регулярных выражений:
mymap4 /(\w+)_role -> \1_ldap_unit
mymap4 \1_role <- /(\w+)_ldap_unit
Включение и отключение внешней авторизации
По умолчанию функциональность отключена.
Для включения:
- Настройте
pg_hba.conf, указав методldapи необходимые параметры подключения. - Настройте конфигурационный файл внешней авторизации.
- Добавьте
external_authorize.filenameв параметрshared_preload_librariesфайлаpostgresql.conf(укажите путь к файлу относительноPGDATA). - Выполните перезагрузку СУБД:
pg_ctl restart.
Для отключения:
- Исключите
external_authorize.filenameиз параметраshared_preload_libraries. - Выполните перезагрузку СУБД:
pg_ctl restart.
Конфигурационный файл внешней авторизации
Путь к файлу задается параметром external_authorize.filename. Файл определяет, для каких ролей выполнять внешнюю авторизацию. Поиск идет сверху вниз до первого совпадения.
Формат строк: аналогичен pg_hba.conf (тип подключения, база, пользователь, адрес).
Параметры блока
Поскольку сетевые параметры наследуются из pg_hba.conf, данный файл используется только для настройки логики авторизации.
| Название | Допустимые значения | Описание параметра |
|---|---|---|
ldapparentroleattribute | string | Имя LDAP-атрибута, из которого извлекаются родительские роли |
createnewrole | true/false | Нужно ли создавать временную роль в БД, если ее нет в БД, но она есть в LDAP |
ldapbasedn | LDAP DN | Корневая папка DN для начала поиска пользователя при аутентификации в режиме поиск+связывание. Используется только при аутентификации с Simple Bind. Если используется Search+Bind аутентификация, то атрибут берется из pg_hba.conf |
ldaprolsuperattribute | string | Булевый атрибут LDAP для модификатора rolsuper |
ldaprolinheritattribute | string | Булевый атрибут LDAP для модификатора rolinherit |
ldaprolcreateroleattribute | string | Булевый атрибут LDAP для модификатора rolcreaterole |
ldaprolcreatedbattribute | string | Булевый атрибут LDAP для модификатора rolcreatedb |
ldaprolcanloginattribute | string | Булевый атрибут LDAP для модификатора rolcanlogin |
ldaprolreplicationattribute | string | Булевый атрибут LDAP для модификатора rolreplication |
ldaprolbypassrlsattribute | string | Булевый атрибут LDAP для модификатора rolbypassrls |
ldapsearchattribute | string | Атрибут для соотнесения с именем пользователя в ходе аутентификации поиск+связывание. Если атрибут не указан, будет использован атрибут uid. Используется только при аутентификации с Simple Bind. Если используется Search+Bind аутентификация, то атрибут берется из pg_hba.conf |
ldapsearchfilter | string | Фильтр поиска, используемый для аутентификации в режиме поиск+связывание. Вхождения $username в нем будут заменяться именем пользователя. Это позволяет задавать более гибкие фильтры поиска, чем ldapsearchattribute. Используется только при аутентификации с Simple Bind. Если используется Search+Bind аутентификация, то атрибут берется из pg_hba.conf |
rolsuperldapparentrole | string | Имя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolsuper |
rolinheritldapparentrole | string | Имя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolinherit |
rolcreateroleldapparentrole | string | Имя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolcreaterole |
rolcreatedbldapparentrole | string | Имя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolcreatedb |
rolcanloginldapparentrole | string | Имя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolcanlogin |
rolreplicationldapparentrole | string | Имя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolreplication |
rolbypassrlsldapparentrole | string | Имя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolbypassrls |
usermap | string | Задает имя маппинга в файле role_mapping_filename |
Настройка TLS для LDAP
Для использования самоподписанных сертификатов в ОС (rpm-based: /etc/openldap/ldap.conf, deb-based: /etc/ldap/ldap.conf) укажите:
TLS_CACERT— путь к PEM-сертификату.TLS_CACERTDIR— путь к каталогу с сертификатами.
В pg_hba.conf для активации шифрования используйте параметр ldaptls=1.
Новые конфигурационные параметры в postgresql.conf
| Имя параметра | Допустимые значения | Значение по умолчанию | Установка параметра | Описание параметра |
|---|---|---|---|---|
external_authorize.filename | Путь к файлу в каталоге PGDATA | external_authorize.conf | Требуется перезагрузка Pangolin | Путь к конфигурационному файлу внешней авторизации |
external_authorize.ldap_network_timeout | 1-60000 мс | 500 мс | Требуется перезагрузка Pangolin | Тайм-аут подключения к LDAP-хранилищу |
external_authorize.role_mapping_filename | Путь к файлу в каталоге PGDATA | Пустая строка | Требуется перезагрузка Pangolin | Путь к файлу с описанием сопоставления имен ролей в БД и узлов в LDAP |
external_authorize.role_mapping | Набор строк — содержимое конфигурационного файла сопоставления имен | Пустая строка | В случае защищенного конфигурирования смена параметров возможна только через сервер KMS | Описание сопоставления имен ролей в БД и узлов в LDAP |
external_authorize.ldap_cache_ttl | 1-86400 сек | 1800 секунд | Требуется перезагрузка Pangolin | TTL (Time To Live, время жизни) данных в кеше содержимого LDAP |