Как известно, записи каталога 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"
С добавлением наборов схемы разобрались. Теперь поговорим о наложениях.