Пришло время заставить нашу службу каталогов быть не только вещью в себе, но и приносить какую-то реальную пользу. Самый простой и распространённый вариант использования службы каталогов — поддержка пользовательской базы данных или 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
. Однако для более изощрённых записей нам понадобится подключить другие наборы схемы.