OpenLDAP

Instalación de OpenLDAP

Previamente, en el archivo /etc/hosts se deben añadir los nombres referentes al controlador de LDAP:

127.0.0.1 ldapserver.inaki.local ldapserver

### IP de la red
192.168.100.10 ldapserver.inaki.local ldapserver

Se procede a la instalación de las herramientas necesarias:

sudo apt install ldap-utils slapd

En la ventana emergente no hace falta introducir los valores reales pues estos serán configurados más adelante.

Ahora sí, para configurar los parámetros básicos:

sudo dpkg-reconfigure slapd
ParámetroValor
Nombre DNSinaki.local
Nombre de entidadinaki
Contraseña{ContraseñaSegura}

Finalmente se crea un directorio para los archivos de configuración.

mkdir ~/inaki.local && cd ~/inaki.local
touch unidades_organizativas.ldif usuarios.ldif modificar_alumno.ldif

Unidades Organizativas y usuarios

Una vez asegurado que el servicio está corriendo:

sudo systemctl status slapd

El siguiente paso natural será crear unidades organizativas y usuarios.

Crear Unidades Organizativas

Se edita el archivo unidades_organizativas.ldif creado previamente. Se añade lo siguiente:

dn: ou=profesores,dc=inaki,dc=local
objectClass: organizationalUnit
ou: profesores

dn: ou=alumnos,dc=inaki,dc=local
objectClass: organizationalUnit
ou: alumnos

Para añadir estas OUs (unidades organizativas):

ldapadd -x -D "cn=admin,dc=inaki,dc=local" -W -f unidades_organizativas.ldif

Añadir usuarios

Se edita el archivo usuarios.ldif creado previamente. Se añade lo siguiente:

# Usuario profesor
dn: uid=profe1,ou=profesores,dc=inaki,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
cn: Profesor Uno
sn: Uno
uid: profe1
uidNumber: 1001
gidNumber: 100
homeDirectory: /home/profe1
loginShell: /bin/bash
userPassword: {SSHA}p/yZC4OW1/rJDesDbG9Jm8py7iJXsfv8

# Usuario alumno1
dn: uid=alumno1,ou=alumnos,dc=inaki,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
cn: Alumno Uno
sn: Uno
uid: alumno1
uidNumber: 2001
gidNumber: 200
homeDirectory: /home/alumno1
loginShell: /bin/bash
userPassword: {SSHA}p/yZC4OW1/rJDesDbG9Jm8py7iJXsfv8

# Usuario alumno2
dn: uid=alumno2,ou=alumnos,dc=inaki,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
cn: Alumno Dos
sn: Dos
uid: alumno2
uidNumber: 2002
gidNumber: 200
homeDirectory: /home/alumno2
loginShell: /bin/bash
userPassword: {SSHA}p/yZC4OW1/rJDesDbG9Jm8py7iJXsfv8

Y se añaden los usuarios del archivo de la siguiente manera:

ldapadd -x -D "cn=admin,dc=inaki,dc=local" -W -f usuarios.ldif

Ver dn de todos los usuarios

Usando la herramienta ldapsearch se pueden realizar búsquedas filtrando por dn.

ldapsearch -x -LLL -b "dc=inaki,dc=local" "(objectClass=inetOrgPerson)" dn

Ver uid alumnos

Usando la herramienta ldapsearch se pueden realizar también búsquedas filtrando por uid.

ldapsearch -x -LLL -b "ou=alumnos,dc=inaki,dc=local" "(objectClass=inetOrgPerson)" uid

Modificar con ldapmodify

Primeramente, se edita el archivo modificar_alumno.ldif y se añade lo siguiente:

dn: uid=alumno1,ou=alumnos,dc=inaki,dc=local
changetype: modify
replace: sn
sn: Patata
-
add: telephoneNumber
telephoneNumber: 123456789

Una vez terminado, para aplicar los cambios, se ejecuta el siguiente comando:

ldapmodify -x -D "cn=admin,dc=inaki,dc=local" -W -f modificar_alumno.ldif

Eliminar con ldapdelete

Para eliminar un usuario del dominio, por ejemplo alumno2, se puede hacer de la siguiente manera:

ldapdelete -x -D "cn=admin,dc=inaki,dc=local" -W "uid=alumno2,ou=alumnos,dc=inaki,dc=local"

Objetos, atributos y modificaciones

En LDAP, cada objectClass define un conjunto de atributos obligatorios (MUST) y opcionales (MAY).

He aquí una lista con algunos de ellos:

objectClassMUSTMAY
organizationalUnitoudescription,seeAlso
inetOrgPersoncn,snuid,mail,telephoneNumber,title
posixAccountuid,uidNumber,gidNumer, homeDirectory, loginShellgecos,description,shadowLastChange
organizationalRolecndescription,roleOccupant,seeAlso

Modificar atributos

Para modificar un atributo de, por ejemplo alumno1, le añadiré dos atributos nuevos que no tiene no sin antes crear un archivo en la carpeta del dominio:

touch alumno1_modify.ldif

Dentro, en el archivo, especificaré dos atributos nuevos a añadirles a dicho usuario:

dn: uid=alumno1,ou=alumnos,dc=inaki,dc=local
changetype: modify
add: mail
mail: alumno1@plaiaundi.eus
-
add: title
title: alumno

Y para aplicar los cambios del usuario alumno1:

ldapmodify -x -D "cn=admin,dc=inaki,dc=local" -W -f alumno1_modify.ldif

Añadir más usuarios

En esta ocasión, crearé dos nuevos usuarios, un profesor y un alumno.

Para ello copiaré la plantilla usada en este apartado:

cp usuarios.ldif n_usuarios.ldif

Y lo adapto para que sirva para crear un usuario llamado profe2 y alumno3.

No hay que olvidar cambiar el uidNumber de los nuevos usuarios y que no sobreescriban a otros usuarios

Por último, para añadir los usuarios:

ldapadd -x -D "cn=admin,dc=inaki,dc=local" -W -f n_usuarios.ldif

Consultas

Mediante la herramienta ldapsearch se pueden hacer consultas para recuperar información de distintos objetos dentro del directorio LDAP.

Por ejemplo, si se quiere filtrar por el uidy que además solo devuelva el de alumno1:

$ldapsearch -x -b "ou=alumnos,dc=inaki,dc=local" -s sub "(uid=alumno1)" uid
# extended LDIF
#
# LDAPv3
# base <ou=alumnos,dc=inaki,dc=local> with scope subtree
# filter: (uid=alumno1)
# requesting: uid
#

# alumno1, alumnos, inaki.local
dn: uid=alumno1,ou=alumnos,dc=inaki,dc=local
uid: alumno1

# search result
search: 2
result: 0 Success

# numResponses: 

Si se quiere optener el uid de alumnos:

$ldapsearch -x -b "ou=alumnos,dc=inaki,dc=local" -s sub "(objectClass=*)" uid
# extended LDIF
#
# LDAPv3
# base <ou=alumnos,dc=inaki,dc=local> with scope subtree
# filter: (objectClass=*)
# requesting: uid
#

# alumnos, inaki.local
dn: ou=alumnos,dc=inaki,dc=local

# alumno1, alumnos, inaki.local
dn: uid=alumno1,ou=alumnos,dc=inaki,dc=local
uid: alumno1

# alumno3, alumnos, inaki.local
dn: uid=alumno3,ou=alumnos,dc=inaki,dc=local
uid: alumno3

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3

Modificar el RDN

El RDN, Relative Distinguished Name, es el componente de un Distinguished Name DN que identifica de forma única una entrada dentro de su nivel inmediato dentro del árbol LDAP.

En el caso de, por ejemplo, alumno1, el RDN es uid=alumno1 como se aprecia en el apartado de consultas.

Modifar el valor del RDN

Si se quiere modificar el valor del atributo del RDN, se crea un archivo, modificar_valor_rdn.ldif y dentro de él:

dn: uid=alumno1,ou=alumnos,dc=inaki,dc=local
changetype: modrdn
newrdn: uid=alumno11
deleteoldrdn: 1

Y para aplicar los cambios:

ldapmodify -x -D "cn=admin,dc=inaki,dc=local" -W -f modificar_valor_rdn.ldif

Si se mira la salida del uid de alumno1, se aprecia que no hay coincidencias:

$ ldapsearch -x -b "ou=alumnos,dc=inaki,dc=local" -s sub "(uid=alumno1)" uid
# extended LDIF
#
# LDAPv3
# base <ou=alumnos,dc=inaki,dc=local> with scope subtree
# filter: (uid=alumno1)
# requesting: uid
#

# search result
search: 2
result: 0 Success

Pero sí con el nuevo uid:

$ ldapsearch -x -b "ou=alumnos,dc=inaki,dc=local" -s sub "(uid=alumno11)" uid
# extended LDIF
#
# LDAPv3
# base <ou=alumnos,dc=inaki,dc=local> with scope subtree
# filter: (uid=alumno11)
# requesting: uid
#

# alumno11, alumnos, inaki.local
dn: uid=alumno11,ou=alumnos,dc=inaki,dc=local
uid: alumno11

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Modifar el atributo del RDN

Si se quiere modificar el atributo usado como RDN, se crea un archivo, modificar_atributo_rdn.ldif y detro de él:

dn: uid=alumno11,ou=alumnos,dc=inaki,dc=local
changetype: modrdn
newrdn: cn=Alumno Uno
deleteoldrdn: 1

Y para aplicar los cambios:

$ldapmodify -x -D "cn=admin,dc=inaki,dc=local" -W -f modificar_atributo_rdn.ldif
modifying rdn of entry "uid=alumno11,ou=alumnos,dc=inaki,dc=local"
ldap_rename: Object class violation (65)
        additional info: object class 'posixAccount' requires attribute 'uid'

No se puede realizar pues como se ve en los atributos de la clase posixAccount, el atributo ´uid´ es obligatorio.

Cambiar la unidad organizativa de un usuario

Mediante la creación del archivo mover_a_profesores.ldif:

dn: uid=alumno11,ou=alumnos,dc=inaki,dc=local
changetype: modrdn
newrdn: uid=alumno11
deleteoldrdn: 0
newsuperior: ou=profesores,dc=inaki,dc=local

Y se aplican los cambios:

ldapmodify -x -D "cn=admin,dc=inaki,dc=local" -W -f mover_a_profesores.ldif

Autenticación desde cliente

Para poder autenticarse desde un cliente, es necesario que ambos equipos puedan comunicarse entre ellos.

En este caso, ambas máquinas se encuentran en la misma red, la 192.168.100.0/24 siendo la 192.168.100.10 la IP del servidor LDAP y la 192.168.100.20 la IP del cliente.

A su vez, en el cliente hace falta instalar varias utilidades tanto para poder autenticarse vía consola o desde la interfaz gráfica:

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

En el instalador pedirá la información del servidor LDAP. En mi caso, me conecto al servidor mediante ldap://192.168.100.10 siendo dc=inaki,dc=local el DC y cn=admin,dc=inaki,dc=local el usuario administrador.

Además son necesarios los siguientes paquetes:

sudo apt install sssd sssd-tools libpam-sss libnss-sss

Por último, será necesario crear o editar el archivo /etc/sssd/sssd.conf:

[sssd]
domains = inaki.local
config_file_version = 2
services = nss, pam

[domain/inaki.local]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldap://192.168.1.10
ldap_search_base = dc=inaki,dc=local
ldap_default_bind_dn = cn=admin,dc=inaki,dc=local
ldap_default_authtok = 123
enumerate = true

Otorgando los permisos adecuados y aplicando los cambios reiniciando el servicio sssd:

sudo chmod 600 /etc/sssd/sssd.conf
sudo systemctl restart sssd 

Para comprobar que el usuario existe y que hay comunicación con el servidor LDAP, desde el cliente:

$ ldapsearch -x -LLL -H ldap://192.168.100.10 -b "dc=inaki,dc=local" "(uid=profe1)"
dn: uid=profe1,ou=profesores,dc=inaki,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
cn: Profesor Uno
sn: Uno
uid: profe1
uidNumber: 1001
gidNumber: 100
homeDirectory: /home/profe1
loginShell: /bin/bash

Autenticación por consola

Una vez seguido los pasos, para iniciar sesión por consola con el usuario profe1:

$ su - profe1
Mot de passe : 
su: avertissement : impossible de changer le répertoire vers /home/profe1: Aucun fichier ou dossier de ce nom
$ whoami
profe1

Para eliminar el mensaje su: avertissement : impossible de changer le répertoire vers /home/profe1: Aucun fichier ou dossier de ce nom hay que configurar que se cree una carpeta home por defecto para los usuarios:

sudo pam-auth-update

Conf de pam-auth-update

Y si se vuelve a autenticar el usuario profe1:

$ su - profe1
Mot de passe : 
Création du répertoire « /home/profe1 

Autenticación por GUI

Para acceder por la interfaz gráfica con, por ejemplo, el usuario profe2 creado aquí basta con cerrar sesión con el usuario actual y poner las credenciales de dicho usuario:

Imagen de login de profe2

Y la comprobación desde dentro de la sesión:

Sesión de profe2