Cómo configuro un servidor LDAP para validar equipos Linux de manera centralizada

Cuando trabajamos en una organización donde debemos gestionar las identidades (autenticiación) y los permisos que éstos deben tener (autorización) hemos de implementar mecanismos que nos permitan centralizar esta información de manera segura, robusta y accesible.

El primer pensamiento cuando tenemos que implementar este tipo de soluciones es Active Directory de Microsoft pero existen otro tipos de soluciones que nos permiten implementar autenticación centralizada Open Source. Hoy vamos a hablar de OpenLDAP y cómo montar un directorio para que nuestras usuarias y usuario puedan hacer login desde sus estaciones de trabajo Linux.

Prerequisitos

Para hacer el despliegue de esta arquitectura necesitaremos :

  • Servidor Ubuntu 24.04 LTS
  • Estación de trabajo Ubuntu Desktop 25.10

Instalación del servidor

Instalación del software

Haremos una instalación del servidor. una vez acabada, procederemos a actualizar los paquetes para que todo el software y el kernel estén en la última versión disponible.

sudo apt update
sudo apt upgrade -y

Después del reinicio de rigor, procedemos a instalar el servidor OpenLDAP y el paquete de utilidades :

sudo apt install slapd ldap-utils -y

Durante el proceso de instalación se nos pedirá una contraseña admin LDAP. Indicaremos la contraseña que queremos usar.

En algunas versiones puede que nos pida más parámetros pero en la que yo uso, Ubuntu 24.04 LTS tendremos que reconfigurar el servicio con :

sudo dpkg-reconfigure slapd

Lo primero que nos preguntará es si queremos omitir la configuración. Le diremos que no.

Lo siguiente será el dominio. Indicaremos el nombre del hostname. De acuerdo a la información que indica se usará para crear el DN.

Definiremos el nombre de la organización. Este nombre determinará la raíz del directorio.

Definiremos de nuevo la contraseña del administrador

Cuando nos pregunte si hay que borrar la base de datos LDAP cada vez que se purga slapd dindicaremos que no.

Comprobación del directorio

Para comprobar que el directorio está funcionando con nuestro DN ejecutaremos :

ldapsearch -x -LLL -H ldap://localhost -b dc=ubunturista,dc=local

El output de este comando debería ser algo similar a lo que se muestra :

Creación de las ramas y objetos del directorio

Necesitaremos crear una serie de archivos que contendrán los diferentes objetos y ramas del directorio que vamos a usar.

El comando que usaremos para cargar cada archivos será :

ldapadd -x -D cn=admin,dc=ubunturista,dc=local -W -f [ARCHIVO¯

donde -D es el DN del usuario administrador que se ha creado al instalar el servicio y [ARCHIVO] será cada uno de los archivos que vamos a ir creando.

Ramas principales : usuarios, grupos y roles

El archivo que contendrá la estructura básica de nuestro directorio lo llamaremos base.ldif y tendrá el siguiente contenido :

dn: ou=users,dc=ubunturista,dc=local
objectClass: organizationalUnit
ou: users

dn: ou=groups,dc=ubunturista,dc=local
objectClass: organizationalUnit
ou: groups

dn: ou=roles,dc=ubunturista,dc=local
objectClass: organizationalUnit
ou: roles

Lo cargaremos en el directorio ejecutando :

ldapadd -x -D cn=admin,dc=ubunturista,dc=local -W -f base.ldif

Creación de los roles

En linux no existen los roles como en otros sistemas sino que se basan en grupos. Vamos a crear los roles como objetos posixGroup. En esta instalación vamos a definir tres roles :

  • role-admin
  • role-user
  • role-auditor

Definimos el fichero roles.ldif y añadiremos :

dn: cn=role-admin,ou=roles,dc=ubunturista,dc=local
objectClass: posixGroup
cn: role-admin
gidNumber: 5000

dn: cn=role-user,ou=roles,dc=ubunturista,dc=local
objectClass: posixGroup
cn: role-user
gidNumber: 5001

dn: cn=role-auditor,ou=roles,dc=ubunturista,dc=local
objectClass: posixGroup
cn: role-auditor
gidNumber: 5002

Cargaremos el archivo en el directorio con :

ldapadd -x -D cn=admin,dc=ubunturista,dc=local -W -f roles.ldif

Crear usuarios en el directorio

Antes de crear los usuarios necesitamos entender cómo funciona la gestión de las contraseñas en este punto de la configuración.

La contraseña se carga como un hash en el directorio. Vamos a usar SHA para generar el hash de la contraseña de nuestros usuarios. Y este hash luego se adjuntará en el archivo ldif que cargaremos en el directorio.

El comando que nos permite convertir en un hash listo para usar en un archivo ldif es :

slappasswd

Generaremos una contraseña para cada uno de los usuarios que vamos a definir y en el atributi userPassword pegaremos lo que nos ha dado directamente slappasswd.

dn: uid=luna,ou=users,dc=ubunturista,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Luna Lovegood
sn: Lovegood
uid: juan
uidNumber: 10000
gidNumber: 5001
homeDirectory: /home/luna
loginShell: /bin/bash
userPassword: {SSHA}HASH_GENERADO

dn: uid=hermione,ou=users,dc=ubunturista,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Hermione Granger
sn: Granger
uid: ana
uidNumber: 10001
gidNumber: 5002
homeDirectory: /home/hermione
loginShell: /bin/bash
userPassword: {SSHA}HASH_GENERADO

dn: uid=minerva,ou=users,dc=ubunturista,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Minerva McGonagall 
sn: McGonagall
uid: ana
uidNumber: 10001
gidNumber: 5002
homeDirectory: /home/hermione
loginShell: /bin/bash
userPassword: {SSHA}HASH_GENERADO

Añadiremos los usuarios al directorio ejecutando :

ldapadd -x -D cn=admin,dc=ubunturista,dc=local -W -f users.ldif

Asignar usuarios a roles

Crearemos el archivo roles_usuarios.ldif en el que mapearemos qué usuarios están asociados a qué roles con el contenido :

dn: cn=role-user,ou=roles,dc=ubunturista,dc=local
changetype: modify
add: memberUid
memberUid: harry

dn: cn=role-auditor,ou=roles,dc=ubunturista,dc=local
changetype: modify
add: memberUid
memberUid: hermione

dn: cn=role-admin,ou=roles,dc=ubunturista,dc=local
changetype: modify
add: memberUid
memberUid: minerva

Cargaremos el archivo en el directorio con :

ldapadd -x -D cn=admin,dc=ubunturista,dc=local -W -f role_usuarios.ldif

Instalación de phpLDAPAdmin

Para instalar phpLDAPAdmin ejecutaremos :

sudo apt install phpldapadmin apache2 php -y

Una vez instalador editaremos el archivo /etc/phpldapadmin/config.php y buscaremos las directivas $servers y las dejaremos configuradas como se indica :

$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','base',array('dc=ubunturista,dc=local'));

Guardamos, salimos de la edición del archivo y ya nos podemos conectar por web a la URL http://IP_SERVIDOR/phpldapadmin

El usuario que tendremos que indicar para conectarnos es cn=admin,dc=ubunturista,dc=local.

Instalación y configuración del lado cliente

Instalación de paquetes

Instalaremos los paquetes necesarios en la estación de trabajo para que podamos configurar la autenticación por LDAP :

sudo apt install libnss-ldap libpam-ldap ldap-utils nscd -y

A medida que nos vaya preguntando indicaremos :

  • URI: ldap://192.168.56.10
  • Base: dc=ubunturista,dc=local
  • LDAP versión: 3
  • Make local root Database admin: YES

Configurar NSS

Editaremos el archivo /etc/nsswitch.conf e indicaremos dónde se deben intenatr hacer las valdiaciones. En nuestro caso quedarán como :

passwd:       files ldap
group:          files ldap
shadow:      files ldap

De esta manera, cuando vayamos a hacer login primero comprobará en los archivos locales y a continuación en LDAP. Así garantizamos que si no tenemos acceso al ser vidor LDAP almenos podremos hacer login con un usuario local.

Creación del home automáticamente

Cuando un usuario haga login por primera vez se creará su carpeta personal. Editaremos el archivo /etc/pam.d/common-session y añadiremos al final :

session optional pam_mkhomedir.so skel=/etc/skel umask=077

sudo y LDAP

Crearemos el archivo /etc/ldap/ldap_sudo y añadiremos :

%role-admin ALL=(ALL) ALL

Comprobaciones

Desde una consola podremos preguntarle que nos devuelva información de un usuario con los comandos :

getent passwd hermione
getent group role-user

Si queremos convertirnos en un usuario ejecutaremos :

su - luna

Podremos ver logs relacionados con el servicio de validación respecto al ldap ejecutando :

journalctl -xe | grep ldap

Este documento va a ir evolucionando para incluir mejoras en cuanto a la seguridad, la eficiencia y la robustez. Si quieres recibir un correo cuando se actualice ¡regístrate en la lista de Ubunturista!