En proyectos para entidades de cierto volumen y complejidad de organización, es muy habitual que dispongan de un sistema de gestión de usuarios centralizado LDAP (Lightweight Directory Access Protocol) que se encarga de la gestión de todos los atributos referentes a los usuarios (identificación, información personal, correo, roles,...).

Estos sistemas LDAP ofrecen los servicios de autenticación y autorización a todos los elementos componentes de la Arquitectura de Sistemas de la entidad, y por tanto puede también hacerlo a nuestro desarrollo Drupal.

Esta solución ofrece ventajas claras para la entidad, entre otras destacar:

  • No tiene disgregados la información de sus usuarios en cada uno de sus sistemas, lo que le evita duplicidades y desnivelaciones de información, y otorga una total homogeneidad y validez a los datos de sus usuarios.
  • No tiene que implementar y mantener varios mecanismos de autenticación de usuarios en todos sus subsistemas.
  • Es un mecanismo estandarizado, lo que facilita la integración con casi cualquier tipo de subsistema que se disponga.

Ya que son todo ventajas, vamos a integrarnos! … pero claro, con lo fácil que te lo pone Drupal la gestión de usuarios y roles, de entrada esto del LDAP suena a complejo y que me va a suponer mucho trabajo adicional… ufff...

Por eso este insight tiene el objetivo principal de derrumbar este mito de complejidad, de forma que desgranemos las configuraciones más importantes para hacer uso del servicio LDAP en el desarrollo de un proyecto Drupal.

 

Selección de módulos

Como en todo proyecto de desarrollo Drupal, lo más importante es conocer todo lo que nos ofrece la plataforma y la comunidad, para nunca tener que reinventar la rueda, y optar por soluciones robustas y contrastadas.

De esta forma, y entre las varias opciones de módulos disponibles, vamos a optar por utilizar:

  • Lightweight Directory Access Protocol (LDAP) (enlace al módulo contribuido), que dispone de una versión estable en Drupal 7 y una beta bastante fiable para Drupal 8 y 9.
  • External Authentication (enlace al módulo contribuido), con versión estable para Drupal 8 y 9, que nos va a permitir establecer el mapeo de los roles de la organización con los de Drupal.

La instalación de los módulos, sencilla, como siempre, con composer…

composer require drupal/nombre_del_modulo

Una vez instalados y habilitados, vamos ya con la integración.

1
Tips para conectar fácilmente Drupal con un servicio LDAP.

Integración con el sistema LDAP.

Nuestra integración con el sistema LDAP, la vamos a descomponer en varias tareas, cada una de las cuales tiene dependencia con las anteriores, por lo cual no nos podemos saltar ninguna de ellas:

  • Binding con el servidor.
  • Datos para la Autenticación.
  • Modelo de Autenticación.
  • Relación entre usuarios Drupal y LDAP.
  • Prueba de Autenticación.

Binding con el servidor.

El primer paso es muy directo, establecer comunicación con el servidor de LDAP, lo cual es fundamental. Para ello vamos a configurar el binding en la sección de Administración > Configuración > Usuarios, donde Agregaremos un Servidor (botón “Add Server”).

Tenemos un primer bloque donde establecemos la información de conexión que nos debe facilitar el responsable del sistema por parte de la organización:

  • Nombre del servidor y su correspondiente del sistema, el que queramos ponerle.
  • Tipo de servidor LDAP: OpenLDAP, Active Directory (de Microsoft), Novel o Apple Open Directory.
  • Dominio o IP y el puerto (habitualmente el 389).
  • Y finalmente marcamos si va sobre TLS (conexión segura).
server

Una vez identificada la conexión con el Servidor LDAP, tenemos que definir la autorización para poder acceder al servicio, y eso lo establecemos en el bloque de Binding. 4 opciones de acceso, pero nos vamos a centrar en la más habitual, que es tener un usuario/pass para enlazar. En esta opción lo que tememos es que informar del usuario en su formato completo DN (Distinguished Name) y su password.

En este punto ligero apunte sobre nomenclatura propia de LDAP, y es definir el DN como la unión entre el CN (CommonName, habitualmente sólo el nombre asignado a un usuario o grupo) junto a la cadena que define una base jerárquica de la organización donde se ubican los usuarios (p.e. “ou=department,dc=example,dc=com”). Este es un simple apunte básico para no perdernos en este proceso, pero siempre es interesante ampliar los conocimientos sobre la estructuración y sintaxis LDAP en alguno de los muchos artículos publicados.

Binding config

En la segunda opción se utilizan las propias credenciales del usuario con el que queremos logar para hacer el binding, y las dos últimas son formas anónimas.

Autenticación con el Servidor.

Una vez que ya tenemos “conectado” nuestro servicio de LDAP, vamos a realizar la configuración necesaria para realizar la autenticación de los usuarios.

User binding config

Analicemos las opciones más importantes para la autenticación.

En primer lugar la composición base que vamos a plantear para complementar el CN del usuario y formar su DN completo. En este campo pudiéramos disponer varias bases, pero hay que tener en cuenta que tener muchas bases incrementa notablemente el número de consultas a realizar cuando indiquemos el usuario a logar. Además en el caso de tener más de una, considerar poner la primera la que sea más habitual, de manera que matchee primero, y no tengan que ir a probar con las siguientes bases.

A continuación indicamos los atributos utilizados para la autenticación (AuthName y AccountName), que normalmente es el CN (Common Name) o el sAMAccountName para sistemas Active Directory.

Otro atributo interesante para un sistema Drupal, es que le indiquemos el campo de donde vamos a obtener el mail, para que forme parte del perfil Drupal que crearemos, ya que es un campo obligatorio para crear este perfil de usuario..

Existen más campos en este bloque de configuración de usuarios, que nos dan opciones más avanzadas, pero con estos ya tenemos suficiente para realizar el proceso de autenticación estándar.

Modelo de autenticación.

Una vez configurado el Server, vamos a la pestaña de Autenticación (admin/config/people/ldap/authentication), donde vamos a poder configurar el modo en que queremos que se haga la autenticación.

Se nos ofrecen 2 posibilidades principales:

  • Modo Mixto, donde primero se intenta logar contra el usuario Drupal, y si esta falla lo intenta contra el LDAP. Este modo es muy interesante si vamos a tener usuarios tanto de la propia plataforma de Drupal (no presentes en LDAP), como usuarios procedentes del LDAP.

    Incluso como veremos ante el primer login exitoso, podemos crear el usuario Drupal, de manera que en este modo mixto el sistema intentará primero realizar la autenticación contra el sistema Drupal, lo que nos evitará tener que hacer una posterior conexión contra LDAP en caso de exito en la primera autenticación en Drupal.

  • Solo contra LDAP, salvo el usuario 1 Administrador.

Logon config

Seleccionamos la conexión anteriormente creada, para aplicar este modo de autenticación, y a continuación se nos ofrecen una serie de opciones más avanzadas, pero ninguna totalmente imprescindibles:

  • Textos de ayuda para el formulario de login.
  • Listas blancas y negras para permitir o denegar el acceso en base a determinadas paríiculas ubicadas en el DN, y solo en el DN.
  • Check para denegar el acceso a aquellos usuarios que no tengan Autorización por Roles/Grupos. Esto es muy interesante para habilitar el acceso a los usuarios solo en base a su pertenencia a determinados Grupos. En un próximo insight hablaremos de el proceso de Autorización, y como se pone en juego este check para limitar el acceso.
  • Otros aspectos menos relevantes sobre la visibilidad del email y la pass en el formulario de Login.

Relación entre usuarios Drupal y LDAP.

Y como último aspecto relevante a configurar, es el referente a la creación y nivelación de información del usuario, una vez que se realiza una Autentificación exitosa.

Para ello nos vamos a la pestaña de User Mappings para definir la siguiente configuración necesaria para un correcto funcionamiento de la autenticación contra LDAP:

  • ¿Qué hacer si tras el login exitoso, vemos que ya se disponía de este usuario previamente creado en la plataforma Drupal? En este caso tenemos varias opciones, desde asociar las 2 cuentas (lo mas habitual), no hacer nada (reject conflicting accounts) o bien crearlas duplicadas (allow conflicting accounts).

Manual account
  • Provisionamiento de Usuarios en la plataforma Drupal, o bien decidir si creamos o no usuarios Drupal tras la autenticación.

    Basic provisioning

    Seleccionamos el Server previamente definido, para a continuación indicar mediante sendos checks, si queremos que el usuario se cree y nivele única y exclusivamente en cada momento de autenticación, o bien también en cualquier momento de creación o actualización de su información en el LDAP.

    El setteo de estas características depende mucho de la frecuencia de cambios en la información del usuario en el LDAP y de la necesidad de tenerla en Real Time en nuestra plataforma Drupal. Al menos, el primer check deberíamos tenerlo, y para garantizar siempre la consistencia de los datos, también es recomendable el segundo.

    A continuación, indicamos si queremos que se haga la asociación de cuentas previamente existentes en la plataforma Drupal (recomendado), y si aplicamos la política de settings de creación de usuarios de Drupal también a los usuarios LDAP (recomendado no permitirlo, y que no se mezclen ambas políticas).

    Más allá se disponen de otros mecanismos avanzados para la sincronización periódica de usuarios basados en queries, cuentas huérfanas y completitud de atributos de otros atributos de perfil de usuario, que pueden ser objeto de un posterior insight, pero que para este alcance nos vale con tomar los valores por defecto.

Finalmente, la sincronización en el sentido contrario (Drupal -> LDAP), también es posible y se puede configurar de forma muy similar a como hemos configurado el sentido LDAP -> Drupal, habilitando el radio de nuestro servidor en LDAP Servers to Provision LDAP Entities on.

Basic provisioning

Y sin más, en este punto, ya podríamos tener nuestra autenticación básica contra un sistema de LDAP!!! Al fin, no fue tan complicado... ahora toca probar que todo es correcto.

Prueba de Autenticación.

En este punto, vamos a abrir una nueva ventana de navegador, en incógnito para que no tome la sesión de administración que ya tenemos abierta, y comprobemos que realiza:

  • Autenticación del usuario contra el sistema LDAP.
  • Creación de un usuario Drupal con la información básica que hasta este momento obtenemos del LDAP: nombre de usuario y email.

Simplemente vamos a la ruta de https://nombre-del-site.com/user/pass, e introducimos el nombre de usuario y pass correcto que se almacena en el LDAP. En caso de que este sea erroneo, nos devuelve el pertinente error, pero en caso de que sea correcto nos va a llevar a la habitual pantalla de perfil de usuario… conseguido.

Y desde la sesión abierta en administración, podemos comprobar como se ha generado un nuevo usuario en el desarrollo Drupal, con la info de nombre y email introducido.

Conclusiones

Con esto, hemos comprobado que hemos realizado el ciclo completo de autenticación y creación de usuarios LDAP en nuestro desarrollo Drupal! En el siguiente insight, entraremos en cómo obtener los grupos de los que son miembros los usuarios LDAP, y los mapeamos con los roles y permisos de la plataforma Drupal.