Este artículo documenta la instalación de un servidor LDAP en GNU/Linux, the right way: compilando OpenLDAP desde los fuentes con LMDB como backend.

Anteriormente expliqué cómo instalar y configurar OpenLDAP con PostgreSQL como backend. Aunque luego de un período de pruebas decidí descartar a Postgres y utilizar el backend recomendado y por defecto: LMDB.

El problema al utilizar Postgres como backend, es que uno debe implementar manualmente (utilizando sentencias SQL) todas las funcionalidades necesarias para dar soporte a los diferentes schemas de LDAP (metadatos para traducir consultas LDAP en consultas SQL), tal como lo explica la guía de administración de LDAP. Es posible ver un ejemplo de programación de un backend SQL en el siguiente enlace: OpenLDAP-POSTGRESQL HOWTO - A live example.

Mi intención fue utilizar Postgres en un principio debido a la conocida inestabilidad de la librería de bases de datos Berkeley DB (BDB). Sin embargo este problema hace que una instalación de OpenLDAP con Postgres sea prácticamente inmantenible. Por otro lado, las últimas versiones de OpenLDAP ya no utilizan BDB, sino que se recomienda el uso de una versión propia de LDAP: LMDB.



El backend mdb es el principal recomendado para un servidor LDAP. Utiliza la librería Lightning Memory-Mapped Database (LMDB) propia de LDAP, la cual está pensada para reemplazar a BDB. Esta librería soporta (al igual que BDB) indexado, pero no utiliza ninguna técnica de caché y no requiere ninguna personalización para lograr el máximo rendimiento. A su vez es completamente jerárquica como HDB.

Instalación de OpenLDAP

La instalación es más simple que en el caso de utilizar Postgres como backend, ya que la base de datos la provee el propio paquete OpenLDAP. A fin de configurar, compilar e instalar OpenLDAP, he provisto mi propio script install-openldap.bash.

Para comenzar, descargar los fuentes de OpenLDAP y el script de instalación:

# cd /usr/local/src
# wget http://mirrors.ucr.ac.cr/openldap/openldap-release/openldap-2.4.45.tgz
# wget https://raw.githubusercontent.com/linuxitux/scripts/master/Devuan/install-openldap.bash

Revisar la variable OPENLDAP_VERSION para que coincida con el paquete descargado y ejecutar el script:

nano install-openldap.bash
chmod +x install-openldap.bash
./install-openldap.bash

Una vez configurado, compilado e instalado OpenLDAP, el siguiente paso consiste en instalar un script de inicio SysV para slapd:

# cd /usr/local/etc/openldap/
# wget https://raw.githubusercontent.com/linuxitux/scripts/master/Devuan/init/slapd
# ln -s /usr/local/etc/openldap/slapd /etc/init.d/
# update-rc.d slapd defaults

Luego ajustar correctamente los permisos para el directorio de configuración de LDAP. El script de instalación crea automáticamente al usuario y grupo "ldap". Dar permisos al grupo "ldap" y quitar todo permiso para el resto del mundo:

# chmod -R o-wrx *
# chmod -R g+r-x *
# chown -R ldap:ldap *

Por último, crear el directorio donde se almacenará la base de datos del servidor LDAP y ajustar los permisos:

# mkdir -p /usr/local/var/openldap-data
# chown ldap:ldap /usr/local/var/openldap-data
# chmod 700 /usr/local/var/openldap-data/

Configuración de slapd

Una vez instalado OpenLDAP, se debe proceder con la configuración del servidor. Editar el archivo de configuración provisto por la instalación:

# cd /usr/local/etc/openldap/
# nano slapd.conf

Ajustar correctamente las siguientes variables:

pidfile         /usr/local/var/run/openldap/slapd.pid
argsfile        /usr/local/var/run/openldap/slapd.args

suffix          "dc=linuxito,dc=com"
rootdn          "cn=root,dc=linuxito,dc=com"

rootpw                  {SSHA}xxx

La contraseña de root se debe generar utilizando la herramienta slappaswd.

Tener en cuenta que el usuario "ldap" debe tener acceso de escritura al directorio donde se almacena el PID del servidor (variables pidfile y argsfile).

Ahora es posible iniciar el servidor por primera vez:

# service slapd start

Verificar el funcionamiento con la siguiente consulta:

root@debian8:/usr/local/etc/openldap# ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: namingContexts 
#

#
dn:
namingContexts: dc=linuxito,dc=com

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

La salida demuestra que el servidor se encuentra funcionando.

A partir de OpenLDAP 2.3, el servidor utiliza el motor de configuración dinámico slapd-config. Ya que el soporte para el archivo de configuración slapd.conf está deprecated, y será definitivamente abandonado en futuras versiones, es conveniente convertir la configuración en el archivo slapd.conf al esquema de configuración cn=config.

Crear el directorio de configuración slapd.d:

root@debian8:/usr/local/etc/openldap# mkdir slapd.d
root@debian8:/usr/local/etc/openldap# chown ldap:ldap slapd.d

Convertir loa configuración actual utilizando la herramienta slaptest:

root@debian8:/usr/local/etc/openldap# slaptest -f slapd.conf -F /usr/local/etc/openldap/slapd.d
config file testing succeeded

Verificar el contenido del directorio:

root@debian8:/usr/local/etc/openldap# ll slapd.d/
total 16
drwxr-sr-x 3 ldap ldap 4096 dic  4 11:25 .
drwxr-sr-x 6 root ldap 4096 dic  4 11:24 ..
drwxr-s--- 3 root ldap 4096 dic  4 11:25 cn=config
-rw------- 1 root ldap 1284 dic  4 11:25 cn=config.ldif

Por último, ajustar los permisos sobre dicho directorio:

root@debian8:/usr/local/etc/openldap# chown -R ldap:ldap slapd.d/

Antes de reiniciar el servidor, es necesario modificar el script de inicio para que utilice este nuevo esquema de configuración:

root@debian8:/usr/local/etc/openldap# nano slapd

Las variables SLAPD_CONF y SLAPD_CONF_DIR controlan qué esquema de configuración del servidor se utiliza:

SLAPD_CONF="$SLAPD_PATH/etc/openldap/slapd.conf"
SLAPD_CONF_DIR=""

Modificarlas para que queden de la siguiente forma:

SLAPD_CONF=""
SLAPD_CONF_DIR="$SLAPD_PATH/etc/openldap/slapd.d"

Ahora si es posible reiniciar el demonio slapd:

# service slapd restart

Y verificar el funcionamiento del servidor:

root@debian8:/usr/local/etc/openldap# ldapsearch -x -h localhost -b "" -s base "(objectClass=*)" namingContexts
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectClass=*)
# requesting: namingContexts 
#

#
dn:
namingContexts: dc=linuxito,dc=com

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Inicialización del directorio

En este punto contamos con un directorio LDAP completamente funcional aunque vacío, no tiene ningún objeto ni estructura. A fin de poder comenzar a agregar objetos y entradas, es necesario inicializar la base de datos del mismo.

Las entradas se gestionan utilizando el formato LDIF. Este formato de texto plano se utiliza para representar la estructura y organización de las entradas.

Crear un subdirectorio donde almacenar nuestros archivos LDIF:

# mkdir linuxito

Crear nuestro primer archivo LDIF:

nano linuxito/linuxito.ldif

Como mínimo es recomendable contar con una organización. A tal fin, definir un objeto de clase "organization":

# Organización para linuxito
dn: dc=linuxito,dc=com
objectClass: dcObject
objectClass: organization
dc: linuxito
o: linuxito
description: Linuxito

Agregar la nueva entrada utilizando ldapadd:

root@debian8:/usr/local/etc/openldap# ldapadd -f linuxito/linuxito.ldif -x -D "cn=root,dc=linuxito,dc=com" -w secret
adding new entry "dc=linuxito,dc=com"

La entrada se ha agregado con éxito.

Es posible comprobarlo ejecutando una búsqueda desde un cliente remoto:

emi@hal9000:~ % ldapsearch -x -H ldaps://dc.linuxito.com:636 -w secret -D "cn=root,dc=linuxito,dc=com" -b "dc=linuxito,dc=com" "(objectClass=organizationalUnit)"
# extended LDIF
#
# LDAPv3
# base <dc=linuxito,dc=com> with scope subtree
# filter: (objectClass=organizationalUnit)
# requesting: ALL
#

# users, linuxito.com
dn: ou=users,dc=linuxito,dc=com
ou: users
objectClass: top
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Ya tenemos nuestro servidor LDAP listo para utilizar.

Referencias


Tal vez pueda interesarte


Compartí este artículo y dejá tu comentario