„Brak globalnej wiedzy wyższej” podczas dodawania kraju

14

Muszę dodać coś organizationalunittakiego do świeżo zainstalowanego OpenLDAP (na Ubuntu 12.04):

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

Ponieważ jest to nowy LDAP, myślę, że najpierw muszę dodać frkraj i tworzę ten plik:

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

Teraz próbuję zaimportować go za pomocą tego polecenia (nie mam domeny dla tego serwera):

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

ale OpenLDAP odrzuca to polecenie za pomocą:

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

Jakaś wskazówka?

Anthony O.
źródło

Odpowiedzi:

20

Błąd no global superior knowledgeoznacza, że slapdnie wiadomo, gdzie umieścić nowy wpis. Zazwyczaj oznacza to, że nie zdefiniowałeś odpowiedniej bazy danych. W przypadku nowszych systemów (tych używających cn=configzamiast slapd.conf) zazwyczaj należy najpierw dodać nową bazę danych lub zmodyfikować istniejącą pozycję bazy danych za pomocą ldapaddlub ldapmodify. Na przykład w moim systemie Fedora 17 domyślna instalacja konfiguruje bazę danych podobną do hostowania 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

Aby hostować Twoją organizację ( o=myorganization, c=fr), musiałbym utworzyć następujący plik 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

Następnie załadowałbym te modyfikacje w następujący sposób:

ldapmodify -Y EXTERNAL -H ldapi:/// -f mychanges.ldif

Działa to z powodu następujących olcAccesslinii już obecnych w konfiguracji:

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

Zapewnia to rootkontakt slapdz ldapi:///gniazdem bez dostępu do hasła do cn=configdrzewa.

Następnie załadowałbym mój wpis najwyższego poziomu:

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

Biegiem:

ldapadd -Y EXTERNAL -H ldapi:/// -f myobject.ldif

To działa, ponieważ dodałem podobną listę ACL do tej bazy danych. Zauważ, że nie musiałem zaczynać c=frtutaj, ponieważ baza danych jest zdefiniowana do przechowywaniao=myorganization,c=fr

Larsks
źródło
OK, wielkie dzięki Lars. Ale jeśli poprawnie rozumiem twoją odpowiedź, tutaj modyfikujesz bieżący prefiks bazy danych tego OpenLDAP. Co jeśli chciałbym dodać nowy? (Zresztą i tak przetestuję wasze rekomendacje, jestem po prostu ciekawy)
Anthony O.
1
Użyj ldapaddzamiast ldapmodifyi użyj istniejącego rekordu jako modelu.
larsks
Jeśli ta odpowiedź poradzi sobie z problemem, bardzo dobrze byłoby oznaczyć ją jako zaakceptowaną, klikając pole wyboru w lewym górnym rogu pytania.
larsks
Właściwie bardzo mi pomogło, ale nie były to dokładnie te polecenia, które wydałem, dlatego stworzyłem własną odpowiedź. Nie odważyłem się edytować twojej odpowiedzi, aby poprawić ją za pomocą ldifs (szczególnie o olcAccess) i komendach, których naprawdę użyłem ... ale jeśli chcesz edytować za pomocą kopiowania / wklejania z mojej odpowiedzi, mogę zaznaczyć, że jest akceptowalna & usuń mój :)
Anthony O.
(Myślę, że nie jest to powód, by głosować za moją odpowiedzią ...)
Anthony O.
1

Dzięki odpowiedzi Larsa , oto co zrobiłem.

Najpierw wyciąg z domyślnej konfiguracji z Ubuntu 12.04 (plik /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

Więc stworzyłem następujące 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

i dodałem go do mojego ldap za pomocą następującego polecenia:

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

Teraz musiałem utworzyć węzeł organizacji z następującymi elementami myorganization.ldif:

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

I na koniec dodaj go za pomocą następującego polecenia (pierwsze nie zadziałało z powodu Insufficient access (50)):

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

Teraz mogę dodać jednostki organizacyjne:

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
Anthony O.
źródło
To dn: olcDatabase={1}hdb,cn=configbyło dla mnie kluczowe, dzięki
miguelfg