Cómo realizar un formulario HTML con PHP que permita validación en un servidor LDAP (Active Directory de Microsoft Windows Server 2000, 2003, 2008, 2012, 2019). Utilizaremos el lenguaje PHP para validar un usuario contra un servidor LDAP. Este ejemplo servirá para dotar a nuestra aplicación web de inicio de sesión en el servidor LDAP.

LDAP (Lightweight Directory Access Protocol ó Protocolo Ligero de Acceso a Directorios)

LDAP (Lightweight Directory Access Protocol ó Protocolo Ligero de Acceso a Directorios) es un protocolo a nivel de aplicación que permite el acceso a un servicio de directorio ordenado y distribuido para buscar diversa información en un entorno de red.

Un directorio es un conjunto de objetos con atributos organizados en una manera lógica y jerárquica.

Un árbol de directorio LDAP a veces refleja varios límites políticos, geográficos u organizacionales, dependiendo del modelo elegido. Los despliegues actuales de LDAP tienden a usar nombres de Sistema de Nombres de Dominio (DNS) para estructurar los niveles más altos de la jerarquía. Conforme se desciende en el directorio pueden aparecer entradas que representan personas, unidades organizacionales, impresoras, documentos, grupos de personas o cualquier cosa que representa una entrada dada en el árbol (o múltiples entradas).

Habitualmente, almacena la información de autenticación (usuario y contraseña) y es utilizado para autenticarse, aunque es posible almacenar otra información (datos de contacto del usuario, ubicación de diversos recursos de la red, permisos, certificados, etc).

Un cliente inicia una sesión de LDAP conectándose a un servidor LDAP, por defecto en el puerto TCP 389. El cliente envía una petición de operación al servidor, y el servidor envía respuestas. Con algunas excepciones, el cliente no necesita esperar una respuesta antes de enviar la siguiente petición, y el servidor puede responder en cualquier orden.

El cliente puede requerir las siguientes operaciones:

  • Start TLS: usar la extensión Transport Layer Security (TLS) LDAPv3 para una conexión segura.
  • Bind: autenticarse y especificar una versión del protocolo LDAP.
  • Search: buscar y obtener entradas de directorio.
  • Compare: probar si una entrada nombrada contiene un valor de atributo dado.
  • Add: añadir una nueva entrada.
  • Delete: borrar una entrada.
  • Modify: modificar una entrada.
  • Modify Distinguished Name (DN): modificar o renombrar una entrada.
  • Abandon: abortar una petición previa.
  • Extended Operation: operación genérica usada para definir otras operaciones.
  • Unbind: cerrar la conexión (no es el inverso de Bind).

Además, el servidor puede enviar «notificaciones no solicitadas» que no son respuestas a ninguna petición, por ejemplo antes de que se termine el tiempo de conexión.

LDAP es definido en términos de ASN.1, y los protocolos del mensaje están codificados en el formato binario BER. Sin embargo, utiliza representaciones textuales para un número de campos y tipos ASN.1.

Estructura de directorio LDAP

El protocolo accede a directorios LDAP, que siguen la edición de 1993 del modelo X.500:

  • Un directorio es un árbol de entradas de directorio.
  • Una entrada consta de un conjunto de atributos.
  • Un atributo tiene un nombre (un tipo de atributo o descripción de atributo) y uno o más valores. Los atributos son definidos en un esquema (véase luego).
  • Cada entrada tiene un identificador único: su Nombre distinguido (Distinguished Name, DN). Éste consta de su Relative Distinguished Name (RDN) construido por algunos atributos en la entrada, seguidos del DN de la entrada del padre. Pensar en el nombre distinguido como un completo nombre de archivo y el nombre distinguido relativo como el nombre de archivo relativo en un folder.

Para hacer más confiables e identificar de manera no ambigua las entradas un UUID podría ser proporcionado en el conjunto de los atributos operacionales de la entrada.

Implementación Active Directory basada en LDAP

Active Directory es el nombre utilizado por Microsoft (desde Windows 2000) como almacén centralizado de información de uno de sus dominios de administración.

Un Servicio de Directorio es un depósito estructurado de la información de los diversos objetos que contiene el Active Directory, en este caso podrían ser impresoras, usuarios, equipos…

Bajo este nombre se encuentra realmente un esquema (definición de los campos que pueden ser consultados) LDAP versión 3, lo cual permite integrar otros sistemas que soporten el protocolo. En este LDAP se almacena información de usuarios, recursos de la red, políticas de seguridad, configuración, asignación de permisos, etc..

Requisitos para validación de nuestro sitio web con Apache y PHP en un servidor LDAP

A continuación exponemos los requisitos para que una aplicación desarrollada en PHP para un servidor web Apache pueda validar en un servidor LDAP (en nuestro caso con Windows Server 2003 y la implementación de LDAP de Microsoft Active Directory).

Servidor con protocolo LDAP (Windows Server 2003 y Active Directory)

En primer lugar necesitaremos disponer de un servidor con el protocolo LDAP, en nuestro caso usaremos el equipo controlador de dominio de nuestra red con el sistema operativo Microsoft Windows Server 2003 y los servicios de Active Directory activados. A continuación mostramos algunos manuales interesantes para estos menesteres:

Servidor web con Apache y PHP

Como segundo componente necesitaremos un servidor web con Apache (puede servir Internet Information Server con las extensiones para soporte con PHP) y PHP. A continuación mostramos algunos manuales interesantes para estos menesteres:

Configurar y activar acceso a LDAP en PHP

Al instalar Apache, el soporte para LDAP en PHP suele venir desactivado. Explicamos a continuación cómo activarlo en unos sencillos pasos.

En primer lugar, para activar el soporte de PHP para LDAP deberemos abrir el fichero php.ini de PHP, que en sistemas operativos Windows suele estar en la carpeta del sistema operativo, en:

C:/Windows

Lo editaremos pulsando sobre él y seleccionando «Editar» ó «Abrir»:

Configurar y activar acceso a LDAP en PHP

Buscaremos la línea

;extension=php_ldap.dll

que cambiaremos quitándole el punto y coma inicial «;», quedará:

extension=php_ldap.dll

Cerraremos el editor y guardaremos los cambios:

Configurar y activar acceso a LDAP en PHP

Deberemos verificar que existe la librería «php_ldap.dll», ha de estar en la carpeta «ext» de la instalación de Apache y PHP:

Configurar y activar acceso a LDAP en PHP

Para que los cambios se apliquen será conveniente reiniciar el servicio de Apache, pulsando la tecla de Windows + R, escribiendo «services.msc» y pulsando «Aceptar»:

Configurar y activar acceso a LDAP en PHP

Desde los servicios, seleccionaremos el servicio de Apache, en nuestro caso «Apache2.2», pulsaremos sobre él con el botón derecho y seleccionaremos «Reiniciar»:

Configurar y activar acceso a LDAP en PHP

Validar en un servidor LDAP con PHP

Tras configurar el servidor web para que soporte acceso a LDAP, abriremos cualquier editor de texto plano (como Notepad) y escribiremos el siguiente código PHP:

En el fichero anterior cambiaremos los datos de conexión con el servidor de LDAP Active Directory por los de nuestra organización. Guardaremos el documento con el nombre que queramos y la extensión .html, por ejemplo «inicio_sesion.html». Lo colocaremos en la carpeta de nuestro sitio web, en el servidor Apache + PHP y ya lo tendremos listo para ser usado.

Para realizar la validación hemos usado las siguientes funciones PHP:

  • ldap_connect: establece una conexión con el servidor LDAP especificado y en el puerto especificado. Esta función devolverá el identificador de conexión.
  • ldap_set_option: establece el valor de la opción especificada.
  • ldap_bind: realiza la validación con el usuario y la contraseña indicados.