# Protocolo ligero de acceso a directorios

El protocolo ligero de acceso a directorios (en inglés: Lightweight Directory Access Protocol, también conocido por sus siglas de LDAP) hace referencia a 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. El ejemplo más común es el directorio telefónico, que consiste en una serie de nombres (personas u organizaciones) que están ordenados alfabéticamente, con cada nombre teniendo una dirección y un número de teléfono adjuntos. Para entender mejor, es un libro o carpeta, en la cual se escriben nombres de personas, teléfonos y direcciones, y se ordena alfabéticamente.
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 por sus siglas en inglés) 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). A manera de síntesis, LDAP es un protocolo de acceso unificado a un conjunto de información sobre una red.
La versión actual es LDAPv3, y se encuentra definido en el RFC 4511(una hoja de ruta de las especificaciones técnicas está suministrada por la RFC 4510).

## Origen e influencias

La comprensión de los requerimientos de directorios por parte de las compañías de telecomunicaciones estaba bien desarrollada después de 70 años de producir y manejar directorios de teléfonos. Estas compañías introdujeron el concepto de servicios de directorio a tecnologías de información y redes informáticas, que culminó en la especificación X.500, un conjunto de protocolos producido por la Unión Internacional de Telecomunicaciones (ITU por sus siglas en inglés) en la década de 1980.
Los servicios de directorio X.500 se accedían tradicionalmente vía DAP (Directory Access Protocol), que requería la pila de protocolos OSI (Open Systems Interconnection). LDAP fue originalmente dirigido a ser un protocolo alternativo y ligero para acceder a servicios de directorio X.500 a través de la pila de protocolos más simple (y ahora más difundida) TCP/IP. Este modelo de acceso a directorio fue imitado de los protocolos DIXIE Directory Assistance Service.
Pronto se implementaron servidores de directorio LDAP independientes, así como los servidores de directorio que soportaban DAP y LDAP. El último se hizo popular en empresas debido a que eliminaba cualquier necesidad de desplegar una red OSI. Ahora, los protocolos de directorio X.500 incluyendo DAP pueden ser usados directamente sobre TCP/IP.
El protocolo fue creado originalmente por Tim Howes (Universidad de Míchigan), Steve Kille (Isode Limited), y Wengyik Yeong (Performance Systems International) hacia 1993. Un desarrollo más completo ha sido hecho por la Internet Engineering Task Force.
En las primeras etapas de ingeniería de LDAP, este era conocido como Lightweight Directory Browsing Protocol, o LDBP. Posteriormente fue renombrado dado que el ámbito del protocolo había sido expandido para incluir no sólo navegación en el directorio y funciones de búsqueda, sino también funciones de actualización de directorio.
LDAP ha influenciado protocolos posteriores de Internet, incluyendo versiones posteriores de X.500, XML Enabled Directory (XED), Directory Service Markup Language (DSML), Service Provisioning Markup Language (SPML), y Service Location Protocol (SLP).

## Visión general del protocolo

Un cliente inicia una sesión de LDAP conectándose a un servidor LDAP, preestablecido en el puerto TCP 389. El cliente luego 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.
Un método alternativo común para asegurar las comunicaciones LDAP es usar un túnel SSL. Esto es denotado en las URLs de LDAP usando el esquema de URLs "ldaps". El puerto por defecto para LDAP sobre SSL es 636. El uso de LDAP sobre SSL fue común en LDAP Version 2 (LDAPv2) pero nunca fue estandarizado en una especificación formal. Su uso es considerado obsoleto al igual que LDAPv2, que ha sido retirado oficialmente en 2003.
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

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). Este 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 el nombre completo de archivo y el nombre distinguido relativo como el nombre de archivo relativo en una carpeta.
Se debe tener cuidado con el hecho de que un nombre distinguido puede cambiar durante tiempo de vida de una entrada, por ejemplo, cuando se mueven las entradas en el árbol. Para hacer más confiables e identificar de manera no ambigua las entradas se podría proporcionar un UUID en el conjunto de los atributos operacionales de la entrada.
Cuando se representa una entrada en el formato LDAP Data Interchange Format (LDIF) (LDAP por sí mismo es un protocolo binario) puede tener el siguiente aspecto:
“dn” es el nombre de la entrada; no es un atributo ni tampoco parte de la entrada. “cn=John Doe” es el nombre distinguido relativo, y “dc=example,dc=com” es el nombre distinguido de la entrada del padre, donde dc indica domain component (componente de dominio). Las otras líneas presentan los atributos en la entrada. Los nombres de atributos son generalmente cadenas mnemotécnicas, como “cn” para common name (nombre común), “dc” para domain component (componente de dominio), “mail” para dirección de correo electrónico y “sn” para surname (apellido).
Un servidor aloja un subárbol comenzando por una entrada específica, por ejemplo “dc=example,dc=com” y sus hijos. Los servidores también pueden almacenar referencias a otros servidores, con los cual un intento de acceso a “ou=department,dc=example,dc=com” puede retornar una referencia o continuación de referencia a un servidor que aloja esa parte del árbol de directorio. El cliente luego puede contactar al otro servidor. Algunos servidores también soportan encadenamiento (chaining), que implica que el servidor contacta al otro servidor y devuelve el resultado al cliente.
LDAP raramente define un ordenamiento: el servidor puede devolver los valores de un atributo, los atributos en una entrada y las entradas encontradas por una operación de búsqueda en cualquier orden. Esto sigue la definición formal - una entrada es definida como un conjunto de atributos, y un atributo es un conjunto de valores, y los conjuntos no necesitan estar ordenados.

## URLs de LDAP

Un formato URL de LDAP existe para descubrir qué clientes soportan en variedad de grados, y qué servidores retornan como referentes y referencias de continuación (ver RFC 4516):
La mayoría de los componentes, que son descritos debajo, son opcionales.
* host es el FQDN o dirección IP del servidor LDAP donde se realiza la consulta.
* port es el puerto de red del servidor LDAP.
* DN es el nombre distinguido a usar como base de búsqueda.
* attributes es una lista separada con comas de atributos a devolver.
* scope especifica el ámbito de búsqueda y puede ser "base" (por defecto), "one" o "sub".
* filter es un filtro de búsqueda. Por ejemplo (objectClass=*) como es definido en RFC 4515.
* extensions son extensiones al formato URL de LDAP.
Por ejemplo, “ldap://ldap.example.com/cn=John%20Doe,dc=example,dc=com” refiere a todos los usuarios en la entrada de John Doe en ldap.example.com, mientras “ldap:///dc=example,dc=com??sub?(givenName=John)” busca por la entrada en el servidor por defecto (notar el triple barra inclinada, omitiendo el host, y la marca de doble pregunta, omitiendo los atributos). Así como en otros URL, los caracteres especiales deben ser codificados con signos de porcentaje.
Hay un esquema de URL similar y no estándar para LDAP sobre SSL, ldaps:. Esto no debe confundirse con LDAP sobre TLS, que se puede conseguir usando la operación STARTTLS usando el esquema normal. ldap:.

## Variantes

Varias de las operaciones de servidor se dejan al implementador o administrador para que decida cómo se llevarán a cabo. En consecuencia, los servidores pueden contar con soporte para una amplia variedad de escenarios.
Por ejemplo, el almacenamiento de datos en el servidor no es especificado -el servidor puede usar archivos de texto plano, bases de datos, o solo ser una puerta de enlace para otro servidor. El control de acceso no es estándar, aunque se han realizado trabajos en él y existen modelos comúnmente usados. Las claves de usuarios pueden ser almacenadas en sus entradas del directorio o en otro lugar. El servidor puede rechazar realizar operaciones que desee, e imponer varias limitaciones.
La mayoría de secciones de LDAP son extensibles. Por ejemplo: Uno puede definir nuevas operaciones. Los controles pueden modificar peticiones y respuestas, por ejemplo para solicitar resultados ordenados de búsqueda. Nuevos ámbitos de búsqueda y métodos de enlace pueden ser definidos. Los atributos pueden tener opciones que podrían modificar su semántica.

## Otros modelos de datos

Así como LDAP ha tenido su momento cumbre, los proveedores lo han proporcionado como un protocolo de acceso a otros servicios. La implementación luego da forma a los datos para imitar el modelo LDAP/X.500, pero la rigidez con la que es seguido este modelo varía entre implementaciones. Por ejemplo, existe software para acceder a bases de datos SQL a través de LDAP, a pesar de que LDAP no se presta para que esto ocurra. Los servidores X.500 pueden soportar también LDAP.
De forma similar, los datos que fueron previamente alojados en otros tipos de almacenamiento de datos son a veces movidos a directorios LDAP. Por ejemplo, los usuarios de Unix y la información de grupos puede almacenarse en LDAP y accedidos vía módulos de PAM y NSS. LDAP es utilizado en ocasiones por otros servicios para conseguir autenticación.

## Uso
### Estructura de nombres

Dado que un servidor LDAP puede devolver referencias a otros servidores para efectuar nuevas peticiones que el servidor mismo no puede devolver, una estructura de nombres para las entradas LDAP es requerida para que sea posible encontrar un servidor alojando un nombre distinguido dado. Dado que una estructura ya existe en el DNS, los nombres de alto nivel de los servidores a veces ofrecen nombres de DNS simulados, así como se hacía en X.500.
Si una organización tiene el nombre de dominio example.org, su entrada de más alto nivel en LDAP tendrá generalmente como nombre distinguido dc=example,dc=org (donde dc significa componente de dominio). Si el servidor LDAP es también denominado ldap.example.org, el nivel más alto de la organización de la URL del LDAP URL se convierte en ldap://ldap.example.org/dc=example,dc=org.
Bajo el alto nivel, los nombres de entradas generalmente reflejan la estructura organizacional interna o las necesidades, en lugar de nombres de DNS.

## Terminología

La terminología de LDAP que puede encontrarse es en ocasiones engorrosa. Esto en parte se debe a malentendidos, otros ejemplos son debido a orígenes históricos, otros surgen cuando se usó con servicios distintos de X.500 que usan terminología distinta. Por ejemplo, "LDAP" es a veces utilizado para referirse al protocolo, otras veces para el protocolo y los datos. Un "directorio LDAP" puede ser los datos o también el punto de acceso. Un "atributo" puede ser el tipo de atributo, o los contenidos de un atributo en un directorio o la descripción de un atributo (un tipo de atributo con opciones). Un enlace (bind) anónimo es un método distinto de un enlace no autenticado, aunque ambos producen estados de autenticación anónima, por lo cual ambos términos son usados para ambas variantes. El atributo "uid" debe almacenar nombres de usuarios en lugar de identificadores numéricos de usuarios.

## Implementaciones

Existen diversas implementaciones y aplicaciones reales del protocolo LDAP.

### Active Directory

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.

### Novell Directory Services

También conocido como eDirectory es la implementación de Novell utilizada para manejar el acceso a recursos en diferentes servidores y computadoras de una red. Básicamente está compuesto por una base de datos jerárquica y orientada a objetos, que representa cada servidor, computadora, impresora, servicio, personas, etc. entre los cuales se crean permisos para el control de acceso, por medio de herencia. La ventaja de esta implementación es que corre en diversas plataformas, por lo que puede adaptarse fácilmente a entornos que utilicen más de un sistema operativo.

### iPlanet - Sun ONE Directory Server

Basado en la antigua implementación de Netscape, iPlanet se desarrolló cuando AOL adquirió Netscape Communications Corporation y luego conjuntamente con Sun Microsystems comercializaron software para servidores, entre ellos el iPlanet Directory Server, su implementación de LDAP... Actualmente se denomina Sun ONE Directory Server.

### OpenLDAP

Se trata de una implementación libre del protocolo que soporta múltiples esquemas por lo que puede utilizarse para conectarse a cualquier otro LDAP.
Tiene su propia licencia, la OpenLDAP Public License. Al ser un protocolo independiente de la plataforma, varias distribuciones GNU/Linux y BSD lo incluyen, al igual que AIX, HP-UX, Mac OS X, Solaris, Windows (2000/XP) y z/OS.
OpenLDAP tiene cuatro componentes principales:
* slapd - demonio LDAP autónomo.
* slurpd - demonio de replicación de actualizaciones LDAP autónomo.
* Rutinas de biblioteca de soporte del protocolo LDAP.
* Utilidades, herramientas y clientes.

### Red Hat Directory Server

Directory Server es un servidor basado en LDAP que centraliza configuración de aplicaciones, perfiles de usuarios, información de grupos, políticas así como información de control de acceso dentro de un sistema operativo independiente de la plataforma.
Forma un repositorio central para la infraestructura de manejo de identidad, Red Hat Directory Server simplifica el manejo de usuarios, eliminando la redundancia de datos y automatizando su mantenimiento.

### Apache Directory Server

Apache Directory Server (ApacheDS), es un servidor de directorio escrito completamente en Java por Alex Karasulu y disponible bajo la licencia de Apache Software, es compatible con LDAPv3 certificado por el Open Group, soporta otros protocolos de red tal como Kerberos y NTP, además provee procedimientos almacenados, triggers y vistas; características que están presente en las base de datos relacionales pero que no estaban presentes en el mundo LDAP.

### Open DS

Basado en los estándares LDAPv3 y DSMLv2, OpenDS surgió como un proyecto interno de SUN, aunque posteriormente se puso a disposición de la comunidad. Está desarrollado en JAVA y precisa de un entorno de ejecución (Java Runtime Environment) para funcionar. Es multiplataforma.
La primera versión estable fue liberada en julio de 2008.