Instalación de openldap en Debian 12

openldap

¿Que es openldap?

OpenLDAP es una implementación de software libre del protocolo LDAP (Lightweight Directory Access Protocol), un protocolo para consultar y modificar servicios de directorio. Un directorio LDAP funciona como una base de datos jerárquica, organizada en forma de árbol, muy optimizada para las lecturas, donde se guarda información de usuarios, grupos, equipos, etc.

Su uso más habitual es centralizar la autenticación: en lugar de tener las cuentas de usuario repartidas en el /etc/passwd de cada máquina, se guardan una sola vez en el servidor LDAP y todos los equipos de la red las consultan desde ahí. Así, un usuario puede iniciar sesión en cualquier cliente con las mismas credenciales, y damos de alta o de baja las cuentas en un único sitio.

El árbol del directorio parte de un nodo raíz llamado base DN (Distinguished Name), que se deriva de un nombre de dominio. Por ejemplo, el dominio example.local se traduce en la base dc=example,dc=local (cada dc es un domain component). A partir de esa base colgarán el resto de entradas, cada una identificada por su propio DN único.

En este tutorial montaremos el servidor OpenLDAP en Debian 12, daremos de alta un usuario y configuraremos un cliente para que se autentique contra él.

Requisitos

  • Sistema Debian 12 actualizado.
  • Privilegios de root o sudo.
  • Acceso a internet.

Instalacion servidor

Instalamos el servidor (slapd) junto con las utilidades de línea de comandos (ldap-utils, que nos da ldapadd, ldapsearch, etc.):

root@ldap:~# apt install slapd ldap-utils -y

Durante la instalación nos pedirá que introduzcamos y confirmemos una contraseña para el administrador del directorio (el usuario admin). Esta es la contraseña con la que después haremos los cambios en el árbol, así que conviene apuntarla.

Configuración servidor

La instalación por defecto usa un dominio genérico. Para fijar nuestro propio dominio (y con él la base DN del árbol) lanzamos la reconfiguración asistida:

root@ldap:~# dpkg-reconfigure slapd

El asistente nos hará varias preguntas; la más importante es el nombre de dominio DNS, que es el que determina la base del árbol. Si indicamos example.local, la base pasará a ser dc=example,dc=local. El resto de opciones (organización, backend MDB, purgar la base anterior, etc.) las podemos dejar por defecto.

Con el servidor listo, vamos a dar de alta un usuario. Las entradas del directorio se describen en ficheros de texto con formato LDIF (LDAP Data Interchange Format). Creamos un fichero user.ldif:

root@ldap:~# nano user.ldif
dn: uid=user,dc=example,dc=local
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: User Name
uid: user
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/user
loginShell: /bin/bash
gecos: User Name
userPassword: {SSHA}password_hash

Merece la pena entender qué estamos definiendo:

  • dn: el nombre distinguido, la “dirección” única de la entrada dentro del árbol.
  • objectClass: las clases de objeto determinan qué atributos puede tener la entrada. posixAccount y shadowAccount son las que aportan los campos típicos de una cuenta Unix (uidNumber, homeDirectory, loginShell…), imprescindibles para poder iniciar sesión en el sistema.
  • uidNumber / gidNumber: el identificador numérico de usuario y grupo, igual que en /etc/passwd.
  • userPassword: la contraseña, que nunca se guarda en claro sino cifrada.

Para generar el valor cifrado de userPassword usamos slappasswd, que nos devuelve el hash (por defecto en formato {SSHA}):

root@ldap:~# slappasswd

New password:
Re-enter new password:
{SSHA}nozlspIlP1HOz0mYCBFtyQ9qiS7uh1p8

Copiamos ese hash en el campo userPassword del fichero user.ldif. Una vez completo, añadimos la entrada al directorio con ldapadd, autenticándonos como el administrador (-D) e indicando el fichero (-f); la opción -W hace que nos pida la contraseña del admin:

root@ldap:~# ldapadd -x -D "cn=admin,dc=example,dc=local" -W -f user.ldif

Comprobamos que el usuario se ha creado correctamente consultándolo con ldapsearch:

root@ldap:~# ldapsearch -x -LLL -H ldap:/// -b "dc=example,dc=local" "(uid=user)"

dn: uid=user,dc=example,dc=local
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: User Name
uid: user
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/user
loginShell: /bin/bash
gecos: User Name

En un directorio real es habitual organizar las entradas en unidades organizativas (ou), por ejemplo colgando los usuarios de ou=People y los grupos de ou=Groups, en lugar de dejarlos directamente bajo la base. Aquí lo mantenemos simple para centrarnos en el funcionamiento.

Instalación cliente

Ya tenemos el servidor con un usuario. Ahora configuraremos un equipo cliente para que sus inicios de sesión consulten al servidor LDAP. Instalamos las utilidades y el módulo de PAM que permite autenticar contra LDAP:

root@ldap-client:~# apt install ldap-utils libpam-ldap -y

Durante la instalación el asistente nos pedirá la dirección IP (o URI) del servidor LDAP, la base de búsqueda (dc=example,dc=local) y los servicios que queremos resolver por LDAP; en este caso seleccionamos passwd, group y shadow (usuarios, grupos y contraseñas).

Configuración cliente

El fichero /etc/nsswitch.conf es el que le dice al sistema de dónde obtener la información de usuarios, grupos, etc. El instalador debería haber añadido ldap a las líneas correspondientes; lo comprobamos:

root@ldap-client:~# nano /etc/nsswitch.conf

Las líneas passwd, group y shadow deben incluir ldap, de forma que el sistema busque primero en los ficheros locales (files) y luego en el directorio LDAP:

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         files systemd ldap
group:          files systemd ldap
shadow:         files systemd ldap
gshadow:        files systemd

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Reiniciamos el servicio de caché de nombres (nscd) para que tome los cambios:

root@ldap-client:~# systemctl restart nscd

Comprobamos que el cliente llega al servidor lanzando una consulta directa contra él (indicando su IP con -H). Debería devolvernos tanto la base del árbol como el usuario que creamos:

root@ldap-client:~# ldapsearch -x -H ldap://192.168.50.25 -b "dc=example,dc=local" -LLL

dn: dc=example,dc=local
objectClass: top
objectClass: dcObject
objectClass: organization
o: example.local
dc: example

dn: uid=user,dc=example,dc=local
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: User Name
uid: user
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/user
loginShell: /bin/bash
gecos: User Name

La prueba definitiva de que la integración funciona es que el usuario de LDAP aparezca como un usuario más del sistema. Lo verificamos con getent passwd, que combina los usuarios locales con los del directorio: al final de la lista debe aparecer nuestro usuario user (uid 10001), que no existe en el /etc/passwd local:

root@ldap-client:~# getent passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
systemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologin
messagebus:x:100:107::/nonexistent:/usr/sbin/nologin
usuario:x:1000:1000:usuario,,,:/home/usuario:/bin/bash
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
nslcd:x:102:109:nslcd name service LDAP connection daemon,,,:/run/nslcd:/usr/sbin/nologin
user:x:10001:10001:User Name:/home/user:/bin/bash

Prueba de autenticación

Por último, comprobamos que el usuario del directorio puede iniciar sesión de verdad en el cliente. En mi caso me conecto por SSH desde mi máquina Windows con el usuario user (que solo existe en LDAP):

PS C:\Users\ringedbeak> ssh user@192.168.50.13

user@192.168.50.13's password:
Linux ldap-client 6.1.0-13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.55-1 (2023-09-29) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Nov  8 18:26:22 2023 from 192.168.50.49
user@ldap-client:~$

Como podemos ver, hemos iniciado sesión correctamente con un usuario que no existe localmente en el cliente: sus credenciales viven únicamente en el servidor LDAP.

Para dar de baja el usuario del directorio, usamos ldapdelete indicando su DN:

root@ldap:~# ldapdelete -x -D "cn=admin,dc=example,dc=local" -W "uid=user,dc=example,dc=local"

Administración gráfica con LAM

Como habrás notado, gestionar el directorio a mano con ficheros LDIF y comandos ldapadd/ldapdelete es potente pero tedioso, sobre todo cuando hay que crear o modificar muchos usuarios y grupos. Para administrar el directorio de forma cómoda desde el navegador existe LDAP Account Manager (LAM), una interfaz web que se conecta a este mismo OpenLDAP y nos permite crear, editar y borrar cuentas de forma gráfica.

Si quieres dar ese paso, lo explico en la entrada Instalación de LDAP Account Manager (LAM) en Debian 13.

Con esto hemos terminado la instalación y configuración de OpenLDAP en Debian 12: tenemos un servidor de directorio centralizado, un cliente que se autentica contra él y las herramientas para gestionar sus cuentas.