OpenLDAP Server

Tiene varios usos, autenticación, directorio compartido (para clientes de correo), libro de direcciones, etc. La información se almacena en una estructura de árbol. Comenzamos con dos nodos básicos debajo de la raiz: "Usuarios" y "Grupos".
Por defecto tu árbol será determinado por FQDN (Fully Qualified Domain Name).
Si tu dominio es ejemplo.com, tu nodo raiz será dc=ejemplo,dc=com.

Se instalan el demonio slapd y las utilidades, con:

sudo apt-get install slapd ldap-utils

Para reconfigurar el árbol usamos:

sudo dpkg-reconfigure slapd

OpenLDAP usa una base de datos separada que contiene el cn=config DIT (Directory Information Tree), el cual configura el demonio slapd dinámicamente.
El árbol cn=config se puede manipular, por ejemplo podemos ver el árbol con:

ldapsearch -xLLL -b cn=config -D cn=admin,cn=config -W olcDatabase={1}hdb

Podemos añadir otro atributo a la lista índice usando ldapmodify:

ldapmodify -x -D cn=admin,cn=config -W

Una vez completada la modificación, presionar Ctrl+D para salir de la utilidad.

ldapmodify puede también leer los cambios de un archivo, esto es útil para cambios grandes.

Añadir schemas adicionales requiere que el esquema sea convertido a formato LDIF. Afortunadamente, el demonio slapd lo puede hacer automáticamente. [añadir aquí como]

Poblando LDAP

El directorio fue creado durante la instalación, ahora toca poblarlo. Será poblado con un clásico esquema compatible con aplicaciones de libro de direcciones y con cuentas Posix Unix. Las cuentas Posix permitirán autenticación a varias aplicaciones, tales como aplicaciones web, aplicaciones de transferencia de correo, etc.
Para poblar LDAP utilizamos archivos con formato LDIF. Creamos un archivo por ejemplo example.com.ldif como en la guia, para dar de alta usuarios y grupos.
Para añadir entradas al directorio LDAP usamos la utilidad ldapadd:

ldapadd -x -D cn=admin,dc=example,dc=com -W -f example.com.ldif

Podemos comprobar que el contenido ha sido correctamente añadido con:

ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn


Nota: -x (no usará SASL, metodo de autenticacion por defecto)
      -LLL (descapacita la impresión de información del esquema LDIF)

Replicación LDAP

Rápidamente multiples sistemas dependerán de LDAP para autenticación, autorización, configuración, etc.
Es buena idea preparar un sistema redundante por replicación.
La replicación se consigue con Syncrepl, el cual permite dos metodos push o pull.
Creación del ACL (Access Control List)
La autenticación requiere acceder al campo password, el cual no debe ser accesible por defecto. Los usuarios deben poder cambiar sus propias contraseñas, shadowLastChange necesita ser accesible una vez que el usuario fue autenticado.
Para ver el ACL usamos la utilidad ldapsearch:

ldapsearch -xLLL -b cn=config -D cn=admin,cn=config -W olcDatabase=hdb olcAccess

TLS y SSL

Al autenticarnos en un OpenLDAP server es mejor usar una sesion encriptada.
El primer paso es obtener o crear un certificado. Una vez tienes un certificado, clave y CA cer instalado, usa ldapmodify para añadir nuevas opciones de configuración:

ldapmodify -x -D cn=admin,cn=config -W

Luego descomenta en /etc/default/slapd la línea:

SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///"

Ahora el usuario openldap necesita acceder al certificado:

sudo adduser openldap ssl-cert
sudo chgrp ssl-cert /etc/ssl/private/server.key
sudo chmod g+r /etc/ssl/private/server.key

Ojo con los permisos de /etc/ssl/private y ~server.key, tienen que ser iguales.
Finalmente, reinicia slapd:

sudo /etc/init.d/slapd restart

El demonio slapd debe estar ahora escuchando por conexión LDAPS y ser capaz de usar STARTTLS durante la autenticación.

Comprobar /var/log/syslog para ver errores.

Autenticación LDAP

Una vez tenemos el LDAP server trabajando, debemos instalar los siquientes paquetes para autenticar un cliente Ubuntu usando LDAP:

sudo apt-get install libnss-ldap

Un dialogo preguntara detalles de configuración. Si hay error se puede volver a iniciar el dialogo con:

sudo dpkg-reconfigure ldap-auth-config

El resultado del dialog se puede ver en /etc/ldap.conf

Ahora que libnss-ldap esta configurado, capacita un perfil LDAP:

sudo auth-client-config -t nss -p lac_ldap

Usa la siguiente utilidad para configurar el sistema para que use LDAP para autenticación:

sudo pam-auth-update

En el menu elige LDAP y cualquier otro mecanismo que necesites.

Gestion de usuarios y grupos

El paquete ldap-utils viene con multiples utilidades para gestionar el directorio, pero la gran cantidad de opciones puede hacer costoso su uso. El paquete ldapscripts contiene scripts configurables para facilitar la gestion de usuarios y grupos LDAP.

sudo apt-get install ldapscripts

Luego edita el archivo de configuración /etc/ldapscripts/ldapscripts.conf descomentando y cambiando lo de la guia para ajustar tu entorno.

Ahora, crea el archivo ldapscripts.passwd para permitir acceso autenticado al directorio.

sudo sh -c "echo -n 'secret' > /etc/ldapscripts/ldapscripts.passwd"
sudo chmod 400 /etc/ldapscripts/ldapscripts.passwd

Ojo, cambia "secret" por la password del administrador LDAP.

Ejemplos de como usar los scripts:
  • Crear un nuevo usuario:
sudo ldapadduser daniel example

Creará un usuario con uid daniel y establece el grupo principal del usuario (gid) a example
  • Cambiar la contraseña de un usuario:
sudo ldapsetpasswd daniel
  • Borrar un usuario
sudo ldapdeleteuser george

Otra gran característica de ldapscripts es el sistema de plantilla. La plantilla permite customizar atributos de usuario, grupo y maquinas.
Para usarlo, por ejemplo plantilla de usuario editar /etc/ldapscripts/ldapscripts.conf cambiando:
UTEMPLATE="/etc/ldapscripts/ldapadduser.template"
Hay plantillas de muestra en /etc/ldapscripts.
Copia el archivo:

sudo cp /etc/ldapscripts/ldapadduser.template.sample /etc/ldapscripts/ldapadduser.template

Copia o renombra:

sudo cp /etc/ldapscripts/ldapadduser.template.sample /etc/ldapscripts/ldapadduser.template

Edita la nueva plantilla para añadir los atributos deseados.

Hay mas scripts utiles para verlos:

dpkg -L ldapscripts | grep bin