3.5 Добавление наборов схемы данных

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

Как известно, записи каталога LDAP состоят из атрибутов, входящих в те или иные объектные классы. Чтобы объектные классы и атрибуты можно было использовать для построения записей, их описание должно присутствовать в схеме данных службы каталогов. В отличие от системной схемы данных, описание атрибутов и объектных классов которой жёстко вкомпилировано в slapd, пользовательскую схему данных можно расширять за счёт включения так называемых файлов набора схемы данных — по сути, файлов с описанием требуемых для той или иной прикладной задачи объектных классов и атрибутов. Поскольку сама система настроек cn=config представляет собой LDAP-каталог, немудрено, что наборы схемы данных выполнены в виде записи каталога, основанной на объектном классе olcSchemaConfig, в которой описания атрибутов содержатся в атрибуте olcAttributeTypes, а описание объектных классов — в атрибуте olcObjectClasses. Описание такой записи в текстовом виде представляет собой ни что иное, как LDIF-файл с расширением ldif, название которого обычно отражает название набора схемы данных. Так, с дистрибутивом OpenLDAP, кроме добавленного нами ранее файла core.ldif, поставляются также файлы наборов схемы cosine.ldif, inetorgperson.ldif и nis.ldif, объектные классы и атрибуты из которых используются в абсолютном большинстве каталогов. Их мы сейчас и добавим. В каждом из этих файлов находится описание одной единственной записи, которая будет добавлена как дочерняя для записи cn=schema,cn=config. RDN этой записи отражает название набора схемы данных, например cn=inetorgperson.

В дистрибутив OpenLDAP входит также файл openldap.ldif. Это — файл-пример набора схемы данных, никакой практической пользы он не представляет, поэтому его добавлять мы не будем.

Для добавления одного набора схемы данных можно просто выполнить ldapadd:

# ldapadd -x -D 'cn=config' -W -f /etc/ldap/schema/cosine.ldif

Можно и сразу добавить несколько наборов схемы. Для этого создадим промежуточный LDIF-файл /tmp/ldifs/005-add_schemas.ldif с директивами include:

include: file:///etc/ldap/schema/cosine.ldif

include: file:///etc/ldap/schema/inetorgperson.ldif

include: file:///etc/ldap/schema/nis.ldif

Применим его командой ldapadd:

# ldapadd -x -D 'cn=config' -W -f /tmp/ldifs/005-add_schemas.ldif
Enter LDAP Password: 
adding new entry "cn=cosine,cn=schema,cn=config"

adding new entry "cn=inetorgperson,cn=schema,cn=config"

adding new entry "cn=nis,cn=schema,cn=config"

Посмотрим, что получилось:

# ldapsearch -x -LLL -D 'cn=config' -W -b 'cn=schema,cn=config' -s one 1.1
Enter LDAP Password: 
dn: cn={0}core,cn=schema,cn=config

dn: cn={1}cosine,cn=schema,cn=config

dn: cn={2}inetorgperson,cn=schema,cn=config

dn: cn={3}nis,cn=schema,cn=config

Все наши схемы на месте. Уже можно добавлять записи в пользовательское DIT, правда, только те, для которых нам хватит объектных классов и атрибутов из подключенных наборов схемы. Как быть, если нам требуются другие атрибуты и объектные классы? Конечно же, подключить другие наборы схемы данных! OpenLDAP и многие приложения, интегрирующиеся с LDAP-каталогом, поставляются с наборами схемы для расширения пользовательской схемы данных каталога под различные задачи. Беда в том, что они выполнены не в виде LDIF-файла с записью набора схемы, а в виде обычных текстовых файлов с расширением schema (их часто называют schema-файлами). В них содержатся описания атрибутов и объектных классов в формате, который воспринимает разборщик конфигурационного файла slapd.conf. Именно этой особенностью мы и воспользуемся, чтобы, имея schema-файл, получить необходимый нам набор схемы данных в формате ldif.

Получение и подключение дополнительных наборов схемы данных.

Итак, у нас есть набор схемы данных в виде schema-файла, например ppolicy.schema из поставки OpenLDAP. Для того, чтобы получить из него файл в формате ldif, воспользуемся процедурой переконвертации конфигурационного файла в формате slapd.conf в конфигурационную директорию в формате cn=config. Сначала создадим фиктивный файл /tmp/dummy.conf, внутри которого будет только одна директива include, подключающая наш набор схемы:

include /etc/ldap/schema/ppolicy.schema

Затем создадим фиктивную конфигурационную директорию /tmp/dummy.d и выполним преобразование нашего вновь созданного конфигурационного файла:

# mkdir /tmp/dummy.d
# slaptest -F /tmp/dummy.d -f /tmp/dummy.conf
config file testing succeeded

Нас интересует содержимое создавшейся в результате переконвертации директории /tmp/dummy.d/cn=config/cn=schema:

#ls /tmp/dummy.d/cn=config/cn=schema
cn={0}ppolicy.ldif

Как мы видим, был создан LDIF-файл с нужным нам набором схемы данных. Правда, он требует некоторой доработки. Исходный файл у нас такого содержимого:

dn: cn={0}ppolicy
objectClass: olcSchemaConfig
cn: {0}ppolicy
olcAttributeTypes: {0}( 1.3.6.1.4.1.42.2.27.8.1.1 NAME 'pwdAttribute' EQUALITY
  objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
olcAttributeTypes: {1}( 1.3.6.1.4.1.42.2.27.8.1.2 NAME 'pwdMinAge' EQUALITY in
 tegerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {2}( 1.3.6.1.4.1.42.2.27.8.1.3 NAME 'pwdMaxAge' EQUALITY in
 tegerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {3}( 1.3.6.1.4.1.42.2.27.8.1.4 NAME 'pwdInHistory' EQUALITY
  integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {4}( 1.3.6.1.4.1.42.2.27.8.1.5 NAME 'pwdCheckQuality' EQUAL
 ITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {5}( 1.3.6.1.4.1.42.2.27.8.1.6 NAME 'pwdMinLength' EQUALITY
  integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {6}( 1.3.6.1.4.1.42.2.27.8.1.7 NAME 'pwdExpireWarning' EQUA
 LITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {7}( 1.3.6.1.4.1.42.2.27.8.1.8 NAME 'pwdGraceAuthNLimit' EQ
 UALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {8}( 1.3.6.1.4.1.42.2.27.8.1.9 NAME 'pwdLockout' EQUALITY b
 ooleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {9}( 1.3.6.1.4.1.42.2.27.8.1.10 NAME 'pwdLockoutDuration' E
 QUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {10}( 1.3.6.1.4.1.42.2.27.8.1.11 NAME 'pwdMaxFailure' EQUAL
 ITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {11}( 1.3.6.1.4.1.42.2.27.8.1.12 NAME 'pwdFailureCountInter
 val' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE 
 )
olcAttributeTypes: {12}( 1.3.6.1.4.1.42.2.27.8.1.13 NAME 'pwdMustChange' EQUAL
 ITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {13}( 1.3.6.1.4.1.42.2.27.8.1.14 NAME 'pwdAllowUserChange' 
 EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {14}( 1.3.6.1.4.1.42.2.27.8.1.15 NAME 'pwdSafeModify' EQUAL
 ITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {15}( 1.3.6.1.4.1.4754.1.99.1 NAME 'pwdCheckModule' DESC 'L
 oadable module that instantiates "check_password() function' EQUALITY caseExa
 ctIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcObjectClasses: {0}( 1.3.6.1.4.1.4754.2.99.1 NAME 'pwdPolicyChecker' SUP top
  AUXILIARY MAY pwdCheckModule )
olcObjectClasses: {1}( 1.3.6.1.4.1.42.2.27.8.2.1 NAME 'pwdPolicy' SUP top AUXI
 LIARY MUST pwdAttribute MAY ( pwdMinAge $ pwdMaxAge $ pwdInHistory $ pwdCheck
 Quality $ pwdMinLength $ pwdExpireWarning $ pwdGraceAuthNLimit $ pwdLockout $
  pwdLockoutDuration $ pwdMaxFailure $ pwdFailureCountInterval $ pwdMustChange
  $ pwdAllowUserChange $ pwdSafeModify ) )
structuralObjectClass: olcSchemaConfig
entryUUID: ff54fd44-bd0c-1031-8cd7-774f84d3cea3
creatorsName: cn=config
createTimestamp: 20121107095525Z
entryCSN: 20121107095525.479674Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20121107095525Z

При переконвертации slaptest создал новое упорядоченное множество из подключенных наборов схемы данных. Поскольку у нас был подключен только один набор, он получил индекс {0}. В нашей рабочей конфигурации уже есть ряд подключенных наборов схемы, которые составляют своё упорядоченное множество. Целесообразно добавлять новые наборы в конец существующего множества, поэтому нужно удалить индекс из DN (строка 1) и RND (строка 3).

Мы будем добавлять этот набор схемы в нашу рабочую конфигурацию как запись, дочернюю по отношению к cn=schema,cn=config, поэтому подправим соответствующим образом DN в строке 1.

Наконец, нужно удалить автоматически созданные операционные атрибуты (строки 45-51), при добавлении записи slapd вновь автоматически создаст их и поместит туда нужные значения.

Откроем файл /tmp/dummy.d/cn=config/cn=schema/cn={0}ppolicy.ldif в любимом текстовом редакторе и внесём соответствующие коррективы. Получим такой файл:

dn: cn=ppolicy,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: ppolicy
olcAttributeTypes: {0}( 1.3.6.1.4.1.42.2.27.8.1.1 NAME 'pwdAttribute' EQUALITY
  objectIdentifierMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
olcAttributeTypes: {1}( 1.3.6.1.4.1.42.2.27.8.1.2 NAME 'pwdMinAge' EQUALITY in
 tegerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {2}( 1.3.6.1.4.1.42.2.27.8.1.3 NAME 'pwdMaxAge' EQUALITY in
 tegerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {3}( 1.3.6.1.4.1.42.2.27.8.1.4 NAME 'pwdInHistory' EQUALITY
  integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {4}( 1.3.6.1.4.1.42.2.27.8.1.5 NAME 'pwdCheckQuality' EQUAL
 ITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {5}( 1.3.6.1.4.1.42.2.27.8.1.6 NAME 'pwdMinLength' EQUALITY
  integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {6}( 1.3.6.1.4.1.42.2.27.8.1.7 NAME 'pwdExpireWarning' EQUA
 LITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {7}( 1.3.6.1.4.1.42.2.27.8.1.8 NAME 'pwdGraceAuthNLimit' EQ
 UALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {8}( 1.3.6.1.4.1.42.2.27.8.1.9 NAME 'pwdLockout' EQUALITY b
 ooleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {9}( 1.3.6.1.4.1.42.2.27.8.1.10 NAME 'pwdLockoutDuration' E
 QUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {10}( 1.3.6.1.4.1.42.2.27.8.1.11 NAME 'pwdMaxFailure' EQUAL
 ITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {11}( 1.3.6.1.4.1.42.2.27.8.1.12 NAME 'pwdFailureCountInter
 val' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE 
 )
olcAttributeTypes: {12}( 1.3.6.1.4.1.42.2.27.8.1.13 NAME 'pwdMustChange' EQUAL
 ITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {13}( 1.3.6.1.4.1.42.2.27.8.1.14 NAME 'pwdAllowUserChange' 
 EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {14}( 1.3.6.1.4.1.42.2.27.8.1.15 NAME 'pwdSafeModify' EQUAL
 ITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )
olcAttributeTypes: {15}( 1.3.6.1.4.1.4754.1.99.1 NAME 'pwdCheckModule' DESC 'L
 oadable module that instantiates "check_password() function' EQUALITY caseExa
 ctIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcObjectClasses: {0}( 1.3.6.1.4.1.4754.2.99.1 NAME 'pwdPolicyChecker' SUP top
  AUXILIARY MAY pwdCheckModule )
olcObjectClasses: {1}( 1.3.6.1.4.1.42.2.27.8.2.1 NAME 'pwdPolicy' SUP top AUXI
 LIARY MUST pwdAttribute MAY ( pwdMinAge $ pwdMaxAge $ pwdInHistory $ pwdCheck
 Quality $ pwdMinLength $ pwdExpireWarning $ pwdGraceAuthNLimit $ pwdLockout $
  pwdLockoutDuration $ pwdMaxFailure $ pwdFailureCountInterval $ pwdMustChange
  $ pwdAllowUserChange $ pwdSafeModify ) )

Можно одновременно переконвертировать несколько schema-файлов путём добавления нескольких директив include в /tmp/dummy.conf, тогда каждый из них преобразуется в отдельный LDIF-файл в директории /tmp/dummy.d/cn=config/cn=schema и над каждым нужно будет произвести подобные манипуляции.

Наш файл готов к добавлению. Переместим его в директорию /etc/ldap/schema и удалим лишние файлы и директории:

# mv /tmp/dummy.d/cn\=config/cn\=schema/cn\=\{0\}ppolicy.ldif /etc/ldap/schema/ppolicy.ldif
# rm -r /tmp/dummy.conf /tmp/dummy.d

Осталось только добавить наш набор схемы с помощью ldapadd:

# ldapadd -x -D 'cn=config' -W -f /etc/ldap/schema/ppolicy.ldif
Enter LDAP Password: 
adding new entry "cn=ppolicy,cn=schema,cn=config"

С добавлением наборов схемы разобрались. Теперь поговорим о наложениях.

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