Аутентификация LDAP
Эта страница переведена при помощи нейросети GigaChat.
Метод аутентификации LDAP схож с методом password
, за исключением того, что для проверки пароля используется служба LDAP. Пользователь заранее должен быть зарегистрирован в базе данных, чтобы аутентификация через LDAP стала возможной.
Существует два режима работы LDAP-аутентификации:
- Простой режим привязки: сервер проверяет связь с уникальным именем, сформированным как комбинация префикса (
prefix
) и суффикса (suffix
) с именем пользователя. Префикс часто содержит конструкциюcn=
илиDOMAIN\*
для среды Active Directory, а суффикс дополняет DNS-запись вне контекста AD. - Режим поиска и привязки: сервер вначале устанавливает соединение с LDAP-каталогом, используя фиксированные имя пользователя (
ldapbinddn
) и пароль (ldapbindpasswd
), и ищет конкретного пользователя, осуществляющего попытку входа. Если данные пользователя и пароль не предоставлены, предпринимается попытка анонимного доступа к каталогу. Далее сервер осуществляет поиск нужного пользователя в поддеревеldapbasedn
, проверяя точный атрибут, указанный вldapsearchattribute
. После нахождения пользователя сервер разрывает первое соединение и снова подключается к каталогу от лица этого пользователя, проверяя введенный пароль клиента. Подобный подход распространен в других программах, таких как модуль Apachemod_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 в двойные кавычки при конфигурировании, как продемонстрировано в примерах.