Skip to main content

OpenLDAP – cómo establecer la clave de root del esquema

Si necesitamos establecer la clave del usuario admin bajo la rama config (cn=admin,cn=config) podemos seguir los siguientes pasos:

Crear un fichero ldif llamado rootpw_cnconfig.ldif con el siguiente contenido:

dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: NUEVACLAVE

Y ejecutar el siguiente comando:

ldapmodify -Y EXTERNAL -H ldapi:/// -f rootpw_cnconfig.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

A partir de ahora ya podríamos usar la clave en los comandos de ldap de la siguiente forma si necesitamos realizar cambios en el esquema:

ldapmodify -d "cn=admin,cn=config" -W -f fichero.ldif

Cómo añadir índices en OpenLDAP

Si encuentras en el log de OpenLDAP entradas de este tipo cuando se realizan búsquedas de los objetos significa que las búsquedas se realizan sobre un atributo que no tiene índice en LDAP:

slapd[14318]: <= mdb_equality_candidates: (associatedDomain) not indexed

Estas búsquedas podrían ser bastante costosas si tenemos un LDAP con muchos datos por lo que si este tipo de búsquedas son muy frecuentes conviene añadir un índice al atributo. Para ello crearemos un fichero add-index.ldif con el siguiente contenido:

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcDbIndex
olcDbIndex: associatedDomain eq

En este caso creamos un índice de tipo de eq como se puede observar en la última línea ya que las búsquedas son del tipo ‘associatedDomain=dominio’, pero existen otro tipo de índices dependiendo del tipo de búsqueda a realizar sobre el atributo:

pres should be used if use searches of the form ‘objectclass=person’ or ‘attribute=mail’ will be used.
approx MUST be used if use searches of the form ‘sn~=person’ (a ‘sounds-like’ search) will be used.
eq should be used if searches of the form ‘sn=smith’ will be used i.e no wildcards are included (uses the EQUALITY rule only).
sub should be used if use searches of the form ‘sn=sm*’ i.e wildcards are included (uses the SUBSTR rule). This rule may be enhanced by a using subinitial (optimised for ‘sn=*s’), subany (optimised for ‘sn=*n*’) or subfinal (optimised for ‘sn=th*’). One or more sub parameters may be included.

También podríamos combinar varios tipos de índices de esta forma:

olcDbIndex: associatedDomain eq,sub

Una vez generado el fichero solo tenemos que ejecutar el siguiente comando e introducir la clave del usuario admin del esquema:

$ ldapadd -h localhost -D "cn=admin,cn=config" -f add-index.ldif -W
Enter LDAP Password: 
modifying entry "olcDatabase={1}mdb,cn=config"

Si no sabemos la clave del usuario cn=admin,cn=config podemos cambiar la contraseña tal como se explica en este post Cambiar la clave de cn=admin,cn=config o utilizar el siguiente comando que no requiere una autenticación explícita ya que se basa en la autenticación del propio usuario:

ldapmodify -Y EXTERNAL -H ldapi:/// -f add-index.ldif

Cómo añadir un esquema en OpenLDAP

En este caso vamos a añadir el esquema dnsdomain2 para servir las zonas DNS desde PowerDNS

Para ver los esquemas que tenemos actualmente ejecutamos el siguiente comando:

~# ls -1 /etc/ldap/slapd.d/cn\=config/cn\=schema
cn={0}core.ldif
cn={1}cosine.ldif
cn={2}nis.ldif
cn={3}inetorgperson.ldif
cn={4}postfix.ldif

Primero crear un fichero de conversión añadiendo una línea con el esquema que queremos añadir a los que tenemos actualmente (Revisa con el punto anterior que los esquemas que incluyes existen en tu instalación):

~# cat > ./schema_conv.conf << EOL
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/postfix.schema
include /etc/ldap/schema/dnsdomain2.schema
EOL

Convertimos el fichero de esquema a formato LDIF:

~# mkdir /tmp/ldif
~# slaptest -f ./schema_conv.conf -F /tmp/ldif/

Abrir el fichero /tmp/ldif/cn=config/cn=schema/cn={6}dnsdomain2.ldif y cambiar las siguientes líneas:

dn: cn={6}dnsdomain2
objectClass: olcSchemaConfig
cn: {6}dnsdomain2

A esto otro:

dn: cn=dnsdomain2,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: dnsdomain2

Además se deben borrar las siguientes líneas justo al final del fichero:

structuralObjectClass: olcSchemaConfig
entryUUID: ccd26c58-54b6-1036-8f0f-cd16c06c9857
creatorsName: cn=config
createTimestamp: 20161212130111Z
entryCSN: 20161212130111.420925Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20161212130111Z

Copiar el fichero al directorio de schemas:

~# cd /etc/ldap/schema
~# cp /tmp/ldif/cn\=config/cn\=schema/cn\=\{6\}dnsdomain2.ldif  ./dnsdomain2.ldif

Insertar el nuevo esquema en el árbol de LDAP

~# ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/dnsdomain2.ldif
adding new entry "cn=dnsdomain2,cn=schema,cn=config"

Y por último verificar que efectivamente está incluído:

~# ls -1 /etc/ldap/slapd.d/cn\=config/cn\=schema
cn={0}core.ldif
cn={1}cosine.ldif
cn={2}nis.ldif
cn={3}inetorgperson.ldif
cn={4}postfix.ldif
cn={5}dnsdomain2.ldif