21.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-аутентификации в другом программном обеспечении, например, в pam_ldap и mod_authnz_ldap в Apache. Данный вариант даёт больше гибкости в выборе расположения объектов пользователей, но при этом требует дважды подключаться к серверу LDAP.
В обоих режимах используются следующие параметры конфигурации:
ldapserver
Имена и IP-адреса LDAP-серверов для связи. Можно указать несколько серверов, разделяя их пробелами.
ldapport
Номер порта для связи с LDAP-сервером. Если порт не указан, используется установленный по умолчанию порт библиотеки LDAP.
ldapscheme
Значение
ldaps
выбирает протокол LDAPS. Это нестандартный способ использования LDAP поверх SSL, поддерживаемый некоторыми серверами LDAP. Альтернативную возможность предоставляет параметрldaptls
.ldaptls
Значение 1 включает TLS-шифрование для защиты соединения PostgreSQL с LDAP-сервером. При этом используется операция
StartTLS
, описанная в RFC 4513. Альтернативную возможность предоставляет параметрldapscheme
.
Заметьте, что при использовании ldapscheme
или ldaptls
шифруется только трафик между сервером PostgreSQL и сервером LDAP. Соединение между сервером PostgreSQL и клиентом остаётся незашифрованным, если только и для него не включён SSL.
Следующие параметры используются только в режиме простого связывания:
ldapprefix
Эта строка подставляется перед именем пользователя во время формирования DN для связывания при аутентификации в режиме простого связывания.
ldapsuffix
Эта строка размещается после имени пользователя во время формирования DN для связывания, при аутентификации в режиме простого связывания.
Следующие параметры используются только в режиме поиск+связывание:
ldapbasedn
Корневая папка DN для начала поиска пользователя при аутентификации в режиме поиск+связывание.
ldapbinddn
DN пользователя для связи с каталогом при выполнении поиска в ходе аутентификации в режиме поиск+связывание.
ldapbindpasswd
Пароль пользователя для связывания с каталогом при выполнении поиска в ходе аутентификации в режиме поиск+связывание.
ldapsearchattribute
Атрибут для соотнесения с именем пользователя в ходе аутентификации поиск+связывание. Если атрибут не указан, будет использован атрибут
uid
.ldapsearchfilter
Фильтр поиска, используемый для аутентификации в режиме поиск+связывание. Вхождения
$username
в нём будут заменяться именем пользователя. Это позволяет задавать более гибкие фильтры поиска, чемldapsearchattribute
.ldapurl
Адрес LDAP по стандарту RFC 4516. Это альтернативный способ записи некоторых других параметров LDAP в более компактном и стандартном виде. Формат адреса таков:
ldap[s]://
сервер
[:порт
]/basedn
[?[атрибут
][?[scope
][?[фильтр
]]]]Здесь
scope
принимает значениеbase
,one
илиsub
(обычно последнее). По умолчанию подразумеваетсяbase
, что не очень полезно при таком применении. В качествеатрибута
может указываться один атрибут; в этом случае он используется как значение параметраldapsearchattribute
. Еслиатрибут
не указан, в качестве значенияldapsearchfilter
может использоватьсяфильтр
.Схема адреса
ldaps
выбирает для установления LDAP-подключений поверх SSL метод LDAPS, что равнозначно указаниюldapscheme=ldaps
. Для применения шифрования LDAP с использованием операцииStartTLS
используйте обычную схему URLldap
и укажите параметрldaptls
в дополнение кldapurl
.Для неанонимного связывания
ldapbinddn
иldapbindpasswd
должны быть указаны как раздельные параметры.В настоящее время URL-адреса LDAP поддерживаются только с OpenLDAP и не поддерживаются в Windows.
Нельзя путать параметры конфигурации для режима простого связывания с параметрами для режима поиск+связывание, это ошибка.
В режиме поиск+связывание поиск может выполняться либо по одному атрибуту, указанному в ldapsearchattribute
, либо по произвольному фильтру поиска, заданному в ldapsearchfilter
. Указание ldapsearchattribute=foo
равнозначно указанию ldapsearchfilter="(foo=$username)"
. Если не указан ни один параметр, по умолчанию подразумевается ldapsearchattribute=uid
.
Если PostgreSQL был скомпилирован с OpenLDAP в качестве клиентской библиотеки LDAP, параметр ldapserver
может быть опущен. В этом случае за списком имён серверов и портов сервер обращается в 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. Если запись найдена, проводится попытка связывание с использованием найденной информации и паролем, предоставленным клиентом. Если вторая попытка подключения проходит успешно, предоставляется доступ к базе данных.
Пример той же конфигурации для режима поиск+связывание, но записанной в виде URL:
host ... ldap ldapurl="ldap://ldap.example.net/dc=example,dc=net?uid?sub"
Такой URL-формат используется и другим программным обеспечением, поддерживающим аутентификацию по протоколу LDAP, поэтому распространять такую конфигурацию будет легче.
Пример конфигурации поиск+связывание, в котором ldapsearchfilter
используется вместо ldapsearchattribute
для прохождения аутентификации по идентификатору или почтовому адресу пользователя:
host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchfilter="(|(uid=$username)(mail=$username))"
Пример конфигурации поиск+связывание, в котором используется поиск SRV-записи в DNS для получения имени сервера и порта службы LDAP в домене example.net
:
host ... ldap ldapbasedn="dc=example,dc=net"
Подсказка
Поскольку LDAP часто применяет запятые и пробелы для разделения различных частей DN, необходимо использовать кавычки при определении значения параметров, как показано в наших примерах.