Создание и поддержание базы данных

Эта секция расскажет вам о создании базы данных slapd с наброска. Есть два способа создания базы данных. Во-первых, вы можете создать базу данных в реальном времени, используя LDAP. Таким образом, вы просто запускаете slapd и добавляете элементы, используя любой LDAP клиент на ваш выбор. Этот способ хорош для относительно небольших баз данных (несколько сотен или тысяч элементов, в зависимости от ваших требований).

Второй метод создания базы данных - сделать это автономно, используя средства генерации индексов. Это наилучший метод для случая, когда вам нужно создать тысячи элементов, что заняло бы неприемлемое время при использовании метода LDAP, либо если вы хотите быть уверены, что к базе данных нет доступа в процессе ее создания.

Создание базы данных в реальном времени

Программный пакет OpenLDAP поставляется с утилитой ldapadd, которая используется для добавления записей при запущенном LDAP сервере. Если вы выбрали создание базы данных в реальном времени, вы можете использовать ldapadd для добавления элементов. После первичного добавления элементов, вы все еще можете использовать ldapadd для добавления элементов. Перед запуском sldap Вы должны проверить, что в вашем файле sldap.conf установлены следующие конфигурационные опции:

suffix <отличительное имя>

Как описано в Разд. Настройка LDAP сервера>, эта опция указывает, какие элементы помещены в этой базе данных. Вы должны ее установить в значение отличительного имени корня поддерева, которое вы собираетесь создать. Например:

suffix "o=TUDelft, c=NL"

Вы должны проверить, что указали каталог, где должны быть созданы индексные файлы:

directory <каталог>

Например:

directory /usr/local/tudelft

Вам следует создать его, теперь вы можете подключаться к slapd как кто-то с правами на добавление записей. Это делается следующими двумя опциями в определении базы данных:

rootdn <отличительное имя>

rootpw <passwd> /* Не забудьте тут используется crypto или SHA пароль!!! */

Эти опции задают отличительное имя и пароль, используемые для аутентификации элемента "суперпользователя" базы данных (т.е., элемента которому разрешено делать все). Данные здесь отличительное имя и пароль будут работать всегда, не зависимо от того, существует ли такой элемент на самом деле и имеет ли он такой же пароль. Это решает проблему курицы и яйца относительно аутентификации и добавления элементов до существования самих элементов.

Если вы используете SASL механизм аутентификации LDAP, строку rootpw можно отбросить. Более подробную информацию ищите в секциях Настойка LDAP и Аутентификация.

В заключение, вы должны удостовериться, что определение базы данных содержит определение необходимых вам индексов:

index {<attrlist> | default} [pres,eq,approx,sub,none]

Например, для индексации атрибутов cn, sn, uid и objectclass можно использовать следующие строки конфигурации индексов.

index cn,sn,uid

index objectclass pres,eq

index default none

Как только вы все настроили по вашему вкусу, запустите slapd, подключитесь с помощью вашего любимого LDAP клиента, и начните добавлять элементы. Например, для добавления с помощью утилиты ldapadd элемента TUDelft и следующего за ним элемента Postmaster, вы можете создать файл /tmp/newentry с таким содержимым:
o=TUDelft, c=NL 
objectClass=organization 
description=Technical University of Delft Netherlands 

cn=Postmaster, o=TUDelft, c=NL 
objectClass=organizationalRole 
cn=Postmaster 
description= TUDelft postmaster - postmaster@tudelft.nl 

и затем использовать подобную команду для создания элемента:
ldapadd -f /tmp/newentry -D "cn=Manager, o=TUDelft, c=NL" -w secret 

Вышеприведенная команда предполагает, что у вас rootdn установлен в "cn=Manager, o=TUDelft, c=NL" а rootpw в "secret". Если вы хотите набирать пароль в командной строке, используйте опцию -W в команде ldapadd вместо -w "password". Вам будет выдано приглашение к вводу пароля:
ldapadd -f /tmp/newentry -D "cn=Manager, o=TUDelft, c=NL" -W 
Enter LDAP Password: 

Автономное создание базы данных

Второй метод создания базы данных - сделать это автономно, используя нижеописанные утилиты генерирования индексов. Этот метод предпочтительней, если вам необходимо создать тысячи элементов, что заняло бы неприемлемое время при использовании вышеописанного LDAP метода. Эти утилиты читают конфигурационный файл slapd и содержащий текстовое представление добавляемых элементов входной LDIF файл. Они создают непосредственно индексный файл LDBM. Есть несколько важных конфигурационных опций, которые вы захотите проверить и установить в определении базы данных в конфигурационном файле:

suffix <отличительное имя>

Как описано в предыдущей секции, эта опция указывает какие элементы удерживать в базе данных. Вы должны установить ее в значение отличительного имени корня создаваемого вами поддерева. Например:

suffix "o=TUDelft, c=NL"

Вы должны проверить, что вы указали каталог, где должны быть созданы индексные файлы:

directory <каталог>

Например:

directory /usr/local/tudelft

Далее, вероятно вы захотите увеличить размер внутреннего кеша используемого каждым открытым файлом. Для наилучшей производительности при создании индекса, весь индекс должен поместиться в память. Если ваши данные слишком велики для этого, или у вас слишком мало памяти, вы все еще можете сделать ее большой и дать работу вашей системе виртуальной памяти. Этот размер устанавливается следующей опцией:

dbcachesize <целое число>

Например:

dbcachesize 50000000

Будет создан 50 Мб кеш, он достаточно велик (на University of Michigan, база данных содержит около 125Кб элементов, и наибольший индексный файл около 45 Мб). Немного поэкспериментируйте с этим значением, и параллельно (объясняется ниже) посмотрите, как работает ваша система. Помните о необходимости вернуть это значение обратно после создания индексных файлов и до запуска slapd.

В конце, в нужно указать какие индексы вы хотите создать. Это делается одной или более опциями.

index {<attrlist> | default} [pres,eq,approx,sub,none]

Например:

index cn,sn,uid pres,eq,approx

index default none

Буду созданы индексы presence, equality и approximate для атрибутов cn, sn, и uid, а для других атрибутов не будет создано никаких индексов. Более подробную информацию смотрите в конфигурационном файле Разд. Настройка LDAP сервера>.

Как только вы настроили все, как хотели, вы создаете первичную базу данных и ассоциированные индексы программой slapadd(8):

slapadd -l <входной файл> -f <конфигурационный файл slapd> [-d <уровень отладки>] [-n <целое число>|-b <суффикс>]

Аргументы имеют следующее значение:
-l <входной файл>

Определяет входной LDIF файл, содержащий добавляемые элементы в текстовой форме (Взгляните на следующую секцию).
-f <конфигурационный файл slapd>

Указывает конфигурационный файл slapd, в котором определено: где создавать индексы, какие индексы создавать и т.п.
-d <уровень отладки>

Включает отладку, в соответствии с <уровень отладки>. Уровни отладки такие же, как и для slapd. Смотрите секцию Разд. Ключи командной строки> в части запуск slapd.
-n <номер базы данных>

Необязательный аргумент указывает, какую базу данных модифицировать. Первая по списку база данных в конфигурационном файле считается 1, вторая - 2, и т.д. По умолчанию, используется первая ldbm база данных в конфигурационном файле. Не должен использоваться вместе с ключом -b.
-b <суффикс>

Необязательный аргумент, указывающий какую базу данных модифицировать. Представленный суффикс сопоставляется с суффиксом базы данных и при совпадении определяется номер модифицируемой базы данных. Не должен использоваться вместе с ключом -n.

Иногда возникает необходимость перегенерировать индексы (например, после модификации slapd.conf(5)). Это можно сделать используя, программу slapindex(8). slapindex вызывается так:

slapindex -f <конфигурационный файл slapd> [-d <уровень отладки>] [-n <номер базы данных>|-b <суффикс>]

Где ключи -f, -d, -n и -b такие же, как и для программы slapadd(1). slapindex перестраивает все индексы, основываясь на текущем содержимом базы данных.

Также есть программа slapcat, которая используется для дампа базы данных в LDIF файл. Она может быть полезна, когда вы хотите создать читаемую резервную копию вашей базы данных или хотите отредактировать вашу базу данных автономно. Программы вызывается так:

slapcat -l <filename> -f <slapdconfigfile> [-d <debuglevel>] [-n <databasenumber>|-b <suffix>]

где -n или -b выбирают базу данных в файле slapd.conf(5) указанном в ключе -f. Соответствующий LDIF вывод пишется в стандартный вывод или файл указанный ключом -l.

Подробнее о LDIF формате

LDAP Data Interchange Format (LDIF) используется для представления элементов LDAP в простом текстовом формате. Базовый формат элемента таков:
#комментарий 
dn: <отличительное имя> 
<attrdesc>: <значение атрибута> 
<attrdesc>: <значение атрибута> 
... 

Строки, начинающиеся с символа '#', являются комментариями. Описание атрибута (attrdesc) может быть простым типом атрибута как, например, cn или objectClass или 1.2.3 (OID ассоциированный с типом атрибута) или может включать опции, такие как cn;lang_en_US или userCertificate;binary.

Строка может продолжаться на следующей строке с отступом в один пробел или символ табуляции. Например:
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

Если <значение атрибута> содержит непечатные символы или начинается с пробела, двоеточия (':'), или знака меньше ('<'), то <attrdesc> завершенное двумя двоеточиями, за которым следует значение, закодированное в base64. Например, значение " begins with a space" будет закодировано так:
cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=

Также вы можете указать URL содержащий значение атрибута. Например, следующая запись определяет, что значение jpegPhoto должно быть получено из файла /path/to/file.jpeg.
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
# закодированная в Base64 фотография в JPEG
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 закодировано в base 64, а jpegPhoto в элементе Jennifer берется по месту указания URL.

Завершающие пробелы не обрезаются от значений в LDIF файле. А также не сжимаются повторяющиеся множественные пробелы. Если вы не хотите, чтобы они были в ваших данных, не ставьте их.

Утилиты ldapsearch, ldapdelete и ldapmodify

ldapsearch это - интерфейс shell к библиотечному вызову ldap_search(3). Используйте эту утилиту для поиска элементов в вашем LDAP механизме базы данных.

Далее следует синтаксис вызова ldapsearch (чтобы узнать, что обозначает каждый ключ, загляните в man страницу ldapsearch):
ldapsearch  [-n]  [-u]  [-v]  [-k]  
[-K]  [-t]  [-A] [-B] [-L] 
[-R] [-d уровень отладки] [-F sep] [-f файл] 
[-D binddn]  [-W]  [-w bindpasswd]  
[-h ldaphost]  [-p ldapport]   [-b основание поиска]   
[-s base|one|sub] 
[-a never|always|search|find] [-l timelimit] 
[-z sizelimit] filter [attrs...] 

ldapsearch открывает соединение с сервером LDAP, присоединяется, и выполняет поиск с фильтром filter. Фильтр должен соответствовать строковому представлению фильтров LDAP, как определено в RFC 1558. Если ldapsearch находит один или более элементов, то извлекаются атрибуты, указанные в attrs, элементы и их значения печатаются в стандартный вывод. Если attrs не указан, возвращаются все атрибуты.

Вот несколько примеров использования ldapsearch:
ldapsearch -b 'o=TUDelft,c=NL' 'objectclass=*' 

ldapsearch -b 'o=TUDelft,c=NL' 'cn=Rene van Leuken' 

ldasearch -u -b 'o=TUDelft,c=NL' 'cn=Luiz Malere' sn mail 

Ключ -b определяет основание поиска (начальную точку поиска), а ключ -u указывает выводить информацию в понятном для пользователя виде.

ldapdelete это - shell интерфейс к библиотечному вызову ldap_delete(3). Эта утилита используется для удаления элементов из вашего LDAP механизма базы данных.

Синтаксис вызова ldapdelete таков (что означает каждый ключ можно найти в man странице ldapdelete):
ldapdelete   [-n]   [-v]  [-k]  [-K]  
[-c]  [-d уровень отладки]  [-f файл]  [-D binddn]  
[-W]  [-w пароль] [-h ldaphost] [-p ldapport] 
[dn]... 

ldapdelete открывает соединение к LDAP серверу, подключается и удаляет один или более элементов. Если приложен один или более dn аргумент, элементы с этим отличительными именами будут удалены. Каждое отличительное имя должно быть строковым представлением отличительного имени в соответствии с RFC 1779. Если вызов был сделан без аргументов, список отличительных имен читается со стандартного ввода (или из файла указанного ключом -f).

Вот несколько примеров использования ldapdelete:
ldapdelete 'cn=Luiz Malere,o=TUDelft,c=NL' 

ldapdelete -v 'cn=Rene van Leuken,o=TUDelft,c=NL' -D 'cn=Luiz Malere,o=TUDelft,
c=NL' -W 

Ключ -v обозначает многословный режим, ключ -D обозначает Binddn (отличительное имя для аутентификации), а ключ -W обозначает запрашивать пароль.

ldapmodify это - shell интерфейс к библиотечным вызовам ldap_modify(3) и ldap_add(3). Эта утилита используется для изменения содержимого элементов вашего LDAP механизма баз данных.

Синтаксис вызова ldapmodify таков (что обозначает каждый ключ можно посмотреть в man странице ldapmodify):
ldapmodify   [-a]  [-b]  [-c]  [-r]  
[-n]  [-v]  [-k]  [-d уровень отладки]  
[-D binddn]  [-W]  [-w пароль] 
[-h ldaphost] [-p ldapport] [-f файл] 

ldapadd [-b] [-c] [-r] [-n] 
[-v]  [-k]  [-K]  [-d уровень отладки]  
[-D binddn]  [-w пароль]  [-h ldaphost] 
[-p ldapport] [-f файл] 

ldapadd - это просто жесткая ссылка на утилиту ldapmodify. При вызове ldapadd автоматически включается ключ -a (добавить элемент) утилиты ldapmodify.

ldapmodify открывает соединение к LDAP серверу, подключается, изменяет или добавляет элементы. Информация об элементах читается из стандартного ввода или из файла указываемого ключом -f.

Вот несколько примеров использования ldapmodify:

Предполагается, что файл /tmp/entrymods существует и содержит следующее:
dn: cn=Modify Me, o=University of Michigan, c=US 
changetype: modify 
replace: mail 
mail: modme@terminator.rs.itd.umich.edu 
- 
add: title 
title: Grand Poobah 
- 
add: jpegPhoto 
jpegPhoto: /tmp/modme.jpeg 
- 
delete: description 
- 

Команда:
ldapmodify -b -r -f /tmp/entrymods 

заменит содержимое атрибута mail элемента "Modify Me" на значение "modme@terminator.rs.itd.umich.edu", добавит заголовок "Grand Poobah", и содержимое файла /tmp/modme.jpeg в jpegPhoto, а также полностью удалит атрибут description.

Аналогичные вышеприведенным изменения можно выполнить, используя старый формат ввода ldapmodify:
cn=Modify Me, o=University of Michigan, c=US 
mail=modme@terminator.rs.itd.umich.edu 
+title=Grand Poobah 
+jpegPhoto=/tmp/modme.jpeg 
-description 

И еще одна команда:
ldapmodify -b -r -f /tmp/entrymods 

Предполагается, что файл /tmp/newentry существует и содержит следующее:
dn: cn=Barbara Jensen, o=University of Michigan, c=US 
objectClass: person 
cn: Barbara Jensen 
cn: Babs Jensen 
sn: Jensen 
title: the world's most famous manager 
mail: bjensen@terminator.rs.itd.umich.edu 
uid: bjensen 

Команда:
ldapadd -f /tmp/entrymods 

добавит элемент с отличительным именем: cn=Barbara Jensen, o=University of Michigan, c=US, если он еще не существует. Если элемент с таким отличительным именем уже существует, команда укажет на ошибку и не заменит содержимое элемента.

Предполагается, что файл /tmp/newentry существует и содержит:
dn: cn=Barbara Jensen, o=University of Michigan, c=US 
changetype: delete 

Команда:
ldapmodify -f /tmp/entrymods 

удалит элемент Babs Jensen.

Ключ -f определяет файл (читать информацию о изменениях из файла, а не из стандартного ввода), ключ -b обозначает двоичный режим (любые значения начинающиеся с '/' во входном файле интерпретируются как двоичные), ключ -r обозначает заменять (по умолчанию заменять существующие значения)