Перейти к основному содержимому

Внешняя авторизация через LDAP

Сведения

Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.

Функциональность позволяет настраивать в централизованном LDAP-хранилище атрибуты прав пользователей (SUPERUSER, LOGIN, REPLICATION и другие) и вложенность ролей. После чего атрибуты и зависимость ролей могут быть получены из централизованного хранилища для всех экземпляров СУБД.

Внешняя авторизация работает как расширение механизма LDAP-аутентификации. Это означает, что она применяется только к тем сессиям, которые были аутентифицированы через LDAP. Если пользователь вошел в систему иным способом (например, через trust или md5), внешняя авторизация для данной сессии не будет выполняться.

В LDAP-хранилище для каждой роли также хранится список родительских ролей, в которые она входит (по аналогии с pg_auth_members), но конкретные полномочия всех этих ролей хранятся в СУБД. При этом из хранилища можно получать роли, которые не заведены в самой СУБД, и выполнять операции от их имени.

примечание

Функциональность не позволяет управлять через LDAP полномочиями отдельных ролей — только их вложенностью.

примечание

Любая нетривиальная команда UPDATE также требует привилегии SELECT, поскольку она должна ссылаться на столбцы таблицы, чтобы определить, какие строки обновить, и/или вычислить новые значения для столбцов.

Принцип работы и согласованность с аутентификацией

Внешняя авторизация больше не является самостоятельным механизмом и полностью наследует параметры подключения из pg_hba.conf.

  1. Единый источник настроек: Все параметры соединения с LDAP (адрес сервера, порт, TLS, DN поиска) берутся из записи pg_hba.conf, по которой была выполнена аутентификация текущей сессии. Это исключает рассинхронизацию настроек.

  2. Наследование режима Bind:

    • Если аутентификация выполнена через Simple Bind, внешняя авторизация также использует Simple Bind, выполняя запросы с паролем самого пользователя.
    • Если аутентификация выполнена через Search + Bind, внешняя авторизация использует параметры сервисного подключения (bind DN и пароль), заданные в pg_hba.conf.
  3. Область применения: Внешняя авторизация привязывается к факту 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

Включение и отключение внешней авторизации

По умолчанию функциональность отключена.

Для включения:

  1. Настройте pg_hba.conf, указав метод ldap и необходимые параметры подключения.
  2. Настройте конфигурационный файл внешней авторизации.
  3. Добавьте external_authorize.filename в параметр shared_preload_libraries файла postgresql.conf (укажите путь к файлу относительно PGDATA).
  4. Выполните перезагрузку СУБД: pg_ctl restart.

Для отключения:

  1. Исключите external_authorize.filename из параметра shared_preload_libraries.
  2. Выполните перезагрузку СУБД: pg_ctl restart.

Конфигурационный файл внешней авторизации

Путь к файлу задается параметром external_authorize.filename. Файл определяет, для каких ролей выполнять внешнюю авторизацию. Поиск идет сверху вниз до первого совпадения.

Формат строк: аналогичен pg_hba.conf (тип подключения, база, пользователь, адрес).

Параметры блока

Поскольку сетевые параметры наследуются из pg_hba.conf, данный файл используется только для настройки логики авторизации.

НазваниеДопустимые значенияОписание параметра
ldapparentroleattributestringИмя LDAP-атрибута, из которого извлекаются родительские роли
createnewroletrue/falseНужно ли создавать временную роль в БД, если ее нет в БД, но она есть в LDAP
ldapbasednLDAP DNКорневая папка DN для начала поиска пользователя при аутентификации в режиме поиск+связывание. Используется только при аутентификации с Simple Bind. Если используется Search+Bind аутентификация, то атрибут берется из pg_hba.conf
ldaprolsuperattributestringБулевый атрибут LDAP для модификатора rolsuper
ldaprolinheritattributestringБулевый атрибут LDAP для модификатора rolinherit
ldaprolcreateroleattributestringБулевый атрибут LDAP для модификатора rolcreaterole
ldaprolcreatedbattributestringБулевый атрибут LDAP для модификатора rolcreatedb
ldaprolcanloginattributestringБулевый атрибут LDAP для модификатора rolcanlogin
ldaprolreplicationattributestringБулевый атрибут LDAP для модификатора rolreplication
ldaprolbypassrlsattributestringБулевый атрибут LDAP для модификатора rolbypassrls
ldapsearchattributestringАтрибут для соотнесения с именем пользователя в ходе аутентификации поиск+связывание. Если атрибут не указан, будет использован атрибут uid. Используется только при аутентификации с Simple Bind. Если используется Search+Bind аутентификация, то атрибут берется из pg_hba.conf
ldapsearchfilterstringФильтр поиска, используемый для аутентификации в режиме поиск+связывание. Вхождения $username в нем будут заменяться именем пользователя. Это позволяет задавать более гибкие фильтры поиска, чем ldapsearchattribute. Используется только при аутентификации с Simple Bind. Если используется Search+Bind аутентификация, то атрибут берется из pg_hba.conf
rolsuperldapparentrolestringИмя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolsuper
rolinheritldapparentrolestringИмя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolinherit
rolcreateroleldapparentrolestringИмя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolcreaterole
rolcreatedbldapparentrolestringИмя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolcreatedb
rolcanloginldapparentrolestringИмя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolcanlogin
rolreplicationldapparentrolestringИмя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolreplication
rolbypassrlsldapparentrolestringИмя роли, наличие которой среди непосредственных родительских ролей говорит о присутствии у роли модификатора прав rolbypassrls
usermapstringЗадает имя маппинга в файле 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Путь к файлу в каталоге PGDATAexternal_authorize.confТребуется перезагрузка PangolinПуть к конфигурационному файлу внешней авторизации
external_authorize.ldap_network_timeout1-60000 мс500 мсТребуется перезагрузка PangolinТайм-аут подключения к LDAP-хранилищу
external_authorize.role_mapping_filenameПуть к файлу в каталоге PGDATAПустая строкаТребуется перезагрузка PangolinПуть к файлу с описанием сопоставления имен ролей в БД и узлов в LDAP
external_authorize.role_mappingНабор строк — содержимое конфигурационного файла сопоставления именПустая строкаВ случае защищенного конфигурирования смена параметров возможна только через сервер KMSОписание сопоставления имен ролей в БД и узлов в LDAP
external_authorize.ldap_cache_ttl1-86400 сек1800 секундТребуется перезагрузка PangolinTTL (Time To Live, время жизни) данных в кеше содержимого LDAP