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

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

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

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

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

Запись настроек базы данных механизма манипуляции данными mdb строится на структурном объектном классе olcMdbConfig, являющимся потомком объектного класса olcDatabaseConfig; таким образом, у него всего два обязательных атрибута: olcDatabase (образующий RDN) и olcDbDirectory, в котором указывается директория файловой системы, где будут размещаться файлы базы данных mdb. Хотя атрибут 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=mdb,cn=config
objectClass: olcMdbConfig
olcDatabase: mdb
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, и назначить ей в качестве владельцев того пользователя и группу, от имени которых запущен slapd:

# mkdir /var/lib/ldap/dc=mycompany,dc=ru
# chown 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=mdb,cn=config"

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

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

# ls -l /var/lib/ldap/dc=mycompany,dc=ru/
итого 52
-rw------- 1 openldap openldap 45056 нояб. 27 18:26 data.mdb
-rw------- 1 openldap openldap  8192 нояб. 27 18:26 lock.mdb

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

# 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=People,dc=mycompany,dc=ru, достаточно атрибутов и объектных классов из подключенного нами ранее набора схемы данных core. Однако для более изощрённых записей нам понадобится подключить другие наборы схемы.

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