Если Вы не собирали OpenLDAP из исходников под свою задачу, вкомпилировав всё необходимое в slapd
, то рано или поздно Вы столкнётесь с необходимостью добавить тот или иной динамический модуль. В Ubuntu, например, даже back_mdb собран в виде такого модуля. Единственный способ достоверно определить, собран ли модуль статически или динамически (или вообще не был собран) — посмотреть, с какими опциями запускался скрипт configure
при сборке slapd
. Однако, при установке из двоичного пакета такая информация доступна не всегда. Тем не менее, наличие нужного Вам модуля в директории с модулями slapd
(/usr/lib/ldap
) наверняка говорит о том, что данный модуль собран динамически и требует подключения способом, описанным ниже. Если же нужного Вам модуля там нет, остаётся лишь надеяться, что он был собран статически и подключения не требует, можно попробовать сразу задействовать функционал, реализуемый этим модулем. Наконец, если модуля нет и при попытке задействовать функционал этого модуля выдаётся ошибка, скорее всего при сборке slapd
этот модуль вообще не собирался. В таком случае придётся отказаться от использования двоичного установочного пакета и собирать OpenLDAP из исходников, предусмотрев всё необходимое на этапе сборки.
Далее пойдёт речь о подключении динамических модулей.
В cn=config для определения модулей служит специальная запись cn=module{0},cn=config
. Она строится на структурном объектном классе olcModuleList
, в определении которого присутствует всего 3 атрибута (да и то необязательных): cn
, olcModulePath
и olcModuleLoad
. Но и их вполне хватит для загрузки динамических модулей.
Те модули, которые требуется загрузить, указываются в атрибутах olcModuleLoad
. Значением этого атрибута может быть либо указание полного пути к файлу модуля, либо только название файла. Поскольку обычно после сборки OpenLDAP все динамические модули находятся в одной директории файловой системы, вполне резонно для сокращения значений атрибута olcModuleLoad
указать путь к этой директории в атрибуте olcModulePath
. Этот атрибут может иметь только одно значение (SINGLE-VALUE), поэтому, если Вам по какой-то причине нужно задать несколько путей, их указывают в одном значении атрибута, используя в качестве разделителя двоеточие. Подробнее об атрибутах olcModulePath
и olcModuleLoad
можно почитать в учебнике LFRS.
Итак, мы собираемся создать базу данных механизма mdb и выяснили, что механизм mdb собран в виде динамического модуля. Для загрузки модуля создадим LDIF-файл /tmp/ldifs/002-add_modules.ldif
такого содержания:
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/ldap
olcModuleLoad: back_mdb.la
Если нужно добавить сразу несколько модулей, просто добавьте атрибуты olcModuleLoad
с именами нужных модулей в конец определения данной записи. Применим наш LDIF-файл с помощью команды ldapadd
:
# ldapadd -x -D 'cn=config' -W -f /tmp/ldifs/002-add_modules.ldif Enter LDAP Password: adding new entry "cn=module,cn=config"
OpenLDAP добавит к RDN данной записи индекс {0}
, а также добавит соответствующие индексы к атрибутам olcModuleLoad
. В итоге наша запись будет выглядеть так:
# ldapsearch -x -LLL -D 'cn=config' -W -b 'cn=config' '(objectClass=olcModuleList)'
Enter LDAP Password:
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_mdb.la
Мы создали запись cn=module{0},cn=config
и загрузили один (или несколько) модулей. Но что делать, если в процессе работы нам понадобилось загрузить еще один (или несколько) модулей? Нет ничего проще! Нужно лишь добавить их имена в виде атрибутов olcModuleLoad
к нашей записи cn=module{0},cn=config
.
Проиллюстрируем добавление модуля на примере динамического модуля наложения ppolicy. Создадим LDIF-файл /tmp/ldifs/101-ppolicy_add_module.ldif
такого содержания:
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: ppolicy.la
Применим его с помощью команды ldapmodify
:
# ldapmodify -x -D 'cn=config' -W -f /tmp/ldifs/101-ppolicy_add_module.ldif Enter LDAP Password: modifying entry "cn=module{0},cn=config"
Посмотрим, что у нас получилось:
# ldapsearch -x -LLL -D 'cn=config' -W -b 'cn=config' '(cn=module{0})'
Enter LDAP Password:
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_mdb.la
olcModuleLoad: {1}ppolicy.la
Новое значение атрибута olcModuleLoad
добавилось в конец списка значений и получило индекс {1}
, хотя в данном случае порядковый номер не имеет практического значения, поскольку порядок загрузки динамических модулей не важен.
Что ж, модули мы загрузили, теперь можно создать пользовательскую базу данных.