3.4 Добавление и инициализация пользовательской базы данных

Примеры адаптированы для

Пришло время заставить нашу службу каталогов быть не только вещью в себе, но и приносить какую-то реальную пользу. Самый простой и распространённый вариант использования службы каталогов — поддержка пользовательской базы данных или DIT. На этом этапе мы как раз и создадим такую базу данных с контекстом именования (суффиксом) dc=mycompany,dc=ru, отражающим доменное имя некой виртуальной компании.

Первым делом нам нужно создать LDIF-файл с описанием настроек базы данных, который мы будем добавлять в cn=config. Создадим файл /tmp/ldifs/003-create_user_db.ldif такого содержания:

dn: olcDatabase=bdb,cn=config
objectClass: olcBdbConfig
olcDatabase: bdb
olcSuffix: dc=mycompany,dc=ru
olcDbDirectory: /var/lib/ldap/dc=mycompany,dc=ru
olcRootDN: cn=manager,ou=System,dc=mycompany,dc=ru
olcRootPW: secret2

Запись настроек базы данных механизма манипуляции данными bdb строится на структурном объектном классе olcBdbConfig, являющимся потомком объектного класса olcDatabaseConfig; таким образом, у него всего два обязательных атрибута: olcDatabase (образующий RDN) и olcDbDirectory, в котором указывается директория файловой системы, где будут размещаться файлы базы данных bdb. Хотя атрибут olcSuffix и не является обязательным, без него добавить базу данных не получится (ошибка 80), да и нет смысла не указывать суффикс.

Обратите внимание, что мы назвали директорию базы данных по имени суффикса нашего пользовательского DIT и поместили её внутрь той директории, которая по умолчанию для данного дистрибутива предназначена для хранения файлов базы данных. Естественно, назвать директорию можно было как угодно и разместить где угодно. Наше решение продиктовано тем, что служба каталогов может обслуживать несколько DIT, поэтому занимать директорию /var/lib/ldap целиком под файлы одной базы данных нерентабельно, и, кроме того, такая система именования удобна и позволяет избежать путаницы.

Чтобы можно было подключиться к нашей базе данных, необходимы учётные данные, поэтому указаны также атрибуты olcRootDN и olcRootPW. Мы выбрали в качестве rootDN традиционное для LDAP-каталогов RDN cn=manager. Это, конечно, не догма, имя может быть любым, основное требование — DN должен находиться в пределах контекста именования dc=myconpany,dc=ru. Пример:

olcRootDN: cn=admin,dc=mycompany,dc=ru

Пароль в примере задан в открытом виде (secret2). Конечно, это не лучшее решение для любых парольных атрибутов, а тем более для olcRootPW. Заменим его более безопасным хэшированным значением пароля. Сначала сгенерируем его с помощью инструмента slappasswd:

# slappasswd -h '{SSHA}' -s 'secret2'
{SSHA}PKFrwbIL/zLd3gabPPLxn1vNq2jQHj4g

Первым аргументом команды мы указали алгоритм хэширования (в данном случае это SHA с "солью"), вторым - тот пароль, хэш которого нам требуется получить. Если Вы не хотите оставлять пароль в открытом виде в истории команд, то нужно не указывать аргумент -s, тогда slappasswd дважды попросит у Вас ввести пароль:

# slappasswd -h '{SSHA}' 
New password: 
Re-enter new password:
{SSHA}PKFrwbIL/zLd3gabPPLxn1vNq2jQHj4g

Вывод команды — наш хэшированный пароль. Его нужно тем или иным образом поместить в наш LDIF-файл. Атрибут olcRootPW будет выглядеть так:

olcRootPW: {SSHA}PKFrwbIL/zLd3gabPPLxn1vNq2jQHj4g

Наш LDIF-файл с минимальными настройками готов к загрузке. Можно сразу продумать и дописать в него атрибуты с дополнительными настройками, можно будет сделать это потом. В качестве иллюстрации добавим атрибут olcDbIndex с индексированием атрибута objectClass:

olcDbIndex: objectClass eq

Наш итоговый LDIF-файл будет выглядеть так:

dn: olcDatabase=bdb,cn=config
objectClass: olcBdbConfig
olcDatabase: bdb
olcSuffix: dc=mycompany,dc=ru
olcDbDirectory: /var/lib/ldap/dc=mycompany,dc=ru
olcRootDN: cn=manager,ou=System,dc=mycompany,dc=ru
olcRootPW: {SSHA}PKFrwbIL/zLd3gabPPLxn1vNq2jQHj4g
olcDbIndex: objectClass eq

Перед тем, как его загрузить, нужно создать директорию, которую мы указали в атрибуте olcDbDirectory, поместить в нее файл настроек базы данных bdb DB_CONFIG и назначить этой директории и файлу в качестве владельцев того пользователя и группу, от имени которых запущен slapd:

# mkdir /var/lib/ldap/dc=mycompany,dc=ru
# cp /usr/share/slapd/DB_CONFIG /var/lib/ldap/dc=mycompany,dc=ru
# chown -R openldap:openldap /var/lib/ldap/dc=mycompany,dc=ru

Загружаем LDIF-файл c описанием базы данных:

ldapadd -x -D 'cn=config' -W -f /tmp/ldifs/003-create_user_db.ldif
Enter LDAP Password: 
adding new entry "olcDatabase=bdb,cn=config"

Если в ответ на команду ldapadd сервер выдаёт ошибку "ldap_add: Invalid syntax (21) additional info: objectClass: value #0 invalid per syntax", Вы, вероятно, не добавили динамический модуль back_bdb. О том, как добавлять модули, смотрите здесь.

Итак, мы добавили пользовательскую базу данных, при этом в директории, указанной в атрибуте olcDbDirectory появились файлы базы данных bdb:

# ls -l /var/lib/ldap/dc=mycompany,dc=ru/
итого 2888
-rw-r--r-- 1 openldap openldap     2048 2012-10-28 00:26 alock
-rw------- 1 openldap openldap    24576 2012-10-28 00:26 __db.001
-rw------- 1 openldap openldap   630784 2012-10-28 00:26 __db.002
-rw------- 1 openldap openldap  2629632 2012-10-28 00:26 __db.003
-rw------- 1 openldap openldap   589824 2012-10-28 00:26 __db.004
-rw------- 1 openldap openldap  2703360 2012-10-28 00:26 __db.005
-rw------- 1 openldap openldap    32768 2012-10-28 00:26 __db.006
-rw-r--r-- 1 openldap openldap     3080 2012-09-17 11:10 DB_CONFIG
-rw------- 1 openldap openldap     8192 2012-10-28 00:26 dn2id.bdb
-rw------- 1 openldap openldap    32768 2012-10-28 00:26 id2entry.bdb
-rw------- 1 openldap openldap 10485760 2012-10-28 00:26 log.0000000001

Попробуем сделать к ней запрос:

# ldapsearch -x -LLL -b 'dc=mycompany,dc=ru'
No such object (32)

Ошибка! Но всё закономерно: добавить-то мы базу данных добавили, но не проинициализировали. Чтобы это сделать, создадим LDIF-файл /tmp/ldifs/004-init_user_db.ldif такого содержания:

dn: dc=mycompany,dc=ru
objectClass: organization
objectClass: dcObject
dc: mycompany
o: My Company

Здесь описана корневая запись DIT dc=mycompany,dc=ru. В качестве структурного объектного класса используется класс organization (обязательный атрибут o). Вспомогательный объектный класс dcObject требуется нам для атрибута dc, образующего RDN.

Добавим нашу запись командой ldapadd:

# ldapadd -x -D 'cn=manager,ou=System,dc=mycompany,dc=ru' -W -f /tmp/ldifs/004-init_user_db.ldif
Enter LDAP Password: 
adding new entry "dc=mycompany,dc=ru"

Обратите внимание, что в качестве учётной записи, под которой происходит подсоединение к каталогу, используется rootDN нашей пользовательской базы данных и, соответственно, на запрос пароля нужно вводить пароль, указанный в атрибуте olcRootPW той же базы данных.

Попробуем сделать запрос ещё раз:

# ldapsearch -x -LLL -b 'dc=mycompany,dc=ru'
dn: dc=mycompany,dc=ru
objectClass: organization
objectClass: dcObject
dc: mycompany
o: My Company

Теперь всё в порядке, можно приступать к наполнению каталога. Для добавления записей-разделов, таких как ou=Users,dc=mycompany,dc=ru, достаточно атрибутов и объектных классов из подключенного нами ранее набора схемы данных core. Однако для более изощрённых записей нам понадобится подключить другие наборы схемы.

Pro-LDAP.ru 2013 г. Последнее изменение страницы — 28 февраля 2013 г. Вопросы и предложения принимаются на форуме проекта.