Запись (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 )
Кроме того, нам необходимо задать DN – Distinguished 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"
Посмотрим её:
Или так:
# 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