"Немає глобальних вищих знань", додаючи країну


14

Я повинен додати 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


Добре, дякую багато ларків. Але якщо я правильно розумію вашу відповідь, тут ви змінюєте поточний префікс бази даних цього OpenLDAP. Що робити, якщо я хочу додати нову? (Я все-таки перевіряю ваші рекомендації, мені просто цікаво)
Ентоні О.

1
Використовуйте ldapaddзамість цього ldapmodifyі використовуйте існуючий запис як модель.
larsks

Якщо ця відповідь вирішила вашу проблему, ви будете дуже люб'язно позначити її як прийняту, натиснувши прапорець у верхньому лівому куті питання.
larsks

Насправді це мені дуже допомогло, але це були не точні команди, які я передав, тому я створив власну відповідь. Я не наважувався редагувати вашу відповідь, щоб виправити її за допомогою 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.