«Нет глобальных превосходящих знаний» при добавлении страны

13

Я должен добавить organizationalunitподобное в только что установленный OpenLDAP (в Ubuntu 12.04):

dn: ou=MYREGION, ou=MYAPP, ou=GROUPS, o=myorganization, c=fr
ou: MYREGION
objectClass: top
objectClass: organizationalunit

Так как это новый LDAP, я думаю, что должен сначала добавить frстрану, и я создаю этот файл:

dn: c=fr
c: fr
objectClass: top
objectClass: country

Теперь я пытаюсь импортировать его с помощью этой команды (у меня нет домена для этого сервера):

ldapadd -x -D cn=admin,dc=nodomain -W -f country_fr.ldif

но OpenLDAP отклоняет эту команду с помощью:

adding new entry "c=fr"
ldap_add: Server is unwilling to perform (53)
    additional info: no global superior knowledge

Любой намек?

Энтони О.
источник

Ответы:

20

Ошибка 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

larsks
источник
ОК, спасибо большое, жаворонки. Но если я правильно понимаю ваш ответ, здесь вы изменяете текущий префикс базы данных этого OpenLDAP. Что если я захочу добавить новый? (Я все равно проверю ваши рекомендации, мне просто любопытно)
Энтони О.
1
Используйте ldapaddвместо ldapmodifyи используйте существующую запись в качестве модели.
Жаворонки
Если этот ответ решил вашу проблему, вы бы очень любезно отметили ее как принятую, установив флажок в левом верхнем углу вопроса.
Жаворонки
На самом деле, это мне очень помогло, но это были не точные команды, которые я передал, поэтому я создал свой собственный ответ. Я не посмел отредактировать ваш ответ, чтобы исправить его с помощью ldifs (особенно о olcAccess) и командах, которые я действительно использовал ... но если вы хотите отредактировать его с помощью копирования / вставки из моего ответа, я могу пометить его как приемлемый & удалить мой :)
Энтони О.
(Я думаю, что это не повод для занижения моего ответа ...)
Энтони О.
1

Спасибо жаворонкам ответить , вот что я сделал.

Сначала приведем фрагмент конфигурации по умолчанию с Ubuntu 12.04 (файл /etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif):

dn: olcDatabase={1}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=nodomain
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,dc=nodomain" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by self write by dn="cn=admin,dc=nodomain" write by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=nodomain

Итак, я создал следующее change_suffix.ldif:

dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: o=myorganization,c=fr
-
replace: olcRootDN
olcRootDN: cn=admin,o=myorganization,c=fr
-
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,o=myorganization,c=fr" write by * none
olcAccess: {2}to * by self write by dn="cn=admin,o=myorganization,c=fr" write by * read

и добавил его в мой ldap с помощью следующей команды:

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f change_suffix.ldif

Теперь мне нужно было создать узел организации со следующим myorganization.ldif:

dn: o=myorganization,c=fr
objectclass: organization
o: myorganization

И, наконец, добавьте его с помощью следующей команды (первая не работает из-за Insufficient access (50)):

ldapadd -x -D cn=admin,o=myorganization,c=fr -W -f myorganization.ldif

Теперь я могу добавить организационные единицы:

dn: ou=GROUPS, o=myorganization,c=fr
ou: GROUPS
objectClass: top
objectClass: organizationalunit

dn: ou=MYAPP, ou=GROUPS, o=myorganization,c=fr
ou: MYAPP
objectClass: top
objectClass: organizationalunit

dn: ou=MYREGION, ou=MYAPP, ou=GROUPS, o=myorganization,c=fr
ou: MYREGION
objectClass: top
objectClass: organizationalunit
Энтони О.
источник
Это dn: olcDatabase={1}hdb,cn=configбыло ключевым для меня, спасибо
miguelfg