Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> Основы LDAP

Основы работы с LDAP.

Автор: fr33man.


Установку и настройку ldap-сервера я буду производить на freebsd:

spider# uname -a
FreeBSD shield 6.1-RELEASE-p6 FreeBSD 6.1-RELEASE-p6 #0: Sun Sep 
10 14:42:40 MSD 2006 root@spider:/usr/obj/usr/src/sys/SPIDER i386
spider#

Немного теории.

Cлужба каталогов LDAP (Light Weight Directory Access Protocol), является упрощенным вариантом DAP X.500, разработанного еще в 1988 году для нужд телекоммуникаций. В основе модели директории LDAP лежит идея размещения объектов в вершинах древовидной структуры. Группировка же объектов происходит по принципу размещения их в вершине одного поддерева, причем группироваться могут совершенно разные объекты. Для поиска некоторого объекта необходимо указать идентификатор корня соответствующего поддерева. Данные размещаются в директории в виде объектов. Каждый объект имеет несколько атрибутов, последний в свою очередь имеет название и значение фиксированного в LDAP типа. Тип определяет формат значения, вид его представления, способы сопоставления и упорядочивания.
Объекту присваивается класс (или классы) к которому он принадлежит с помощью обязательного аттрибута objectClass, значением которого является имя класса.  Классы объектов объявлены в схеме директории (directory schema), где задаются имя класса, атрибуты, тип атрибутов а также указывается их обязательность или опциональность. Также могут быть указаны и родительские классы, определения которых будут наследоваться. Естественно, атрибут, который упоминался в родительском классе, как обязательный, для дочернего класса также будет обязательным. Аналогично и с опциональными атрибутами. На этой радостной ноте, предлагаю перейти к практике.

Установка LDAP-сервера.

Главный сервер slapd входит в состав пакета openldap(www.openldap.org). Ставить будем из портов:

spider# make search name='openldap-server'
Port:   openldap-server-2.2.30
Path:   /usr/ports/net/openldap22-server
Info:   Open source LDAP server implementation
Maint:  delphij@FreeBSD.org
B-deps: db42-4.2.52_4 openldap-client-2.2.30
R-deps: db42-4.2.52_4 openldap-client-2.2.30
WWW:    http://www.OpenLDAP.org/

Port:   openldap-server-2.3.25
Path:   /usr/ports/net/openldap23-server
Info:   Open source LDAP server implementation
Maint:  delphij@FreeBSD.org
B-deps: db43-4.3.29 libltdl-1.5.22 libtool-1.5.22_2 openldap-client-2.3.25
R-deps: db43-4.3.29 libltdl-1.5.22 openldap-client-2.3.25
WWW:    http://www.OpenLDAP.org/

Port:   openldap-server-2.4.2.a_1
Path:   /usr/ports/net/openldap24-server
Info:   Open source LDAP server implementation
Maint:  delphij@FreeBSD.org
B-deps: db43-4.3.29 libltdl-1.5.22 libtool-1.5.22_2 openldap-client-2.4.2.a
R-deps: db43-4.3.29 libltdl-1.5.22 openldap-client-2.4.2.a
WWW:    http://www.OpenLDAP.org/

spider#

Я решил установить openldap-2.3.25, так как openldap-server-2.2.30 устаревшая версия, а  openldap-server-2.4.2.a_1 только alpha.

Сначала ставим openldap-client:

spider# cd /usr/ports/net/openldap23-client/
spider# make install clean
spider# rehash

Теперь сервер:
spider# cd /usr/ports/net/openldap23-server
spider# make config

---------------------------------------------------------------------¬
¦                Options for openldap-server 2.3.25                  ¦
¦ -----------------------------------------------------------------¬ ¦
¦ ¦ [ ] SASL              With (Cyrus) SASL2 support               ¦ ¦
¦ ¦ [ ] PERL              With Perl backend                        ¦ ¦
¦ ¦ [ ] SHELL             With Shell backend (disables threading)  ¦ ¦
¦ ¦ [ ] ODBC              With SQL backend                         ¦ ¦
¦ ¦ [ ] 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               ¦ ¦
¦ ¦ [ ] DENYOP            With Deny Operation overlay              ¦ ¦
¦ ¦ [ ] DYNGROUP          With Dynamic Group overlay               ¦ ¦
¦ ¦ [ ] DYNLIST           With Dynamic List overlay                ¦ ¦
¦ ¦ [ ] LASTMOD           With Last Modification 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               ¦ ¦
¦ ¦ [ ] SYNCPROV          With Syncrepl Provider overlay           ¦ ¦
¦ ¦ [ ] TRANSLUCENT       With Translucent Proxy overlay           ¦ ¦
¦ ¦ [ ] UNIQUE            With attribute Uniqueness overlay        ¦ ¦
¦ ¦ [ ] VALSORT           With Value Sorting overlay               ¦ ¦
¦ ¦ [ ] ACI               With per-object ACIs (experimental)      ¦ ¦
¦ ¦ [X] DYNAMIC_BACKENDS  Build dynamic backends                   ¦ ¦
¦ ¦ [X] SLURPD            Build slurpd replication daemon          ¦ ¦
+-L-----v(+)---------------------------------------------------------+
¦                       [  OK  ]       Cancel                        ¦
L---------------------------------------------------------------------

В данном случае я собирал со следующими опциями:

- С поддержкой tcp wrappers
- С поддержкой Berkeley DB
- С поддержкой динамических бэкендов(ldbm и тд.)
- С поддержкой демона репликаций slurpd <br>

Теперь собираем и устанавливаем:

spider# make install clean

... skipped ...

spider# rehash
spider#

Установка сервера закончена, теперь переходим к его настройке.

Настройка slapd.


Главный конфигурационный файл сервера slapd находится по адресу: /usr/local/etc/openldap/slapd.conf. Его и будем редактировать:


/usr/local/etc/openldap/slapd.conf:


# Подключаем схемы, основная схема -- core.schema, она обязательна!!
include         /usr/local/etc/openldap/schema/core.schema

include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema
include         /usr/local/etc/openldap/schema/misc.schema
include         /usr/local/etc/openldap/schema/nis.schema
include         /usr/local/etc/openldap/schema/openldap.schema

# Pid-файл
pidfile         /var/run/openldap/slapd.pid

# Файл с аргумнтами, которые были переданы slapd
argsfile        /var/run/openldap/slapd.args

# Путь к модулям
modulepath      /usr/local/libexec/openldap

# подгружаем модуль ldbm
moduleload      back_ldbm

# описываем доступ к информации
# указываем, что к аттрибуту userPassword 
# себе(под кем Вы находитесь в системе)
# разрешена запись, анонимам предлагается 
# зарегистрироваться, остальным пройти идти лесом. ))

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

# Доступ к остальной информации: себе -- писать, анонимам читать, остальным ничего.
access to *
        by self write
        by anonymous read
        by * none

# Примечание: пользователю cn=root,dc=l1523,dc=ru разрешена запись и чтение всего!

# Тип базы
database        ldbm

# Корень базы
suffix          "dc=l1523,dc=ru"

# dn администратора ldap
rootdn          "cn=root,dc=l1523,dc=ru"

# пароль администратора
# генерируется командой slappasswd
rootpw          {SSHA}6yoQWo9e0HkAkdRGovvSff3/Kh0uzj90

# директория, где будут храниться базы
directory       /var/db/openldap-data

# уровень отладки
loglevel        256

# Индексы, для ускорения поиска по базе
index   objectClass     eq
index   cn              eq

Добавляем в rc.conf строки, для запуска slapd и собственно запускаем:

spider# echo slapd_enable=\"YES\" >> /etc/rc.conf
spider# echo slapd_flags=\'-h \"ldapi://%2fvar%2frun%2fopenldap%2fldapi/ \
? ldap://172.16.0.1/\"\' >> /etc/rc.conf
spider# echo slapd_sockets=\"/var/run/openldap/ldapi\" >> /etc/rc.conf
spider# mv /usr/local/etc/rc.d/slapd /usr/local/etc/rc.d/slapd.sh
spider# /usr/local/etc/rc.d/slapd.sh start
Starting slapd.
spider#

Добавление, удаление, редактирование и посик объектов.

Теперь нужно создать корневой объект нашего дерева. Создадим файл base.ldif с таким содержанием:

spider# cat base.ldif

dn: dc=l1523,dc=ru
objectClass: dcObject
objectClass: organization
objectClass: top
dc:l1523
o:l1523

spider#

Теперь добавим эту запись в ldap:

spider# ldapadd -x -D "cn=root,dc=unix" -W -f base.ldif
Enter LDAP Password:
adding new entry "dc=l1523,dc=ru"

spider#

Все прошло без ошибок, значит у нас есть корневой объект. Давайте создадим контейнер test:

spider# cat test.ldif
dn: ou=test,dc=l1523,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: test

spider# ldapadd -x -D "cn=root,dc=l1523,dc=ru" -W -f test.ldif
Enter LDAP Password:
adding new entry "ou=test,dc=l1523,dc=ru"

spider#

Давайте добавим пользователя lucky:

spider# cat lucky.ldif
dn: cn=lucky,ou=test,dc=l1523,dc=ru
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
cn: lucky
sn: lucky's sername
uid: lucky
userpassword:{SSHA} *
uidNumber: 0
gidNumber: 0
gecos: Lucky User
homeDirectory: /home/lucky

spider# ldapadd -x -D "cn=root,dc=l1523,dc=ru" -W -f lucky.ldif
Enter LDAP Password:
adding new entry "cn=lucky,ou=test,dc=l1523,dc=ru"

spider#

Параметры запуска:

-x : не использовать sasl
-D "dn" : под каким пользователем подключаться
-W : запросить ввод пароля
-f file : имя файла из которого брать информацию о добовляемом объекте.<br><br>

Добавили. Теперь давайте поищем информацию:
spider# ldapsearch -x -LLL -b 'dc=l1523,dc=ru' 'uid=lucky'
dn: cn=lucky,ou=test,dc=l1523,dc=ru
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
cn: lucky
sn: lucky's sername
uid: lucky
uidNumber: 0
gidNumber: 0
gecos: Lucky User
homeDirectory: /home/lucky

spider# ldapsearch -x -LLL -b 'dc=l1523,dc=ru' '(&(uid=lucky)(uidNumber=0))'
dn: cn=lucky,ou=test,dc=l1523,dc=ru
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
cn: lucky
sn: lucky's sername
uid: lucky
uidNumber: 0
gidNumber: 0
gecos: Lucky User
homeDirectory: /home/lucky

spider#

Используемые параметры:

-x : не импользовать sasl
-LLL : уменьшить кол-во выводимой информации, может быть -L или -LL
-b 'dn' : искать, начиная с конкретного объекта dn
'filter' : последний параметр указывает фильтр для поиска, в филтре могут использовать шаблоны и логические выражения.

Теперь можно попробовать отредактировать нашего пользователя, например изменив ему homeDirectory, uidNumber и добавив loginShell, а так же удалив gecos. Создаем файл modify.ldif и изменяем информацию в ldap дереве.

spider# cat modify.ldif
dn: cn=lucky,ou=test,dc=l1523,dc=ru
changetype: modify
replace: homeDirectory
homeDirectory: /dev/null
-
replace: uidNumber
uidNumber: 100
-
add: loginShell
loginShell: /dev/null
-
delete: gecos
-

spider# ldapmodify -x -D "cn=root,dc=l1523,dc=ru" -W -f modify.ldif
Enter LDAP Password:
modifying entry "cn=lucky,ou=test,dc=l1523,dc=ru"

spider#

Теперь посмотрим на изменения:

spider# ldapsearch -x -LLL -b 'dc=l1523,dc=ru' 'uid=lucky'
dn: cn=lucky,ou=test,dc=l1523,dc=ru
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
cn: lucky
sn: lucky's sername
uid: lucky
gidNumber: 0
homeDirectory: /dev/null
uidNumber: 100
loginShell: /dev/null

spider#

Как видите, все успешно изменилось.

Если Вы хотите удалить объект, то нужно воспользоваться утилитой ldapdelete:


spider# ldapdelete -x -D "cn=root,dc=l1523,dc=ru" \
? -W 'cn=lucky,ou=test,dc=l1523,dc=ru'
Enter LDAP Password:
spider# ldapsearch -x -LLL -b 'dc=l1523,dc=ru' 'uid=lucky'
spider#

Последний параметр - dn имя объекта, который Вы хотите удалить.

Заключение.

Очень важно понять основы работы ldap, иначе в будущем Вы не сможете грамотно управлять им.



размещено: 2006-11-08,
последнее обновление: 2006-11-14,
автор: fr33man


rav, 2006-12-16 в 9:12:36

ldapadd -x -D "cn=root,dc=unix" -W -f base.ldif

правильно будет:
ldapadd -x -D "cn=root,dc=l1523,dc=ru" -W -f base.ldif

0m3r, 2007-02-28 в 10:40:30

также мну приходтса юзать опц. -h && -H
без них
ldap_bind: Can't contact LDAP server (-1)

KaMa-CyTpA, 2007-06-04 в 16:59:18

А чтобы он брал с АД все эти "навороты" - можно так сделать? ну то есть типа получится копии LDAP сервера на 2003 с АД

akvazar, 2007-10-12 в 12:41:29

Статье не повредит маленькая доводка и исправление ачепяток, а так, в общем, гуд. От себя хочу добавить маленькую ссылочку на програмулю для ковыряния OpenLdap-а из гуи интерфейса, под виндами(для тех кому сложно сходу после виндузовой актив-директори делать руками). Фриварь :)
LdapAdmin

dikens3, 2008-02-08 в 17:29:28

У меня slapd долго запускался/перезапускался. Опытным путём выяснил, что это влияет запись в /etc/nssswitch.conf
group: files ldap
А точнее поиск группы в ldap. Решение получилось такое:

nss_ldap.conf
host ldap://127.0.0.1

т.е. host исправляем.

Marina, 2008-07-12 в 11:48:07

В добавление к предыдущей утилите могу сказать, что существует плагин для эклипса - Apache Directory Studio.
Если использовать эклипс с поддержкой C/C++, то работать с LDAP  будет ещё приятнее.

P.S. Огромное спасибо Автору за эту статью, прочитала её и наконец-то поняла, как примерно устроен LDAP :)

Constantine, 2008-07-13 в 14:39:03

to Dikens3
огромное тебе спасибо за замечание про исправление "host", всю голову сломал себе почему не работает!!!

Потемкин, 2008-07-31 в 12:54:45

В openldap-2.3.42 немного изменили core.schema, поэтому не выйдет добавить пользователя согласно приведенному в статье lucky.ldif. objectClass должны распологаться по-другому(в другой последовательности)
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
objectClass: top
Так работает.
Либо, если принципиально, внести соотвествующие изменения в core.shema, там всё прописано, только раскоментировать.
Ну и правильное замечание про ключ -h ко всем командам.. в моем случае все записи в rc.conf были добавлены как рекомендовано по умолчанию, то есть для хоста 0.0.0.0, поэтому отрабатывала команда ldapadd -h 0.0.0.0 дальше как в статье. Иначе Can't conect to LDAP Server (-1).
И ОЧЕНЬ важное замечание о котором не подумал автор, логи смотреть в /var/log/debug.log не зря ведь loglevel 256 ставили =)
Не совсем понятно зачем было ставить BDB и SLURPD.. В общем статья на 4 с минусом, но определенную пользу для новичков несет, хоть и вместе с гемороем))

turbo, 2008-08-04 в 17:23:08

а может быть, автор попробует на чистой системе поставить ldap и подкорректирует статейку с учетом коментов и форума? :)

Sergey, 2008-08-13 в 13:41:06

Дополняю ответы по граблям для поднятия версии:
openldap-2.4.11

cp /usr/local/etc/openldap/DB_CONFIG.example /var/db/openldap-data
/DB_CONFIG
slapd.conf - подправить теми же данными что и ldap.conf

Лучая админка http://www.ldapadministrator.com

Пользователей вводил для попробовать так:

dn: cn=lucky,ou=test,dc=l1523,dc=ru
objectClass: top
objectClass: person
sn: lucky

Sergey, 2008-08-15 в 12:29:45

Ещё добавочка. Если нужно настроить 2 зеркальных сервера собирайте со строчкой:
[X] SYNCPROV          With Syncrepl Provider overlay

Sergey, 2008-08-15 в 12:33:53

Строчку через пост выше
> slapd.conf - подправить теми же данными что и ldap.conf
не читать, потому что запарился и написал чуш

Чукот, 2008-09-19 в 2:23:01

Вот - еще раз 3 дня мучений, пока не приходит счастливая мысль отключить ipv6 ( просто -4 не помогло). И openldap24 запустился.

Выдавал до этого упрямую ошибку bi_db_open_filed (-1)

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

После отключения ipv6 в Ядре - все поперло как надо. Сразу.

Чукот, 2008-09-19 в 2:27:33

Это все делалось в
7.1-PRERELEASE FreeBSD 7.1-PRERELEASE #0:

Kacnep, 2008-10-07 в 12:20:04

to dikens3
Спасибо большое !!!!

sEr..., 2008-12-20 в 4:32:57

Не знаю почему, но я не понял в какой директории нужно создать фаил base.ldif???

SaveMeGood, 2009-04-01 в 12:46:59

Потемкин: objectClass должны распологаться по-другому(в другой последовательности)
Какая разница как они расположены?

Alex, 2009-04-16 в 17:34:39

товарисчи, при добавлении записи base.ldif в ldap
не хавает пароль- говорит ldap_bind: Can't contact LDAP server (-1)
кто сталкивался ? че делать?

(первые два комента читал, пробовал - не помогает)[b]

Artem, 2009-08-12 в 23:34:45

to Alex: Скорее всего потому, что ты прописал пароль в slapd.conf, a slapd  читает конфигурацию не из  него, а из slapd.d/
Это его поведение  по-умолчанию

savio, 2010-01-14 в 16:49:38

я так и не понял в чем "фишка" этого ldap'а...

xanf, 2010-02-01 в 15:02:55

не смог найти ссылки на обсуждение, спрошу тут.
уже расшиб себе лоб, пробовал ставить на двух разных машинах (7.2 и 8.0), slapd просто отказывается стартовать, перерыл все, перепробовал все советы. дебаг поразительно немногословен -
Feb  1 11:43:14 www slapd[53705]: @(#) $OpenLDAP: slapd 2.4.21 (Feb  1 2010 11:14:57) $         root@www.main.aricol.com:/usr/ports/net/openldap24-server/work/openldap-2.4.21/servers/slapd
Feb  1 11:43:14 www slapd[53705]: slapd stopped.
Feb  1 11:43:14 www slapd[53705]: connections_destroy: nothing to destroy.

где могут быть грабли, подскажите ньюбу...

xanf, 2010-02-01 в 15:15:07

отзываю просьбу, сам дурак оказался. у меня в конфиге закралась лажа... оччень помогла команда
slaptest -u
сразу мне на эти грабли и показала, и все заработало :)
спасибо за статью :)

Ivan Mironov, 2010-03-07 в 10:15:11


# Доступ к остальной информации: себе — писать, анонимам читать, остальным ничего.
access to *
       by self write


С такой настройкой любой пользователь сможет сам себе выставить uidNumber == 0 и получить права root'а (если конечно системные пользователи берутся из LDAP'а) =).

Klop, 2010-12-06 в 3:31:51

# ldapadd -x -D "cn=root,dc=unix" -f base.ldif -w secret
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)
# ldapadd -x -h 127.0.0.1 -D "cn=root,dc=unix" -f base.ldif -w\ secret
ldap_bind: Invalid credentials (49)
# ldapadd -x -h 127.0.0.1 -D "cn=root,dc=l1523,dc=ru" -f \base.ldif -w secret
adding new entry "dc=l1523,dc=ru"



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.053 секунд
Из них PHP: 41%; SQL: 59%; Число SQL-запросов: 77 шт.
Исходный размер: 52736; Сжатая: 12490