LDAP: добавление записи из ldif-файла на примере создания root для DIT и описание objectClass

Автор: | 01/06/2014
 

ldap-logoЗапись (entry) root — она же base, она же suffix, является корневой записью верхнего уровня для всего дерева DIT (информационное дерево каталога — Data Information Tree).

Один LDAP-сервер может иметь несколько DIT, но только один Root DSE (запись самого верхнего уровня в иерархии LDAP).

DSE расшифровывается как DSA Specific Entry (специфичная для DSA запись).

DSA расшифровывается как Directory System Agent (системный агент каталога, то есть любая служба каталогов, предоставляющая доступ через DAP или LDAP).

Что бы обозначить запись как корневую (root) — используем объектный класс (objectClass) top.

Его определение описано в файле схемы core.schema (/usr/local/etc/openldap/schema/core.schema во FreeBSD):

objectclass ( 2.5.6.0 NAME 'top' ABSTRACT
MUST objectClass )

Немного пояснений к элементам:

2.5.6.0 NAME 'top' // имя по которому вызывается класс;
2.5.6.0 // OID (ObjectIdentifier, идентификатора объекта);
ABSTRACT // несуществующий объектный класс, используемый для удобства: так же бывают: STRUCTURAL — объектный класс содержит атрибуты и может формировать запись в DIT и AUXILIARY — вспомогательный, содержит атрибуты и может использоваться для формирования записи с любым структурным объектным классом, но самостоятельно формировать запись в DIT не может;
MUST // атрибуты из списка являются обязательными;
так же могут быть MAY — атрибуты из списка являются необязательными и для создания экземпляра объектного класса их присутствие не требуется.

В данном случае — объектный класс top требует наличия другого STRUCTURAL objectClass (объектного класса), иначе — при добавлении записи будет выдано сообщение об ошибке:

# cat testdn1.ldif
dn: dc=testdn1
objectClass: top
# ldapadd -x -D "cn=root,dc=testdn1" -W -f testdn1.ldif
Enter LDAP Password:
adding new entry "dc=testdn1"
ldap_add: Object class violation (65)
additional info: no structural object class provided

Про утилиту ldapadd кратко есть в статье FreeBSD: установка OpenLDAP сервера.

Добавим новый объектный класс — organizationName. Его описание в файле схемы выглядит так:

objectclass ( 2.5.6.4 NAME 'organization' SUP top STRUCTURAL
MUST o
MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $
x121Address $ registeredAddress $ destinationIndicator $
preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $
telephoneNumber $ internationaliSDNNumber $
facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $
postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )

В описании указано, что он является STRUCTURAL, т.е. — может создавать записи в DIT, и для него является обязательным атрибут o:

MUST o
attributetype ( 2.5.4.10 NAME ( 'o' 'organizationName' ) SUP name )

Кроме того, нам необходимо задать DNDistinguished Name, уникальное имя. Для этого мы подключим объектный класс dcObject:

objectclass ( 1.3.6.1.4.1.1466.344 NAME 'dcObject'
DESC 'RFC2247: domain component object'
SUP top AUXILIARY MUST dc )

Обратите внимание, что объект dcObject является AUXILIARY классом.

Редактируем наш ldif-файл:

# cat testdn1.ldif
dn: dc=testdn1
objectClass: top
objectClass: dcObject
objectClass: organization
dc: testdn1
o: TestLDAP
description: Testing LDAP server DIT number one

Тут мы определили три объектных класса:

objectClass: top
objectClass: dcObject
objectClass: organization

Добавляем запись:

# ldapadd -x -D "cn=root,dc=testdn1" -W -f testdn1.ldif
Enter LDAP Password:
adding new entry "dc=testdn1"

Посмотрим её:

ldap_add_dit

Или так:

# ldapsearch -x -s base -b "" +
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: +
#

#
dn:
structuralObjectClass: OpenLDAProotDSE
configContext: cn=config
namingContexts: dc=testdn1
# ldapsearch -x -s base -b "dc=testdn1" +
# extended LDIF
#
# LDAPv3
# base <dc=testdn1> with scope baseObject
# filter: (objectclass=*)
# requesting: +
#

# testdn1
dn: dc=testdn1
structuralObjectClass: organization
entryUUID: 79221410-0981-1033-9e86-531833134e87
creatorsName: cn=root,dc=testdn1
createTimestamp: 20140104114537Z
entryCSN: 20140104114537.495029Z#000000#000#000000
modifiersName: cn=root,dc=testdn1
modifyTimestamp: 20140104114537Z
entryDN: dc=testdn1
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE