"Sin conocimiento superior global" al agregar un país

13

Debo agregar un tipo organizationalunitcomo este en un OpenLDAP recién instalado (en Ubuntu 12.04):

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

Entonces, como es un nuevo LDAP, creo que primero debo agregar el frpaís y creo ese archivo:

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

Ahora trato de importarlo con ese comando (no tengo dominio para ese servidor):

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

pero OpenLDAP rechaza ese comando con:

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

Alguna pista?

Anthony O.
fuente

Respuestas:

20

El error no global superior knowledgesignifica que slapdno sabe dónde colocar su nueva entrada. Esto generalmente significa que no ha definido una base de datos adecuada. Con los sistemas más nuevos (los que usan en cn=configlugar de slapd.conf), normalmente primero debe agregar una nueva base de datos o modificar una entrada de la base de datos existente usando ldapaddo ldapmodify. Por ejemplo, en mi sistema Fedora 17, la instalación predeterminada configura una base de datos como esta para alojar 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

Para alojar su organización ( o=myorganization, c=fr), necesitaría crear el siguiente archivo 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

Y luego cargaría estas modificaciones de esta manera:

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

Esto funciona debido a las siguientes olcAccesslíneas ya presentes en la configuración:

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

Esto otorga root, contactando a slapdtravés del ldapi:///zócalo, acceso sin contraseña al cn=configárbol.

Luego cargaría en mi entrada de nivel superior:

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

Mediante la ejecución:

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

Esto funciona porque he agregado una ACL similar a esta base de datos. Tenga en cuenta que no necesitaba comenzar c=fraquí, porque la base de datos está definida para contenero=myorganization,c=fr

larsks
fuente
OK, muchas gracias. Pero si entiendo correctamente su respuesta, aquí modifica el prefijo actual de la base de datos de este OpenLDAP. ¿Qué pasa si quisiera agregar uno nuevo? (Probaré sus recomendaciones de todos modos, solo tengo curiosidad)
Anthony O.
1
Use en ldapaddlugar de ldapmodifyy use el registro existente como modelo.
larsks
Si esta respuesta resolvió su problema, sería muy amable de su parte marcarla como aceptada haciendo clic en la casilla de verificación en la esquina superior izquierda de la pregunta.
larsks
En realidad, me ayudó mucho, pero no fueron los comandos exactos que pasé, por eso he creado mi propia respuesta. No me atreví a editar su respuesta para corregirla con los ldifs (especialmente sobre olcAccess) y los comandos que realmente usé ... pero si desea editarla con copiar / pegar de mi respuesta, puedo marcarla como aceptable y eliminar el mío :)
Anthony O.
(Creo que esta no es una razón para rechazar mi respuesta ...)
Anthony O.
1

Gracias a la respuesta de larsks , esto es lo que hice.

Primero, aquí hay un extracto de la configuración predeterminada con Ubuntu 12.04 (archivo /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

Entonces creé lo siguiente 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

y lo agregué a mi ldap con el siguiente comando:

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

Ahora tenía que crear el nodo de organización con lo siguiente myorganization.ldif:

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

Y finalmente agréguelo con el siguiente comando (el primero no funcionó debido a Insufficient access (50)):

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

Ahora podría agregar las unidades organizativas:

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.
fuente
Esto dn: olcDatabase={1}hdb,cn=configfue clave para mí, gracias
miguelfg