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 ldapserverSe procede a la instalación de las herramientas necesarias:
sudo apt install ldap-utils slapdEn 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ámetro | Valor |
|---|---|
| Nombre DNS | inaki.local |
| Nombre de entidad | inaki |
| 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.ldifUnidades Organizativas y usuarios
Una vez asegurado que el servicio está corriendo:
sudo systemctl status slapdEl 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: alumnosPara añadir estas OUs (unidades organizativas):
ldapadd -x -D "cn=admin,dc=inaki,dc=local" -W -f unidades_organizativas.ldifAñ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/rJDesDbG9Jm8py7iJXsfv8Y se añaden los usuarios del archivo de la siguiente manera:
ldapadd -x -D "cn=admin,dc=inaki,dc=local" -W -f usuarios.ldifVer 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)" dnVer 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)" uidModificar 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: 123456789Una vez terminado, para aplicar los cambios, se ejecuta el siguiente comando:
ldapmodify -x -D "cn=admin,dc=inaki,dc=local" -W -f modificar_alumno.ldifEliminar 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:
| objectClass | MUST | MAY |
|---|---|---|
| organizationalUnit | ou | description,seeAlso |
| inetOrgPerson | cn,sn | uid,mail,telephoneNumber,title |
| posixAccount | uid,uidNumber,gidNumer, homeDirectory, loginShell | gecos,description,shadowLastChange |
| organizationalRole | cn | description,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.ldifDentro, 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: alumnoY para aplicar los cambios del usuario alumno1:
ldapmodify -x -D "cn=admin,dc=inaki,dc=local" -W -f alumno1_modify.ldifAñ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.ldifY lo adapto para que sirva para crear un usuario llamado profe2 y alumno3.
No hay que olvidar cambiar el
uidNumberde 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.ldifConsultas
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: 3Modificar 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: 1Y para aplicar los cambios:
ldapmodify -x -D "cn=admin,dc=inaki,dc=local" -W -f modificar_valor_rdn.ldifSi 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 SuccessPero 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: 1Modifar 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: 1Y 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=localY se aplican los cambios:
ldapmodify -x -D "cn=admin,dc=inaki,dc=local" -W -f mover_a_profesores.ldifAutenticació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 nscdEn 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-sssPor ú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 = trueOtorgando 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/bashAutenticació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
profe1Para 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
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:

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