OpenLDAP, addressbook, web интерфейс и все все все

По просьбам трудящихся, из-за отсутствия простого мануала для всех начинающих, светлых администраторов UNIX, и внедрению технологий светлых в тыл компаний и корпораций использующих темные силы Микрософта — посвящается сие писание =).

Предисловие

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

Основные термины

OpenLDAP Software — открытая реализация LDAP, разработанная проектом OpenLDAP Project. Распространяется под собственной лицензией, называемой OpenLDAP Public License. LDAP — платформенно-независимый протокол. В числе прочих есть реализации для различных модификаций BSD, а также GNU/Linux, AIX, HP-UX, Mac OS X, Solaris, Microsoft Windows (2000, XP) и z/OS.

LDAP (Lightweight Directory Access Protocol) представляет средства доступа к логически иерархической БД. Каталог (БД) состоит из записей (объектов). Иерархическая совокупность объектов (вложение контейнеров) определяет дерево каталога. Правила связывания определяются набором правил, который называется схемой каталога (в схему входят также описания классов). Дерево начинается от корневого объекта (класс Top в Active Directory).

Тип объекта (класс) определяется набором атрибутов: имя, тип значения, обязательность. Строки в кодировке UTF-8. Объект может ассоциироваться с несколькими классами. Класс может быть расширением другого класса (наследование). Кроме простых объектов имеются контейнеры (группировка объектов и контейнеров), псевдонимы (символьные ссылки), переадресация клиента к другому каталогу (переход по ссылкам, chasing referrals).

Каждый объект имеет относительное отличительное имя (Relative Distinguished Name). Полное отличительное имя объекта (DN) образуется конкатенацией RDN объекта с DN объекта верхнего уровня (порядок записи — от младшего к старшему, разделитель — точка). Каждый объект имеет владельца. В качестве идентификатора аутентификации также используется DN (cn=,dc=). Имеется выделенный администратор каталога, обладающий корневыми полномочиями. Для аутентификации используется расширяемый механизм SASL.

Поиск объекта в иерархии производится с помощью составного имени с корня вниз (как в DNS). Есть возможность анонимного доступа. Права доступа — чтение и запись и поддерживается репликация LDAP сервера.

Общие имена атрибутов:

  • c — страна
  • st — регион
  • l — местность
  • o — организация
  • ou — подразделение
  • dc — domain container
  • cn — имя
  • sn — фамилия
  • mail — электронный адрес

Возможности клиента:

  • подключиться к серверу БД (запрос привязки), для аутентификации используются механизмы SASL
  • читать значения определённых атрибутов конкретного объекта
  • сравнить значения с атрибутом объекта (полезно для аутентификации сравнением хеша)
  • искать объекты по значениям атрибутов (указывается корень поддерева, максимальное количество результатов, максимальное время поиска, фильтр поиска, перечень желаемых атрибутов)
  • получить список объектов ниже по иерархии
  • отменить предыдущий запрос
  • добавить, изменить или удалить объект
  • переименовать объект

Компоненты OpenLDAP

Открытое программное обеспечение OpenLDAP состоит из нескольких основных компонентов:

  • slapd — независимый LDAP демон (сервер)
  • slurpd — независимый LDAP демон обновления и репликации
  • библиотеки реализующие протокол LDAP, утилиты, инструменты и элементарные клиенты.
    Примеры клиентов: ldapsearch, ldapadd, ldapdelete и других.

Также содержится для OpenLDAP проекта:

  • JLDAP — библиотеки классов LDAP для Java
  • JDBC-LDAP — драйвер интерфейса между Java JDBC — LDAP

Установка

Ставим OpenLDAP

Установка OpenLDAP стандартна и поэтому, вкратце пройдемся по ней:
Мы нашли две версии этого порта 2.3 и 2.4, и я остановился на 2.4 ввиду ее перспективности.

# cd /usr/ports
# make search name=openldap-server
Port:   openldap-server-2.3.43
Path:   /usr/ports/net/openldap23-server
Info:   Open source LDAP server implementation
Maint:  [email protected]
B-deps: db44-4.4.20.4 libltdl-1.5.26 libtool-1.5.26 openldap-client-2.3.43
R-deps: db44-4.4.20.4 libltdl-1.5.26 openldap-client-2.3.43
WWW:    <a href="http://www.OpenLDAP.org/</p>
<p>Port:" title="http://www.OpenLDAP.org/</p>
<p>Port:">http://www.OpenLDAP.org/</p>
<p>Port:</p></a>   openldap-server-2.4.17
Path:   /usr/ports/net/openldap24-server
Info:   Open source LDAP server implementation
Maint:  [email protected]
B-deps: db46-4.6.21.4 libltdl-1.5.26 libtool-1.5.26 openldap-client-2.4.17
R-deps: db46-4.6.21.4 libltdl-1.5.26 openldap-client-2.4.17
WWW:    http://www.OpenLDAP.org/

Сконфигурируем и выберем необходимые модули:

# cd /usr/ports/net/openldap24-server/ && make config

     ---------------------------------------------------------------------¬
     ¦                Options for openldap-server 2.4.17                  ¦
     ¦ -----------------------------------------------------------------¬ ¦
     ¦ ¦ [ ] SASL              With (Cyrus) SASL2 support               ¦ ¦
     ¦ ¦ [ ] DYNACL            Run-time loadable ACL (experimental)     ¦ ¦
     ¦ ¦ [ ] ACI               Per-object ACI (experimental)            ¦ ¦
     ¦ ¦ [ ] DNSSRV            With Dnssrv backend                      ¦ ¦
     ¦ ¦ [ ] PASSWD            With Passwd backend                      ¦ ¦
     ¦ ¦ [ ] PERL              With Perl backend                        ¦ ¦
     ¦ ¦ [ ] RELAY             With Relay backend                       ¦ ¦
     ¦ ¦ [ ] SHELL             With Shell backend (disables threading)  ¦ ¦
     ¦ ¦ [ ] SOCK              With Sock backend                        ¦ ¦
     ¦ ¦ [ ] ODBC              With SQL backend                         ¦ ¦
     ¦ ¦ [ ] RLOOKUPS          With reverse lookups of client hostnames ¦ ¦
     ¦ ¦ [ ] SLP               With SLPv2 (RFC 2608) support            ¦ ¦
     ¦ ¦ [ ] SLAPI             With Netscape SLAPI plugin API           ¦ ¦
     ¦ ¦ [X] TCP_WRAPPERS      With tcp wrapper support                 ¦ ¦
     ¦ ¦ [X] BDB               With BerkeleyDB support                  ¦ ¦
     ¦ ¦ [ ] ACCESSLOG         With In-Directory Access Logging overlay ¦ ¦
     ¦ ¦ [ ] AUDITLOG          With Audit Logging overlay               ¦ ¦
     ¦ ¦ [ ] COLLECT           With Collect overy Services overlay      ¦ ¦
     ¦ ¦ [ ] CONSTRAINT        With Attribute Constraint overlay        ¦ ¦
     ¦ ¦ [ ] DDS               With Dynamic Directory Services overlay  ¦ ¦
     ¦ ¦ [ ] DEREF             With Dereference overlay                 ¦ ¦
     ¦ ¦ [ ] DYNGROUP          With Dynamic Group overlay               ¦ ¦
     ¦ ¦ [ ] DYNLIST           With Dynamic List overlay                ¦ ¦
     ¦ ¦ [ ] LASTMOD           With Last Modification overlay           ¦ ¦
     ¦ ¦ [ ] MEMBEROF          With Reverse Group Membership overlay    ¦ ¦
     ¦ ¦ [ ] PPOLICY           With Password Policy overlay             ¦ ¦
     ¦ ¦ [ ] PROXYCACHE        With Proxy Cache overlay                 ¦ ¦
     ¦ ¦ [ ] REFINT            With Referential Integrity overlay       ¦ ¦
     ¦ ¦ [ ] RETCODE           With Return Code testing overlay         ¦ ¦
     ¦ ¦ [ ] RWM               With Rewrite/Remap overlay               ¦ ¦
     ¦ ¦ [X] SEQMOD            Sequential Modify overlay                ¦ ¦
     ¦ ¦ [X] SYNCPROV          With Syncrepl Provider overlay           ¦ ¦
     ¦ ¦ [ ] TRANSLUCENT       With Translucent Proxy overlay           ¦ ¦
     ¦ ¦ [ ] UNIQUE            With attribute Uniqueness overlay        ¦ ¦
     ¦ ¦ [ ] VALSORT           With Value Sorting overlay               ¦ ¦
     ¦ ¦ [ ] SMBPWD            With Samba Password hashes overlay       ¦ ¦
     ¦ ¦ [X] DYNAMIC_BACKENDS  Build dynamic backends                   ¦ ¦
     +-L------------------------------------------------------------------+
     ¦                       [  OK  ]       Cancel                        ¦
     L---------------------------------------------------------------------

Начнем установку:

# cd /usr/ports/net/openldap24-server/ && make install clean
~~~~~
*************************************************************

The OpenLDAP server package has been successfully installed.

In order to run the LDAP server, you need to edit
  /usr/local/etc/openldap/slapd.conf
to suit your needs and add the following lines to /etc/rc.conf:
  slapd_enable="YES"
  slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'
  slapd_sockets="/var/run/openldap/ldapi"

Then start the server with
  /usr/local/etc/rc.d/slapd start
or reboot.

Try `man slapd' and the online manual at
  <a href="http://www.OpenLDAP.org/doc/<br />
for" title="http://www.OpenLDAP.org/doc/<br />
for">http://www.OpenLDAP.org/doc/<br />
for</a> more information.

slapd runs under a non-privileged user id (by default `ldap'),
see /usr/local/etc/rc.d/slapd for more information.

************************************************************
===> Installing rc.d startup script(s)
===>   Running ldconfig
/sbin/ldconfig -m /usr/local/libexec/openldap
===>   Installing ldconfig configuration file
===>   Registering installation for openldap-server-2.4.17
===> SECURITY REPORT:
      This port has installed the following files which may act as network
      servers and may therefore pose a remote security risk to the system.
/usr/local/libexec/slapd

      This port has installed the following startup scripts which may cause
      these network services to be started at boot time.
/usr/local/etc/rc.d/slapd

      If there are vulnerabilities in these programs there may be a security
      risk to the system. FreeBSD makes no guarantee about the security of
      ports included in the Ports Collection. Please type 'make deinstall'
      to deinstall the port if this is a concern.

      For more information, and contact details about the security
      status of this software, see the following webpage:
http://www.OpenLDAP.org/

Настройка OpenLDAP

Приступим к настройке OpenLDAP.
Внесем в /etc/rc.conf следующее:

slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"

По умолчанию ldap слушает все интерфейсы ldap://0.0.0.0/, но я укажу конкретно, что ему слушать это localhost и интерфейс сетевой платы. Например, вот так:

slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://127.0.0.1/ ldap://192.168.0.2/"'
slapd_sockets="/var/run/openldap/ldapi"

Теперь необходимо откорректировать конфигурационный файл OpenLDAP. Скопируем дефолтный конфигурационный файл:

# cd /usr/local/etc/openldap/
# cp slapd.conf.default slapd.conf

Отредактируем slapd.conf.

# cat slapd.conf
include         /usr/local/etc/openldap/schema/core.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema

pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

modulepath      /usr/local/libexec/openldap
moduleload      back_bdb

access to * by * read

access to attr=userPassword
  by self write
  by anonymous auth
  by * none

database        bdb
suffix          "dc=ampul,dc=local"
rootdn          "cn=root,dc=ampul,dc=local"

rootpw          {SSHA}Password

directory       /var/db/openldap-data
index   objectClass     eq
index   cn              eq

Пройдемся по конфигурационному файлу:
include — подключаемые схемы; в поставке OpenLDAP их довольно много. И вы подключите только те, которые будете использовать. В принципе, схемы являются частью конфигурационного файла, но для наглядности они вынесены в отдельные фрагменты. С указанием пути откуда они берутся.

modulepath и moduleload — запускаемый сервис и модуль используемого способа хранения данных.

access — для управления доступом используются списки доступа ACL. В данном примере приводятся два списка — в первом из них ограничивается доступ к атрибуту userPassword (полный доступ к нему могут иметь только сам объект либо администратор базы; для всех остальных доступ запрещён). Второе правило гласит, что всем даётся доступ на чтение любых данных (кроме ограниченного предыдущим правилом).

database — способ хранения данных используемый нами.

suffix — корнем иерархической структуры будет являться некоторый объект например dc=example,dc=com (я буду использовать для примера суффикс
dc=ampul,dc=local) у вас он соответственно будет другим. Суффикс для каталога можно взять любой.

rootdn — DN, описывающий администратора

rootpw — хешированый SSHA пароль администратора (см. slappasswd(8))

Утилита slappasswd позволяет создавать хеш пароля для дальнейшего использования в качестве значения атрибута userPassword или опции rootpw файла slapd.conf.

Параметры:
-v — многословный режим
-u — (пока по умолчанию; создавать хеш для userPassword в формате, определённом RFC 2307)
-s — пароль (если не задан здесь или с помощью ключа -T, то запрашивается в диалоге)
-T — имя файла с паролем
-h — схема ({SSHA}; метод хеширования пароля: {CRYPT}, {MD5}, {SMD5}, {SSHA}, {SHA}, {CLEARTEXT})
-c — формат (формат как в sprintf(3) для преобразования случайной строки символов из диапазона [A-Za-z0-9./]; например, «%.2s» даёт соль для стандартной функции crypt(3); «$1$%.8s» приводит к использованию функцией crypt(3) алгоритма MD5, так что результат можно использовать в /etc/shadow)

Создать хешированный пароль для пользователя root можно так:

# slappasswd -s  root
{SSHA}Password

Запуск OpenLDAP

После изменение slapd.conf запускаем сервис и проверяем работу.

# /usr/local/etc/rc.d/slapd start
# ps -ax | grep slap
35430  ??  Is     0:00,01 /usr/local/libexec/slapd -h ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://127.0.0.1/ ldap://192.168.0.2/ -u ldap -g ldap
35544  p0  S+     0:00,00 grep slap
# netstat -nap tcp | grep 389
tcp4       0      0 192.168.0.2.389        *.*                    LISTEN
tcp4       0      0 127.0.0.1.389          *.*                    LISTEN

Если вы все корректно сконфигурировали, то openldap запустится без проблем.

Сейчас нам необходимо создать корень:

# cat ampul.local.ldif
dn: dc=ampul,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
dc: ampul
o: FSI Ust-Luga Branch

dn: ou=addressbook,dc=ampul,dc=local
objectClass: top
objectClass: organizationalUnit
ou: addressbook

Добавим нашу схему в OpenLDAP.

# ldapadd -x -h localhost -f ampul.local.ldif -D "cn=root,dc=ampul,dc=local" -W
Enter LDAP Password: ****
adding new entry "dc=ampul,dc=local"

adding new entry "ou=addressbook,dc=ampul,dc=local"

Управление

Web интерфейс

Я давно подсел на web приложения потому, что я могу запускать их отовсюду и из любой системы будь то *NIX, Windows, Linux и т.п. Простота в обслуживании, обновлении, единая точка входа и управления и т.п. Для OpenLDAP есть несколько приложений которые могут помочь в администрировании OpenLDAP — мой выбор остановился на phpLDAPadmin.

# cd /usr/ports/
# make search name=phpLDAPadmin
Port:   phpldapadmin-1.1.0.7,1
Path:   /usr/ports/net/phpldapadmin
Info:   A set of PHP-scripts to administer LDAP over the web
Maint:  [email protected]
B-deps:
R-deps: gettext-0.17_1 libiconv-1.13 libxml2-2.7.3 openldap-client-2.4.16..
WWW:    <a href="http://phpldapadmin.sourceforge.net/</p>
<p>#" title="http://phpldapadmin.sourceforge.net/</p>
<p>#">http://phpldapadmin.sourceforge.net/</p>
<p>#</p></a> cd /usr/ports/net/phpldapadmin;make install clean
phpldapadmin-1.1.0.7,1 has been installed into:

    /usr/local/www/phpldapadmin

Please edit config.php to suit your needs.

To make phpLDAPadmin available through your web site, I suggest that
you add something like the following to httpd.conf:

    Alias /phpldapadmin/ "/usr/local/www/phpldapadmin/htdocs/"

    <Directory "/usr/local/www/phpldapadmin/htdocs">
        Options none
        AllowOverride none

        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1 .example.com
    </Directory>

Please note: if you are upgrading from version 0.9.7 or earlier, the
layout of the phpldapadmin-1.1.0.7,1 files has been completely reworked. You will
need to modify your apache configuration and merge the settings from
your original configuration file:

    /usr/local/www/phpldapadmin/config.php

 to

    /usr/local/www/phpldapadmin/config/config.php

===>   Registering installation for phpldapadmin-1.1.0.7,1
===>  Cleaning for phpldapadmin-1.1.0.7,1
    • Добавьте в конфигурационный файл Apache следующие строки предварительно настроив под себя
    Alias /phpldapadmin/ "/usr/local/www/phpldapadmin/htdocs/"

    <Directory "/usr/local/www/phpldapadmin/htdocs">
        Options none
        AllowOverride none

        Order Deny,Allow
        Deny from all
        Allow from 127.0.0.1 .example.com
    </Directory>
  • При необходимости отредактируйте конфигурационный файл phpldapadmin
    /usr/local/www/phpldapadmin/config/config.php
  • При проблемах чтения файлов установите права для Apache на директорию phpldapadmin.
    # chown -R www:www /usr/local/www/phpldapadmin/
  • Теперь в браузере указываете IP адрес или имя с сервера с приставкой phpldapadmin
    http://IP_name/phpldapadmin
    Укажите логин и пароль привилегированного лица например:
    Логин: cn=root,dc=ampul,dc=local
    Пароль: Password

Программное обеспечение

Есть несколько программных продуктов, которые позволяют управлять LDAP серверами, но они, в основном, платные. Я остановился на LDAP Admin, он быстрый, бесплатный и простой, что позволяет его использование обычному пользователю. Настроить его очень легко см скриншоты.

Адресная книга в почтовых клиентах

Mozilla Thunderbird

Thunderbird использует LDAPv3. Добавим LDAP-сервер в адресную книгу.

Введем корректный адрес и данные сервера OpenLDAP

Поиск производится при введении строки поиска в поле (ничего нажимать не надо, поиск производится по мере ввода) по cn, givenName, sn и считывает следующий список атрибутов: modifytimestamp, xmozillausehtmlmail, description, notes, custom4, custom3, custom2, custom1, birthyear, homeurl, workurl, nscpaimscreenname, countryname, company, o, departmentnumber, department, orgunit, ou, title, zip, postalcode, region, st, locality, l, streetaddress, postofficebox, carphone, cellphone, mobile, pagerphone, pager, facsimiletelephonenumber, fax, homephone, telephonenumber, xmozillasecondemail, mail, xmozillanickname, displayname, commonname, cn, surname, sn, givenname.

Outlook Express.

Outlook Express использует LDAPv2. Добавим LDAP-сервер в адресную книгу для этого выбираем в меню Сервис -> Учётные записи -> Добавить -> Служба каталогов -> Сервер каталогов (LDAP).
Затем изменить свойствах созданной службы каталогов во вкладке Дополнительно вставте свою Основу поиска например (ou=addressbook,dc=ampul,dc=local).
Поиск производится по нажатию кнопки «Поиск людей», вводу параметров и нажатию кнопки «Найти». Предварительно опрашивается список возможности сервера: subschemaSubentry, dsServiceName, namingContexts, defaultNamingContext, schemaNamingContext, configurationNamingContext, rootDomainNamingContext, supportedControl, supportedLDAPVersion, supportedLDAPPolicies, supportedSASLMechanisms, dnsHostName, ldapServiceName, serverName, supportedCapabilities.
По умолчанию поиск по атрибутам cn, givenName, sn, но можно искать по «имя и адрес» (cn), «электронная почта» (mail), имени (givenName), фамилии (sn), организации (o). Считывает следующий список атрибутов: display-name, cn, commonName, mail, otherMailbox, givenName, sn, surname, st, c, co, organizationName, o, ou, organizationalUnitName, URL, homePhone, facsimileTelephoneNumber, otherFacsimileTelephoneNumber, OfficeFax, mobile, otherPager, OfficePager, pager, info, title, telephoneNumber, l, homePostalAddress, postalAddress, streetAddress, street, department, comment, postalCode, physicalDeliveryOfficeName, initials, conferenceInformation, userCertificate;binary, userSMIMECertificate;binary, labeledURI, Manager, Reports, IPPhone.

Чтобы сохранять всю необходимую информацию о человеке его запись должна иметь классы: top, person, organizationalPerson, inetOrgPerson, residentialPerson.

Outlook 2003
Схема подключения Outlook 2003 к OpenLDAP см прикрепленные файлы к статье.

FAQ

В) Как в адресной книге вывести всех клиентов у которых есть электронная почта
O) Ввести в поле поиска символ «@»

В) Какой порт использует LDAP сервер
О) Стандартный TCP порт LDAP сервера — 389. Для защиты соединения может использоваться TLS (SSL) (порт 636).

В) Я использую php-5.2.10 и у меня при заходе в ПО показывает ошибку

Declaration of AJAXTree::draw_dn() should be compatible with that of
PLMTree::draw_dn()

О) Вам необходимо в файле lib/AJAXTree.php найти и заменить $level=0 на $level в функции draw_dn().
Кусок кода:

draw_dn($dn,$level,$first_child=true,$last_child=true)

В) Какой почтовый клиент может записывать информацию в адресную книгу?
О) Единственный почтовый клиент который может писать в LDAP это Evolution.

Ссылка на оригинал

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Закончите арифметическое действие * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.