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

Аутентификация LDAP

примечание

Эта страница переведена при помощи нейросети GigaChat.

Метод аутентификации LDAP схож с методом password, за исключением того, что для проверки пароля используется служба LDAP. Пользователь заранее должен быть зарегистрирован в базе данных, чтобы аутентификация через LDAP стала возможной.

Существует два режима работы LDAP-аутентификации:

  1. Простой режим привязки: сервер проверяет связь с уникальным именем, сформированным как комбинация префикса (prefix) и суффикса (suffix) с именем пользователя. Префикс часто содержит конструкцию cn= или DOMAIN\* для среды Active Directory, а суффикс дополняет DNS-запись вне контекста AD.
  2. Режим поиска и привязки: сервер вначале устанавливает соединение с LDAP-каталогом, используя фиксированные имя пользователя (ldapbinddn) и пароль (ldapbindpasswd), и ищет конкретного пользователя, осуществляющего попытку входа. Если данные пользователя и пароль не предоставлены, предпринимается попытка анонимного доступа к каталогу. Далее сервер осуществляет поиск нужного пользователя в поддереве ldapbasedn, проверяя точный атрибут, указанный в ldapsearchattribute. После нахождения пользователя сервер разрывает первое соединение и снова подключается к каталогу от лица этого пользователя, проверяя введенный пароль клиента. Подобный подход распространен в других программах, таких как модуль Apache mod_authnz_ldap и библиотека pam_ldap. Несмотря на повышенную гибкость расположения пользователей в каталоге, этот метод создает двойную нагрузку на сервер LDAP.

Общие параметры конфигурации, используемые двумя режимами:

ldapserver

: Список имен или IP-адресов LDAP-серверов, разделенных пробелами, к которым необходимо подключаться. Допускается указание нескольких серверов.

ldapport

: Порт LDAP-сервера, к которому осуществляется подключение. Если не указан, используется порт по умолчанию, определенный в библиотеке LDAP.

ldapscheme

: Задайте значение ldaps, чтобы использовать протокол LDAPS. Это особый способ подключения к LDAP-серверу через SSL, поддерживаемый отдельными реализациями LDAP. Дополнительно рассмотрите опцию ldaptls как альтернативный вариант.

ldaptls

: Установите значение 1, чтобы шифровать соединение между PostgreSQL и LDAP-сервером с помощью TLS-шифрования, используя команду StartTLS, описанную в стандарте RFC 4513. Альтернативный вариант предлагает опция ldapscheme.

Важно отметить, что включение ldapscheme или ldaptls защищает только канал связи между PostgreSQL и LDAP-сервером. Само соединение между клиентом PostgreSQL и сервером PostgreSQL останется открытым, если дополнительно не включено SSL-шифрование.

Далее представлены параметры, доступные только в простом режиме привязки:

ldapprefix

: Строка, добавляемая к имени пользователя при формировании Distinguished Name (DN) для выполнения простой привязки при проверке подлинности.

ldapsuffix

: Строка, которую необходимо присоединять к имени пользователя при создании DN для осуществления простой привязки при аутентификации.

Следующие параметры применяются только в режиме поиска и привязки:

ldapbasedn

: Корневой DN (Distinguished Name), откуда начинается поиск пользователя при проведении аутентификации способом "поиска и привязки".

ldapbinddn

: DN пользователя для привязки к каталогу с целью выполнения поиска при выполнении аутентификации search+bind.

ldapbindpasswd

: Пароль пользователя для привязки к каталогу с целью выполнения поиска при выполнении аутентификации search+bind.

ldapsearchattribute

: Атрибут для сопоставления с именем пользователя в поиске при выполнении аутентификации search+bind. Если атрибут не указан, будет использоваться атрибут uid.

ldapsearchfilter

: Фильтр поиска, который следует использовать при выполнении аутентификации search+bind. Вхождения $username будут заменены именем пользователя. Это позволяет использовать более гибкие фильтры поиска, чем ldapsearchattribute.

ldapurl

: URL-адрес LDAP в формате RFC 4516. Это альтернативный способ записи некоторых других параметров LDAP в более компактной и стандартной форме. Формат следующий:

ldap[s]://host[:port]/basedn[?[attribute][?[scope][?[filter]]]]

scope должен быть одним из base, one, sub, обычно последний. (По умолчанию используется base, что обычно не полезно в этом приложении.) attribute может назначить один атрибут, в котором случае он используется в качестве значения для ldapsearchattribute. Если attribute пусто, то filter можно использовать в качестве значения для ldapsearchfilter.

Схема URL ldaps выбирает метод LDAPS для установления соединений LDAP через SSL, эквивалентно использованию ldapscheme=ldaps. Чтобы использовать зашифрованные соединения LDAP с использованием операции StartTLS, используйте обычную схему URL ldap и укажите параметр ldaptls в дополнение к ldapurl.

Для анонимных привязок ldapbinddn и ldapbindpasswd должны быть указаны в виде отдельных опций.

В настоящее время URL-адреса LDAP поддерживаются только с помощью OpenLDAP, а не в Windows.

Неправильно комбинировать параметры конфигурации для простого режима привязки с параметрами для режима поиска и привязки.

При использовании режима поиска и привязки возможен поиск по одному атрибуту, указанному через параметр ldapsearchattribute, либо по индивидуальному фильтру поиска, заданному через параметр ldapsearchfilter. Установка ldapsearchattribute=foo эквивалентна использованию ldapsearchfilter=(foo=$username). Если ничего не указано, по умолчанию выбирается ldapsearchattribute=uid.

Если сборка PostgreSQL производилась с библиотекой OpenLDAP, параметр ldapserver можно пропустить. Тогда PostgreSQL начнет искать список хостов и портов через DNS-записи SRV по стандарту RFC 2782. Используется запись вида _ldap._tcp.DOMAIN, где DOMAIN берется из значения ldapbasedn.

Ниже представлен пример конфигурации LDAP с простым режимом привязки:

host ... ldap ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"

При попытке подключиться к серверу базы данных от имени пользователя someuser, PostgreSQL обратится к LDAP-серверу, пытаясь подключиться с DN cn=someuser,dc=example,dc=net и паролем, указанным клиентом. Если подключение удастся, пользователю будет предоставлен доступ к базе данных.

Приведен пример конфигурации для режима поиска и привязки:

host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchattribute=uid

При попытке подключиться к серверу базы данных от имени пользователя someuser, PostgreSQL попробует анонимно подключиться к LDAP-серверу (так как параметр ldapbinddn не задан), провести поиск записи по критерию (uid=someuser) в указанном базовом DN. Найдя подходящую запись, PostgreSQL далее попробует подключиться с использованием полученной информации и пароля, предоставленного клиентом. Если второй этап успешного подключения пройдет удачно, доступ к базе данных будет предоставлен.

Та же самая конфигурация поиска и привязки, записанная в формате URL:

host ... ldap ldapurl="ldap://ldap.example.net/dc=example,dc=net?uid?sub"

Многие другие программы, поддерживающие аутентификацию через LDAP, применяют аналогичный формат URL, благодаря чему проще делиться конфигурациями.

Вот пример конфигурации поиска и привязки, где вместо ldapsearchattribute используется параметр ldapsearchfilter, позволяющий проводить аутентификацию по идентификатору пользователя или электронному адресу:

host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchfilter="(|(uid=$username)(mail=$username))"

Вот пример конфигурации поиска и привязки, где имя узла (узлов) и порт (порты) LDAP-службы определяются автоматически через DNS SRV-запросы для домена example.net:

host ... ldap ldapbasedn="dc=example,dc=net"
Совет

Так как в LDAP-записях часто встречаются запятые и пробелы для разделения элементов DN, рекомендуется заключать значения параметров LDAP в двойные кавычки при конфигурировании, как продемонстрировано в примерах.