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-аутентификации в другом программном обеспечении, например, в 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используйте обычную схему URL- ldapи укажите параметр- ldaptlsв дополнение к- ldapurl.- Для неанонимного связывания - ldapbinddnи- ldapbindpasswdдолжны быть указаны как раздельные параметры.- В настоящее время URL-адреса LDAP поддерживаются только с OpenLDAP и не поддерживаются в Windows. 
Нельзя путать параметры конфигурации для режима простого связывания с параметрами для режима поиск+связывание, это ошибка.
В режиме поиск+связывание поиск может выполняться либо по одному атрибуту, указанному в ldapsearchattribute, либо по произвольному фильтру поиска, заданному в ldapsearchfilter. Указание ldapsearchattribute=foo равнозначно указанию ldapsearchfilter="(foo=$username)". Если не указан ни один параметр, по умолчанию подразумевается ldapsearchattribute=uid.
Это пример конфигурации 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))"
Подсказка
Поскольку LDAP часто применяет запятые и пробелы для разделения различных частей DN, необходимо использовать кавычки при определении значения параметров, как показано в наших примерах.