En la entrega anterior vimos cómo configurar un OpenLDAP. En esta entrega, veremos cómo cargar datos y jugar con overlays, comenzando por la de pertenencia a grupos.
Serie completa:
http://www.elalfon.com/2015/03/21/configuracion-de-openldap-i/
http://www.elalfon.com/2015/03/30/configuracion-de-openldap-ii/
http://www.elalfon.com/2015/03/31/configuracion-de-openldap-iii/
De nuevo debo recordar que la fuente de errores más común el es copiar y pegar. Ojo con las comillas, los puntos y caracteres extraños.
Overlay MemberOf
Lo primero, recordar lo que ya tenemos. Un OpenLDAP con una entrada básica, dc=example,dc=com, con un superusuario cn=Manager,dc=example,dc=com. También tenemos acceso a la configuración del OpenLDAP en el árbol cn=config con un usuario cn=config (se llama igual quela rama), y la monitorización del servidor en cn=Monitor.
Empezaremos por la overlay más simple, memberOf. En un OpenLDAP con una instalación basica como la que tenemos, podemos crear grupos, y asignar usuarios (en realidad cualquier elemento del directorio) a esos grupos, pero no podemos saber directamente si un elemento cualquiera es miembro de algún grupo. Habría que buscar el DN del elemento recuperado en la lista de miembros de cada grupo.
Para solucionar este problema, tenemos la overlay memberOf, que va a crear enlaces entre un elemento y los grupos a los que pertenece, mapeándolos como atributos operacionales. De esta forma, si un elemento pertenece a un grupo aparecerá un atributo memberOf (el nombre del atributo lo podemos configurar) indicando su pertenencia a ese grupo.
Carga de módulo en OpenLDAP y la overlay en la base de datos.
Las overlays se cargan en dos fases, primero cargamos el módulo en la configuración del directorio, y luego diremos qué bases de datos la usan, aunque en nuestro caso sólo hay una base de datos. En el segundo paso, configuramos la overlay para que cree el atributo operacional «memberOf» para todos los miembros (identificados por el atributo «member») de un grupo «groupOfNames». También le diremos que mantenga integridad referencial, de forma que si borramos un grupo, desaparezca el atributo memberOf de todos los usuarios, y si borramos un usuario, desaparecerá del grupo del que era miembro. También tendrá en cuenta si renombramos un usuario o un grupo, actualizando los valores correspondientes para member y memberOf.
Veamos el ldif para la carga del módulo moduloMemberOf.ldif:
version: 1
dn: cn=memberOf,cn=config
objectClass: top
objectClass: olcConfig
objectClass: olcModuleList
cn: memberOf
olcModuleLoad: memberof.la
olcModulePath: /usr/lib64/openldap
Ahora, el ldif para la carga del módulo en la base de datos overlayMemberOf.ldif (Centros 7: cambiar olcDatabase={2}bdb por olcDatabase={2}hdb):
version: 1
dn: olcOverlay=memberof,olcDatabase={2}bdb,cn=config
objectClass: top
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcMemberOf
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
olcMemberOfRefInt: TRUE
Los cargaremos con los comandos:
ldapadd -x -D «cn=config» -W <moduloMemberOf.ldif
ldapadd -x -D «cn=config» -W < overlayMemberOf.ldif
Prueba de la Overlay
Para probar esta everlay, crearemos primero contenedores para usuarios y grupos. También crearemos una entrada elementos, para ver que no sólo podemos relacionar usuarios y grupos, sino cualquier tipo de entrada con grupos.
El ldif para cargar los contenedores es el siguiente, lo llamaremos contenedores.ldif:
version: 1
dn: ou=usuarios,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: usuarios
dn: ou=elementos,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: elementos
dn: ou=grupos,dc=example,dc=com
objectClass: organizationalUnit
objectClass: top
ou: grupos
Lo cargamos con el comando:
ldapadd -x -D «cn=Manager,dc=example,dc=com» -W < contenedores.ldif
Crearemos ahora los grupos con la clase de OpenLDAP GroupOfNames. Como es requisito para crear el grupo el que tenga al menos un miembro, se suele poner como primera entrada el propio nombre del grupo. Con esto nos aseguramos de que la primera entrada que contiene es válida.
dn: cn=grupo2,ou=grupos,dc=example,dc=com
objectClass: groupOfNames
objectClass: top
cn: grupo2
member: cn=grupo2,ou=grupos,dc=example,dc=com
dn: cn=grupo1,ou=grupos,dc=example,dc=com
objectClass: groupOfNames
objectClass: top
cn: grupo1
member: cn=grupo1,ou=grupos,dc=example,dc=com
Los cargamos con el comando:
ldapadd -x -D «cn=Manager,dc=example,dc=com» -W < grupos.ldif
Una vez creados estos dos grupos, pasamos a crear unos usuarios de ejemplo también:
version: 1
dn: cn=user1,ou=usuarios,dc=example,dc=com
objectClass: top
objectClass: person
cn: user1
sn: Usuario de ejemplo1
dn: cn=user2,ou=usuarios,dc=example,dc=com
objectClass: top
objectClass: person
cn: user2
sn: Usuario de ejemplo2
dn: cn=user3,ou=usuarios,dc=example,dc=com
objectClass: top
objectClass: person
cn: user3
sn: Usuario de ejemplo3
dn: cn=user4,ou=usuarios,dc=example,dc=com
objectClass: top
objectClass: person
cn: user4
sn: Usuario de ejemplo4
dn: cn=user5,ou=usuarios,dc=example,dc=com
objectClass: top
objectClass: person
cn: user5
sn: Usuario de ejemplo5
De nuevo, lo cargamos con
ldapadd -x -D «cn=Manager,dc=example,dc=com» -W < usuarios.ldif
Vamos a probar que la inclusión de un usuario en un grupo crea el atributo operacional memberOf de ese usuario. Para ello, creamos un nuevo ldif con este contenido:
dn: cn=grupo1,ou=grupos,dc=example,dc=com
changetype: modify
add: member
member: cn=user1,ou=usuarios,dc=example,dc=com
Cargamos esta entrada con ldapmodify:
ldapmodify -x -D «cn=Manager,dc=example,dc=com» -W <UsuarioEnGrupo.ldif
Ahora podemos buscar al usuario solicitando todos los atributos del usuario, tanto normales como operacionales:
ldapsearch -x -D «cn=Manager,dc=example,dc=com» -W -b «dc=example,dc=com» «(cn=user1)» «*» +
Para recuperar todos los atributos, hay que escapar el caracter *. Si no, intentará encontrar los atributos con el mismo nombre que los ficheros que tengamos en el directorio donde ejecutemos el comando.
El resultado será parecido a este:
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: (cn=user1)
# requesting: * +
#
# user1, usuarios, example.com
dn: cn=user1,ou=usuarios,dc=example,dc=com
objectClass: top
objectClass: person
cn: user1
sn: Usuario de ejemplo1
structuralObjectClass: person
entryUUID: 74ea0ba6-6bcc-1034-9607-d9d33be134eb
creatorsName: cn=manager,dc=example,dc=com
createTimestamp: 20150331083414Z
entryCSN: 20150331083414.294993Z#000000#000#000000
modifyTimestamp: 20150331083414Z
memberOf: cn=grupo1,ou=grupos,dc=example,dc=com
modifiersName: cn=manager,dc=example,dc=com
entryDN: cn=user1,ou=usuarios,dc=example,dc=com
subschemaSubentry: cn=Subschema
hasSubordinates: FALSE
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
Cambiarán los atributos operacionales entryUUID y todos los relacionados con fechas. En nuestro caso nos interesa el atributo:
memberOf: cn=grupo1,ou=grupos,dc=example,dc=com
Con esto vemos que la overlay está funcionando.
Por último crearemos un objeto como dispositivo, y lo añadiremos al grupo. Veremos que también aparecerá el atributo operacional memberOf.
Crearemos un objeto con este ldif, que llamaremos dispositivo.ldif:
version: 1
dn: cn=chisme1,ou=elementos,dc=example,dc=com
objectClass: top
objectClass: device
cn: chisme1
y lo cargamos con
ldapadd -x -D «cn=Manager,dc=example,dc=com» -W <dispositivo.ldif
Por último asociamos el dispositivo al grupo2 con el ldif:
dn: cn=grupo2,ou=grupos,dc=example,dc=com
changetype: modify
add: member
member: cn=chisme11,ou=elementos,dc=example,dc=com
y lo cargamos con ldapmodify
ldapmodify -x -D «cn=Manager,dc=example,dc=com -W <ChismeEnGrupo.ldif
Ahora podemos buscar el atributo operacional memberOf en el dispositivo con ldapsearch:
ldapsearch -x -D «cn=Manager,dc=example,dc=com» -b «dc=example,dc=com» -W «(cn=chisme1)» memberOf
El resultado será el siguiente:
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: (cn=chisme1)
# requesting: memberOf
#
# chisme1, elementos, example.com
dn: cn=chisme1,ou=elementos,dc=example,dc=com
memberOf: cn=grupo2,ou=grupos,dc=example,dc=com
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1