Instalar y configurar el directorio OpenLDAP
Existe una interesante variedad de directorios LDAP disponibles en GNU/Linux, siendo algunos de los más importantes OpenLDAP, 389 Directory Server, OpenDS y Apache Directory. Si bien todos presentan características similares, elegí utilizar OpenLDAP por ser el más antiguo, existe mucha información al respecto, es muy flexible, y está disponible en los repositorios de las distribuciones más importantes.
A continuación describiré cómo instalar y configurar OpenLDAP. Si bien mi trabajo fue realizado en debian, no debería variar demasiado en otras distribuciones.


Instalación

En debian y derivados, instalar OpenLDAP es tan simple como ejecutar:
# apt-get install slapd ldap-utils
donde slapd es el demonio que provee la funcionalidad ldap, y ldap-utils contiene un set de herramientas para administrar y testear el server.

Durante el proceso de instalación, el configurador del paquete (debconf) requerirá los siguientes datos básicos:
  • Nombre DNS de nuestro dominio (ej: demasiadovivo.org).
  • Nombre de la organización a utilizar en el DN base. En general utilizarán el mismo que el nombre DNS (ej: demasiadovivo.org).
  • Contraseña del administrador.
  • Base de datos de fondo para almacenar los datos LDAP. Si bien openLDAP acepta distintas bases de datos, es recomendable utilizar la de Berkeley (BDB) que no es una BD relacional, sino una que permite almacenar varios items por cada clave y logra mejor performance en casos de muchas lecturas y pocas escrituras. Todo esto encaja perfecto con LDAP, porque son justamente estos los atributos de un directorio.
  • Remover la base de datos cuando el paquete slapd se purgue? es buena idea setear que no, así no borramos accidentalmente la base de datos LDAP.
  • Permitir el protocolo LDAPv2? esto dependerá de los clientes que estemos utilizando. Dado que LDAPv3 ya esta muy maduro e implementado en la mayoría de los sistemas, lo mejor es decir no a esta pregunta.
En debian 6 (squeeze) el archivo de configuración del demonio OpenLDAP se encuentra en /usr/share/slapd/slapd.conf. En otras distribuciones puede encontrarse en /etc/ldap/slapd.conf, /etc/openldap/slapd.conf o /usr/local/etc/openldap/slapd.conf. En dicho archivo podrán ver que se importan archivos que contienen los esquemas básicos, así como configuración de permisos para escribir y leer registros, tipo de base de datos, ubicación de la base de datos (/var/lib/ldap en debian), el nivel de logging, y varias cosas más.

Una vez instalado el paquete, podemos probar si el servidor se instaló y configuró correctamente, utilizando ldapsearch. ldapsearch es una herramienta que nos servirá mucho para testear la configuración del servidor y, como su nombre lo indica, sirve para hacer búsquedas dentro de directorio.
Para realizar la prueba, pediremos todos los objetos que se encuentren en el servidor:
ldapsearch -b dc=demasiadovivo,dc=org -H ldap://localhost -x
donde:
  -b indica el DN base done iniciar la búsqueda
  -H es para ingresar la URI del server
  -x indica que utilice autenticación simple
Como no utilizamos ningún fitro y no indicamos qué atributos traer, ldapsearch traerá todo.


ldap.conf

Para evitar tener que ingresar los datos referentes al DN base y la URI o dirección de servidor en cada conexión con el servidor ldap, podemos almacenar esta información en el archivo /etc/ldap.conf
ldap.conf se utiliza para configuraciones default concernientes a los clientes ldap. Los dos valores más utilizados son URI y BASE, que sirven justamente para lo explicado en el párrafo anterior. Un ejemplo de este archivo es el siguiente:
URI    ldap://demasiadovivo.org ldaps://demasiadovivo.org
BASE    dc=demasiadovivo,dc=org
Con esto nos evitamos, por ejemplo, los parámetros -b y -H en ldapsearch =)


Agregar, modificar, y eliminar entradas del directorio

Los datos LDAP son intercambiados utilizando un formato de texto plano denominado LDIF (LDAP Data Interchange Format). Utilizando archivos LDIF podemos agregar, modificar, elminar y renombrar entradas del directorio.
Cada entrada (registro) continee un conjunto de atributos y están separadas por líneas en blanco. Ya vimos ejemplos de este formato cuando utilizamos ldapsearch para testear el servicio.
Para editar la información del directorio, simplemente creamos un archivo ldif y utilizamos la herramienta ldapadd o ldapmodify. Para eliminar entradas, se utiliza ldapdelete.

En secciones anteriores vimos que la estructura del árbol del directorio se puede armar en base a unidades organizativas (organizational units - OU), algo muy común en sistemas de usuarios centralizado (Active Directory, y GNU/Linux con NSS-LDAP y PAM). Las OU básicas de un sistema de usuarios centralizado son People y Group. Podemos crear estas OUs utilizando un archivo ou.ldif que contenga:
dn: ou=People,dc=demasiadovivo,dc=org
ou: People
objectClass: organizationalUnit

dn: ou=Group,dc=demasiadovivo,dc=org
ou: Group
objectClass: organizationalUnit
y luego ejecutando ldapadd de la siguiente forma:
$ ldapadd -c -x -D cn=admin,dc=dvpem,dc=org -W -f ou.ldif
donde:
-c indica que continúe procesando si encuentra errores
-x indica que utilice autenticación simple
-D setea el DN con el cual realizar el bind (usuario de autenticación)
-W pide el password
-f permite importar los datos del archivo
Como se observa, con -x -D cn=admin,dc=dvpem,dc=org -W realizamos la autenticación con el usuario admin, dado que con acceso anónimo no es posible modificar registros de la base de datos. Más adelante veremos cómo autenticar utilizando SASL en lugar de autenticación simple.

Podemos ver el resultado ejecutando la siguiente búsqueda:
$ ldapsearch -x ou=People
$ ldapsearch -x ou=Group

Modificar la configuración

La configuración del servicio LDAP se almacena en el archivo slapd.conf, pero si se desea hacer cambios en en la misma, una vez que se actualiza dicho archivo, es necesario reiniciar el demonio slapd, algo que es muy contraproducente en un sistema que está en producción atendiendo cientos o miles de consultas. Por suerte, desde la versión 2.3 de OpenLDAP, es posible editar la configuración online. A partir de dicha versión, la configuración se almacena una base de datos separada, con un esquema y DIT predefinidos (cuyo base DN es cn=config), y la cual se encuentra en el directorio slapd.d (en debian /etc/ldap/slapd.d/). Esta base de datos posee administración en tiempo de ejecución a través de operaciones LDAP con datos en formato LDIF y se puede acceder y editar a través del conjunto de herramientas slapacl, slapadd, slapauth, slapcat, slapdn y slaptest.
Para ver las entradas de configuración, se puede utilizar slapcat de la misma manera que se utiliza ldapsearch. Por ejemplo, para ver la configuración de la base de datos, se debe ejecutar:
# slapcat -b cn=config -a olcDatabase=*
donde -b indica el sufijo o DN base, y -a permite utilizar filtros.

De esta forma tenemos que la configuración del directorio se realiza a través de atributos en entradas del directorio, y la mayoría de estos comienzan con el prefijo "olc" (OpenLDAP configuration). Además, algunas de las entradas tienen nombres con números entre llaves ({}). Esto se debe a que ni las entradas, ni los atributos de un directorio tienen un orden específico, pero el orden es necesario para la configuración, porque existen dependencias. Los números en los nombres aseguran que la configuración se ejecute en el orden correspondiente, asegurando la consistencia. En general estos números se generan automáticamente a medida que se crean las entradas.


Control de acceso

En la configuración default de un OpenLDAP recién instalado existen dos permisos para acceder al directorio:
  • utilizando el usuario admin que tiene control total. Este usuario está declarado en el DN base con cn=admin (por ej: cn=admin,dc=demasiadovivo,dc=org). La contraseña de este usuario se setea durante la instalación del directorio.
  • acceso de lectura de cualquier entrada de forma anónima, es decir, sin ningún tipo de autenticación.
Este todo o nada no suele alcanzar para ninguna organización, por lo tanto es necesario conocer cómo se administran los permisos.
El acceso a las entradas del directorio se configura a través del atributo olcAccess, cuyo formato es:
olcAccess: <directiva acceso="" de="">
olcAccess: <directiva acceso="" de="">
<access directive=""> ::= to <what>
    [by <who> <access> <control>]+
<what> ::= * |
    [dn[.<basic-style>]=<regex> | dn.<scope-style>=<dn>]
    [filter=<ldapfilter>] [attrs=<attrlist>]
<basic-style> ::= regex | exact
<scope-style> ::= base | one | subtree | children
<attrlist> ::= <attr> [val[.<basic-style>]=<regex>] | <attr> , <attrlist>
<attr> ::= <attrname> | entry | children
<who> ::= * | [anonymous | users | self
    | dn[.<basic-style>]=<regex> | dn.<scope-style>=<dn>]
    [dnattr=<attrname>]
    [group[/<objectclass>[/<attrname>][.<basic-style>]]=<regex>]
    [peername[.<basic-style>]=<regex>]
    [sockname[.<basic-style>]=<regex>]
    [domain[.<basic-style>]=<regex>]
    [sockurl[.<basic-style>]=<regex>]
    [set=<setspec>]
    [aci=<attrname>]
<access> ::= [self]{<level>|<priv>}
<level> ::= none | auth | compare | search | read | write
<priv> ::= {=|+|-}{w|r|s|c|x|0}+
<control> ::= [stop | continue | break]
donde la parte <what> selecciona las entradas y/o atributos a los cuales se aplica el acceso, <who> especifica que entidades tienen acceso, y <access> especifica el tipo de acceso otorgado. Se soportan múltiples tripletas <who> <access> <control>, permitiendo otorgar distinto tipo de acceso a distintas entidades.
Para observar los accesos default de todas las bases de datos, basta con ejecutar:
# slapcat -b cn=config -a olcAccess=*
Por ejemplo, ejecutando slapcat con el siguiente filtro es posible observar los accesos default a la base de datos principal:
# slapcat -b cn=config -a olcDatabase={1}hdb
  ...
  olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=demasiadovivo,dc=org" write by * none
  olcAccess: {1}to dn.base="" by * read
  olcAccess: {2}to * by self write by dn="cn=admin,dc=demasiadovivo,dc=org" write by * read
  ...
Con esta información se ve que los atributos userPassword (el password del usuario) y shadowLastChange (última fecha de modificación del password) tienen:
  • acceso de escritura para el propio usuario (self) y para el administrador (dn="cn=admin,dc=demasiadovivo,dc=org")
  • tiene acceso de lectura de forma anonima en caso de que se este realizando una autenticación (anonymous auth)
  • ningún acceso para el resto de los usuarios (* none).
Un punto a tener en cuenta es que en debian squeeze (al menos en mi caso) sólo el usuario root tiene permiso para modificar la configuración, utilizando el modo de autenticación externa de LDAP. Es decir, LDAP valida el usuario del sistema operativo.
El problema es que este modo de autenticación NO viene habilitado por defecto y requiere activación de TLS/SSL en el servidor LDAP. Esta tarea no resultó tan trivial como pensaba y no pude habilitarlo.
Para poder acceder a la configuración, existe un mecanismo alternativo. En la base de datos config, existe el usuario admin, pero por default no tiene password asignado. Para habilitar el uso de este usuario con autenticación simple, primero hay que crear la contraseña con slappasswd:
# slappasswd -h {SSHA}
y luego editar el archivo /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif para agregar la siguiente línea debajo del nombre de usuario:
olcRootDN: cn=admin,cn=config   //esta línea ya existe en el archivo
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Finalmente, reiniciar el servicio:
# /etc/init.d/slapd restart
y testear que funciona:
$ ldapsearch -x -D cn=admin,cn=config -W -b cn=config
Cómo armar los permisos y otorgarlos está excelentemente explicado en la sección 5.3. Access Control del manual de OpenLDAP, por lo tanto no tiene sentido que lo repita aquí.


Clientes gráficos

Si bien podemos administrar todo el directorio a través de archivos LDIF, esto puede resultar engorroso y contraproducente en el día a día. Por suerte existen herramientas gráficas que nos ayudan a administrar el directorio de manera más simple.
Algunas de estas herramientas son:

Referencias

- OpenLDAP provider on Debian squeeze
- OpenLDAP installation on Debian
- OpenLDAP - 2. A Quick-Start Guide
- Debian 5.0 y OpenLDAP con TLS
- OpenLDAP - 5. Configuring slapd
- LDAP Administration Guide
- Zarafa LDAP cn config How To
- HowTo:LDAP Debian 6 (squeeze)

2 comentarios:

Anónimo dijo...

disculpa pero el link del cliente gráfico LDAPBrower no funciona

d3m4s1@d0v1v0 dijo...

Tenes razón! gracias por avisar!
Se ve que no existe más la entrada, porque el link estaba bien. Googlie un rato y no pude encontrar otra página oficial, sólo links a la que yo había puesto.
Por lo visto ya no tiene un desarrollo activo, así que lo saqué de la lista.
Saludos!

Publicar un comentario en la entrada