Ошибка no global superior knowledge
означает, что slapd
не знает, где разместить новую запись. Обычно это означает, что вы не определили соответствующую базу данных. В более новых системах (использующих cn=config
вместо slapd.conf
) вы обычно сначала добавляете новую базу данных или изменяете существующую запись базы данных, используя ldapadd
или ldapmodify
. Например, в моей системе Fedora 17 при установке по умолчанию база данных для хостинга настраивается следующим образом dc=my-domain,dc=com
:
dn: olcDatabase={2}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
creatorsName: cn=config
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
Чтобы разместить вашу организацию ( o=myorganization, c=fr
), мне нужно создать следующий файл LDIF:
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: o=myorganization, c=fr
-
replace: olcRootDN
olcRootDN: cn=Manager,o=myorganization,c=fr
-
replace: olcAccess
olcAccess: {0}to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" write
by dn.base="cn=Manager,o=myorganization,c=fr" write
by * none
И тогда я бы загрузил эти модификации так:
ldapmodify -Y EXTERNAL -H ldapi:/// -f mychanges.ldif
Это работает из-за следующих olcAccess
строк, уже присутствующих в конфигурации:
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * none
Это дает root
, связываясь slapd
через ldapi:///
сокет, беспарольный доступ к cn=config
дереву.
Затем я бы загрузил в моей записи верхнего уровня:
dn: o=myorganization, c=fr
objectclass: organization
o: myorganization
Запустив:
ldapadd -Y EXTERNAL -H ldapi:/// -f myobject.ldif
Это работает, потому что я добавил аналогичный ACL в эту базу данных. Обратите внимание, что мне не нужно было начинать c=fr
здесь, потому что база данных определена для храненияo=myorganization,c=fr