LDAP и активные папки

С Active Directory мне недавно пришлось столкнуться на практике в большой компании. LDAP это протокол по которому можно читать с 389 порта ldap сервера иерархические данные, а также изменять и фильтровать их. Используются эти данные как некий аналог регистра Windows, только для публичных целей. Обычно AD используется в больших корпорациях что-бы хранить личную информацию сотней сотрудников, сгруппированных по департаментам и регионам.

Адрессация

При работе с LDAP (я буду использовать этот термин, хотя это всё равно что говорить HTTP вместо Apache Server) можно заметить сначала полный хаос — какие-то сокращения, завёрнутые в одно иерархическое дерево, по которому ещё можно и поиск делать странный. На самом деле — дерево строится без всяких ID’шников, по именам папок. А сокращения это:

DN (Distinguished Name). Полное местонахождение от корня, типа URL — уникален и состоит из родителей.
RDN (Relative Distinguished Name). Фактически — имя, просто без родителей, должно быть под своим родителем уникально вроде как.

DC (Domain Controller). Верхний тип подразделения, аналог домена.
OU (Organisation Unit). Обычное подразделение или папка, как правило означает что в ней — группа объектов.
CN (Common Name). Папка и документ в одном лице. Дейтсвительно, какая разница?

Фактически же, LDAP поддерживает и канонический вид пути в виде URL, но для большей запутанности всё-таки использует аддрессацию с этими сокращениями.Вот и получается превращение
foo.org/Marketing/HPLaser3 в CN=HPLaser3,OU=Marketing,DC=foo,DC=org

Фильтрация

В отличие от HTTP сервера, который отвечает только за выдачу документов по нужному URL’у, ldap включает в себя и встроенный поиск. От этого ни тепло ни холодно, потому что расширения для ldap нет, всем разработчикам проще выпустить свой ldap сервер. Поэтому поиск тоже немного кривой из-за синтаксиса — в нём можно найти по значению параметра объекта сам объект, но логика AND и OR при больших конструкциях рискованна.

Вместо типичного запроса (userClass=*) можно ввести к примеру (sn=vasja pupkin) и найти один или несколько объектов, у которых этот параметр такой же. Через php это делается после connect и bind, при помощи ldap_search, возможно прийдётся ldap подгружать как extension из .dll/.so

Имена атрибутов у объектов — нечуствительны к регистру. А начиная с третьей версии , протокол поддерживает и тн. «Operational attributes» которые задаются сервером и по умолчанию в поиске не показываются. Удобно когда всё-таки надо что-то скрыть от пользователей.

Софт

Что-бы не мучаться и гадать почему не работает соединение или откуда брать данные, можно быстро поискать при помощи ldap браузеров:

  • Apache Directory studio , 32 мега, захотел JVM, пришлось скопировать из папки Zend. Красивый, быстрый и каким-то боком интегрируется в Eclipse.
  • Softella LDAP browser, на вид функциональный но грузит данные очень медленно
  • JExplorer старый, захотел поновой JVM
  • phpLdapAdmin, по аналогии с phpmyadmin ставится на сервак

Ну а если вы только вы сис.админ то серверы на выбор:

  • OpenLDAP — бесплатный
  • Novell eDirectory — говорят хорош
  • Red Hat Directory Server и Fedora Directory Server
  • Microsoft Active Directory — вроде есть на Windows серваках
  • Sun Java System Directory Server
  • IBM Tivoli Directory Server