Configuración de OpenLDAP II.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *