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

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

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

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

Аутентификация LDAP может работать в двух режимах. В первом режиме, который мы назовем простым режимом привязки, сервер будет привязываться к уникальному имени, сконструированному как prefix username suffix. Обычно параметр prefix используется для указания cn= или DOMAIN\ в среде Active Directory. suffix используется для указания оставшейся части DN в среде, не являющейся Active Directory.

Во втором режиме, который мы назовем режимом поиска+привязки, сервер сначала привязывается к каталогу LDAP с помощью фиксированного имени пользователя и пароля, указанных с помощью ldapbinddn и ldapbindpasswd, и выполняет поиск пользователя, пытающегося войти в базу данных. Если не настроены имя пользователя и пароль, будет выполнена анонимная привязка к каталогу. Поиск будет выполняться в поддереве, указанном в ldapbasedn, и будет пытаться выполнить точное совпадение атрибута, указанного в ldapsearchattribute. После того, как пользователь будет найден в этом поиске, сервер отключается и повторно привязывается к каталогу от имени этого пользователя, используя пароль, указанный клиентом, чтобы проверить правильность входа. Этот режим аналогичен используемым в других программных средствах аутентификации LDAP, таких как 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

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

ldapsuffix

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

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

ldapbasedn

Корневой DN для начала поиска пользователя при аутентификации с использованием поиска+привязки.

ldapbinddn

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

ldapbindpasswd

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

ldapsearchattribute

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

ldapsearchfilter

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

ldapurl

RFC 4516 LDAP URL. Это альтернативный способ записи некоторых других параметров 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.

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

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

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

Если Tantor SE был скомпилирован с OpenLDAP в качестве клиентской библиотеки LDAP, настройка ldapserver может быть опущена. В этом случае список имен хостов и портов ищется через RFC 2782 DNS SRV записи. Ищется имя _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 попытается выполнить анонимную привязку (поскольку ldapbinddn не указан) к серверу LDAP, выполнить поиск (uid=someuser) в указанной базовой DN. Если запись найдена, затем будет попытка привязки с использованием найденной информации и пароля, предоставленного клиентом. Если второе соединение успешно, доступ к базе данных будет предоставлен.

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

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

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

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

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

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

host ... ldap ldapbasedn="dc=example,dc=net"

Подсказка

Поскольку LDAP часто использует запятые и пробелы для разделения различных частей DN, часто необходимо использовать значения параметров в двойных кавычках при настройке параметров LDAP, как показано в примерах.