10. Инструменты создания и обслуживания баз данных
Данный раздел расскажет Вам, как создавать базу данных slapd с нуля и устранять возникающие при этом проблемы, если Вы с ними столкнётесь. Существует два пути создания базы данных. Первый из них - создание базы данных при запущенном slapd с использованием операций
Второй метод - создание базы данных при остановленном slapd с помощью специальных утилит, поставляемых с slapd(8). Такой метод лучше всего подходит, если Вам надо создать много тысяч записей, что займёт неприемлемо долгое время при использовании LDAP-метода, или Вы хотите убедиться, что во время создания базы данных к ней не будет осуществляться доступ. Обратите внимание, что не все типы баз данных поддерживают эти утилиты.
10.1. Создание базы данных через LDAP
В данном методе Вы используете выбранный Вами клиент LDAP (например, ldapadd(1)) для добавления записей, точно также, как Вы это делаете в уже созданных базах данных. Перед запуском slapd(8) убедитесь, что в конфигурационном файле заданы указанные ниже директивы.
suffix <dn>
Как описано в подразделе Общие директивы баз данных, данная директива определяет, какие именно записи будут содержаться в этой базе данных. Задайте в ней DN корневой записи того поддерева, которое Вы собираетесь создать. Например:
suffix "dc=example,dc=com"
Убедитесь, что Вы указали директорию, в которую будут помещаться индексные файлы:
directory <директория>
Например:
directory /usr/local/var/openldap-data
Необходимо создать данную директорию с соответствующими правами, такими, чтобы slapd мог производить в неё запись.
Кроме того, необходимо настроить slapd так, чтобы Вы могли подсоединиться к нему под учётной записью пользователя каталога с правами на добавление записей. Можно настроить каталог, чтобы он поддерживал специального администратора или пользователя root только для этой цели. Это делается с помощью следующих двух директив в определении базы данных:
rootdn <dn> rootpw <пароль>
Например:
rootdn "cn=Manager,dc=example,dc=com" rootpw secret
Эти директивы указывают DN и пароль, которые могут быть использованы для аутентификации в качестве записи администратора базы данных (то есть записи, которой разрешено делать всё, что угодно). DN и пароль, указанные здесь, будут работать всегда, независимо от того, существует ли актуальная запись с этим именем в каталоге и задан ли для неё пароль. Таким способом решается проблема курицы и яйца применительно к тому, как проходить аутентификацию и добавлять записи, если в каталоге еще не существует ни одной записи.
Наконец, Вы должны убедиться, что определение базы данных содержит нужные Вам определения индексов:
index {<список атрибутов> | default} [pres,eq,approx,sub,none]
Например, для индексирования атрибутов cn, sn, uid и objectclass могут быть использованы следующие директивы index:
index cn,sn,uid pres,eq,approx,sub index objectClass eq
В данном примере создаются индексы наличия, равенства, приблизительного равенства и равенства подстроке для атрибутов cn, sn и uid, а также индекс равенства для атрибута objectClass. Имейте ввиду, что не все типы индексов доступны для каждого типа атрибута. Для получения дополнительной информации по данной директиве смотрите раздел Конфигурационный файл slapd.
После того, как Вы установили эти параметры под Ваши нужды, запустите slapd, подсоединитесь к нему с помощью клиента LDAP и начинайте добавлять записи. Например, чтобы добавить записи организации и организационной роли с помощью инструмента ldapadd, Вы можете создать
# Организация для Example Corporation dn: dc=example,dc=com objectClass: dcObject objectClass: organization dc: example o: Example Corporation description: The Example Corporation # Организационная роль для Directory Manager dn: cn=Manager,dc=example,dc=com objectClass: organizationalRole cn: Manager description: Directory Manager
а затем использовать такую команду, чтобы фактически создать запись:
ldapadd -f entries.ldif -x -D "cn=Manager,dc=example,dc=com" -w secret
В этой команде используются настройки, заданные в приведённых выше примерах.
10.2. Создание базы данных при отключенном slapd
Второй метод - создать базу данных при отключенном slapd, используя описанные ниже инструменты slapd для работы с базами данных. Этот метод лучше всего подходит, если Вам надо создать много тысяч записей, что займёт неприемлемо долгое время при использовании описанного выше LDAP-метода. Данные инструменты читают конфигурационный файл slapd, а также поданный на вход файл, содержащий текстовое представление добавляемых записей. Они непосредственно создают файлы баз данных для тех типов баз данных, которые поддерживаются этими инструментами. Для других типов баз данных Вы должны использовать описанный выше метод создания базы данных при запущенном slapd. Сначала нужно убедиться, что в определении базы данных в конфигурационном файле заданы несколько важных директив:
suffix <dn>
Как описано в подразделе Общие директивы баз данных, данная директива определяет, какие именно записи будут содержаться в этой базе данных. Задайте в ней DN корневой записи того поддерева, которое Вы собираетесь создать. Например:
suffix "dc=example,dc=com"
Убедитесь, что Вы указали директорию, в которую будут помещаться индексные файлы:
directory <директория>
Например:
directory /usr/local/var/openldap-data
Наконец, Вам необходимо определить индексы, которые Вы хотите построить. Это делается с помощью одной или нескольких директив index.
index {<список атрибутов> | default} [pres,eq,approx,sub,none]
Например:
index cn,sn,uid pres,eq,approx,sub index objectClass eq
В данном примере создаются индексы наличия, равенства, приблизительного равенства и равенства подстроке для атрибутов cn, sn и uid, а также индекс равенства для атрибута objectClass. Имейте в виду, что не все типы индексов доступны для каждого типа атрибута. Для получения дополнительной информации по данной директиве смотрите раздел Конфигурационный файл slapd.
10.2.1. Программа slapadd
После того, как Вы установили эти параметры под Ваши нужды, Вы создаёте основную базу данных и соответствующие индексы путём запуска программы slapadd(8):
slapadd -l <входной файл> -f <файл настроек slapd> [-d <уровень отладки>] [-n <целое число>|-b <суффикс>]
Значения параметров следующие:
-l <входной файл>
Указывает подаваемый на вход файл
-f <файл настроек slapd>
Указывает конфигурационный файл slapd, в котором определено, где создавать индексы, какие индексы создавать и т.д.
-F <директория настроек slapd>
Указывает конфигурационную директорию. Если задано сразу оба параметра -f и -F, конфигурационный файл будет прочитан, переконвертирован в формат конфигурационной директории и записан в указанную директорию. Если ни одного из этих двух параметров не было задано, slapd попытается прочитать конфигурационную директорию по умолчанию перед тем, как попытаться использовать конфигурационный файл по умолчанию. Если существует конфигурационная директория правильного формата, тогда конфигурационный файл по умолчанию игнорируется. Если при этом также указан режим холостого запуска, никакого преобразования произведено не будет.
-d <уровень отладки>
Включает вывод отладочной информации согласно указанному <уровню отладки>. Уровни отладки аналогичны соответствующим уровням для slapd. Смотрите подраздел Параметры командной строки раздела Запуск slapd.
-n <номер базы данных>
Необязательный параметр, указывающий, в какую из баз данных вносить изменения. Первая из перечисленных в конфигурационном файле баз данных получает номер 1, вторая - 2 и т.д. По умолчанию используется первая база данных из перечисленных в конфигурационном файле. Данный параметр не должен использоваться совместно с параметром -b.
-b <суффикс>
Необязательный параметр, указывающий, в какую из баз данных вносить изменения. Для определения искомой базы данных устанавливается соответствие между передаваемым суффиксом и суффиксом, указанным в директиве suffix базы данных. Данный параметр не должен использоваться совместно с параметром -n.
10.2.2. Программа slapindex
Иногда возникает необходимость пересоздать индексы (например, после изменения slapd.conf(5)). Это можно сделать с помощью программы slapindex(8). slapindex вызывается следующим образом:
slapindex -f <файл настроек slapd> [-d <уровень отладки>] [-n <номер базы данных>|-b <суффикс>]
где параметры -f, -d, -n и -b аналогичны соответствующим параметрам программы slapadd(1). slapindex перестраивает все индексы на основании текущего содержимого базы данных.
10.2.3. Программа slapcat
Программа slapcat используется для выгрузки содержимого базы данных в
slapcat -l <имя файла> -f <файл настроек slapd> [-d <уровень отладки>] [-n <номер базы данных>|-b <суффикс>]
где -n или -b используются для выбора базы данных из перечисленных в файле slapd.conf(5), указанном с помощью -f. Соответствующий выходной
10.3. Формат текстового представления записи LDIF
Основная форма представления записи следующая:
# комментарий dn: <уникальное имя (distinguished name)> <описание атрибута>: <значение атрибута> <описание атрибута>: <значение атрибута> ...
Строки, начинающиеся с символа '#', - комментарии. Описание атрибута может быть либо простым типом атрибута, таким как cn или objectClass, либо в форме 1.2.3 (
Строка может быть продолжена путём добавления одиночного символа пробела или табуляции в начало следующей строки. Например:
dn: cn=Barbara J Jensen,dc=example,dc= com cn: Barbara J Jensen
эквивалентно:
dn: cn=Barbara J Jensen,dc=example,dc=com cn: Barbara J Jensen
Несколько значений одного и того же атрибута указывается в отдельных строках. Например:
cn: Barbara J Jensen cn: Babs Jensen
Если <значение атрибута> содержит непечатные символы или начинается с пробела, двоеточия (':') или символа "меньше" ('<'), то за <описанием атрибута> следует двойное двоеточие и значение атрибута, закодированное в формате base64. Например, значение " begins with a space" будет закодировано в таком виде:
cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=
Также можно указать
cn:< file:///path/to/file.jpeg
В одном файле LDIF можно указать несколько записей, разделяя их пустой строкой. Вот пример LDIF-файла, содержащего три записи:
# Запись Barbara dn: cn=Barbara J Jensen,dc=example,dc=com cn: Barbara J Jensen cn: Babs Jensen objectClass: person sn: Jensen # Запись Bjorn dn: cn=Bjorn J Jensen,dc=example,dc=com cn: Bjorn J Jensen cn: Bjorn Jensen objectClass: person sn: Jensen # JPEG-фотография, закодированная в формате Base64 jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG # Запись Jennifer dn: cn=Jennifer J Jensen,dc=example,dc=com cn: Jennifer J Jensen cn: Jennifer Jensen objectClass: person sn: Jensen # JPEG-фотография из файла jpegPhoto:< file:///path/to/file.jpeg
Обратите внимание, что jpegPhoto в записи Bjorn закодировано в формате base64, а jpegPhoto в записи Jennifer будет получено из расположения, указанного URL.
Примечание: В файле LDIF из значений атрибутов не обрезаются конечные пробелы. Также несколько пробелов внутри значения не усекаются до одного. Если Вы не хотите, чтобы они присутствовали в Ваших данных, просто не помещайте их туда.