Configurar un servidor y un cliente de LDAP en Linux CentOS 7

El servicio de LDAP se utiliza mucho en los sistemas Linux como base de datos centralizadora de usuarios. De esta manera, cuando hay que gestionar muchos usuarios, por ejemplo, los de toda una compañía, no hace falta crearlos en cada uno de los servidores, si no que únicamente se crean en el servidor de LDAP y cada sistema Linux cliente, se conecta al servidor para permitir o no el acceso al sistema.

Por lo tanto, se puede decir que LDAP es una base de datos de usuarios con una serie de atributos ordenados lógicamente. Mejor os dejo el enlace de la Wikipedia donde lo explica muy bien. En el siguiente tutorial vamos a ver cómo configurar LDAP.

Configuración del servidor de LDAP

Voy a instalar el servidor de LDAP en un Linux CentOS 7.5. Lo primero que haremos, será instalar el software con el comando:

yum -y install openldap openldap-clients openldap-servers nss-pam-ldapd authconfig authconfig-gtk migrationtools

Generamos una contraseña LDAP para el usuario root.

[root@Centos7 ~]# slappasswd
New password:
Re-enter new password:
{SSHA}WafqlarNUYNbabKveFBkTrtKHEOlgQVu
[root@Centos7 ~]#

El texto que aparece lo tendremos que añadir más tarde en el fichero /etc/openldap/slapd.conf.

Copiamos los ficheros de configuración de LDAP por defecto a un directorio personalizado

[root@Centos7 ~]# mkdir /var/lib/ldap/ldapdavtst
[root@Centos7 ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/ldapdavtst/DB_CONFIG
[root@Centos7 ~]# chown -R ldap:ldap /var/lib/ldap

Permitimos la autentificación de usuarios por LDAP

[root@Centos7 ~]# grep ldap /etc/nsswitch.conf
passwd: files sss ldap
shadow: files sss ldap
group: files sss ldap
[root@Centos7 ~]#

Desactivamos la configuración de LDAP por defecto

[root@Centos7 ~]# mv /etc/openldap/slapd.d /etc/openldap/slapd.original
[root@Centos7 ~]#

Creamos el fichero de configuración del servidor de LDAP

[root@Centos7 ~]# cat /etc/openldap/slapd.conf
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/pmi.schema

# Allow connections from Openldap 2.x clients
allow bind_v2

database monitor
database bdb

# Process ID file
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args

# LDAP domain name
suffix «dc=ldapdavtst,dc=com»

# The rootdn entry is the Distinguished Name (DN) for a user who is unrestricted by access controls or administrative limit parameters set for operations on the LDAP directory.
rootdn «cn=root,dc=ldapdavtst,dc=com»

# Root password generated by command slappasswd
rootpw {SSHA}WafqlarNUYNbabKveFBkTrtKHEOlgQVu

# Logs
#loglevel -1

directory /var/lib/ldap/ldapdavtst

# Indices a mantener para esta base de datos
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber,loginShell eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
[root@Centos7 ~]#

Arrancamos el servidor de LDAP

[root@Centos7 ~]# systemctl start slapd
[root@Centos7 ~]# systemctl status slapd
● slapd.service – OpenLDAP Server Daemon
Loaded: loaded (/usr/lib/systemd/system/slapd.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2018-11-26 10:38:21 CET; 4s ago
Docs: man:slapd
man:slapd-config
man:slapd-hdb
man:slapd-mdb
file:///usr/share/doc/openldap-servers/guide.html
Process: 3571 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
Process: 3555 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
Main PID: 3573 (slapd)
Tasks: 2
Memory: 31.0M
CGroup: /system.slice/slapd.service
└─3573 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///

Nov 26 10:38:20 Centos7 systemd[1]: Starting OpenLDAP Server Daemon…
Nov 26 10:38:20 Centos7 check-config.sh[3555]: Configuration directory ‘/etc/openldap/slapd.d’ does not exist.
Nov 26 10:38:20 Centos7 check-config.sh[3555]: Warning: Usage of a configuration file is obsolete!
Nov 26 10:38:20 Centos7 runuser[3561]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
Nov 26 10:38:21 Centos7 runuser[3561]: pam_unix(runuser:session): session closed for user ldap
Nov 26 10:38:21 Centos7 slapd[3571]: @(#) $OpenLDAP: slapd 2.4.44 (May 16 2018 09:55:53) $
mockbuild@c1bm.rdu2.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/…rs/slapd
Nov 26 10:38:21 Centos7 slapd[3573]: slapd starting
Nov 26 10:38:21 Centos7 systemd[1]: Started OpenLDAP Server Daemon.
Hint: Some lines were ellipsized, use -l to show in full.
[root@Centos7 ~]#

Damos de alta un usuario en el servidor de LDAP

Creamos un fichero LDIF con la estructura de datos lógica que entiende LDAP

[root@Centos7 ~]# grep -v «#» personas.ldif |grep -v ^$
dn: cn=ldapuser2,ou=Personal,dc=ldapdavtst,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
cn: ldapuser2
sn: ldapuser2
uid: ldapuser2
userpassword: passwdtst
mail: ldapuser2@ldapserver
description: Es un tio muy majo
loginShell: /bin/bash
uidNumber: 1002
gidNumber: 1002
homeDirectory: /home/ldapuser2
[root@Centos7 ~]#

Añadimos el usuario

ldapadd -x -w ContraseñaDeLDAP -D «cn=root,dc=ldapdavtst,dc=com» -f personas.ldif

Comprobamos que se ha registrado correctamente:

[root@Centos7 ~]# ldapsearch -x -b ‘cn=ldapuser2,ou=Personal,dc=ldapdavtst,dc=com’ ‘(objectclass=*)’
# extended LDIF
#
# LDAPv3
# base <cn=ldapuser2,ou=Personal,dc=ldapdavtst,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# ldapuser2, Personal, ldapdavtst.com
dn: cn=ldapuser2,ou=Personal,dc=ldapdavtst,dc=com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
cn: ldapuser2
sn: ldapuser2
uid: ldapuser2
userPassword:: cGFzc3dkdHN0
mail: ldapuser2@ldapserver
description: Es un tio muy majo
loginShell: /bin/bash
uidNumber: 1002
gidNumber: 1002
homeDirectory: /home/ldapuser2

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
[root@Centos7 ~]#

Configuración del cliente de LDAP

Ahora queremos que en cualquier servidor Linux podamos autentificarnos con los usuarios que están dados de alta en el servidor de LDAP. Igual que en el punto anterior, lo primero que tenemos que hacer es instalar el software. De nuevo, utilizo Linux CentOS 7.5.

yum -y install authconfig openldap-clients nss-pam-ldapd

Permitimos la autentificación de usuarios con el servidor de LDAP

[root@Centos7v2 etc]# authconfig –enableldap –enableldapauth –ldapserver=ldap://ldapserver:389/ –ldapbasedn=»ou=Personal,dc=ldapdavtst,dc=com» –enablecache –disablefingerprint –kickstart
[root@Centos7v2 etc]#

Configuramos el fichero /etc/nsswitch.conf permitiendo LDAP

[root@Centos7v2 ~]# grep ldap /etc/nsswitch.conf
passwd: files sss ldap
shadow: files sss ldap
group: files sss ldap
netgroup: files sss ldap
automount: files ldap
[root@Centos7v2 ~]#

Habilitamos el servicio local LDAP name service daemon

systemctl enable nscd
systemctl start nscd
systemctl enable autofs
systemctl start autofs

Comprobamos que desde el cliente de LDAP ya podemos obtener información del usuario dado de alta en el servidor de LDAP:

[root@Centos7v2 ~]# getent passwd ldapuser2
ldapuser2:*:1002:1002:ldapuser2:/home/ldapuser2:/bin/bash
[root@Centos7v2 ~]#

Y, además, podemos hacer login:

[root@Centos7v2 ~]# su – ldapuser2
Creating home directory for ldapuser2.
/usr/bin/id: cannot find name for group ID 1002
[ldapuser2@Centos7v2 ~]$ pwd
/home/ldapuser2
[ldapuser2@Centos7v2 ~]$

Si queremos que el directorio HOME del usuario sea un filesystem NFS, configuraremos el servicio autofs de la siguiente manera:

[root@Centos7v2 ~]# vim /etc/auto.master
/home /etc/auto.misc
[root@Centos7v2 ~]# vim /etc/auto.misc
* -fstype=nfs,rw,nosuid,soft ldapserver:/home/&
[root@Centos7v2 ~]# systemctl restart autofs
[root@Centos7v2 ~]# systemctl enable autofs
ln -s ‘ /usr/lib/systemd/system/autofs.service’ ‘ /etc/systemd/system/multi-user.target.wants/autofs.service’
[root@Centos7v2 ~]# su – ldapuser2
Last login: Sun May 15 04:34:03 IST 2016 on pts/1
[root@Centos7v2 ~]#

En los parámetros de NFS del cliente es una buena práctica añadir noatime, ya que con que se actualice en el nodo en el servidor de NFS es suficiente. No hace falta que el cliente pierda el tiempo haciendo lo mismo. De esta manera, mejoraremos algo el rendimiento.

Corrupción de la base de datos de LDAP

He tenido una incidencia con un servidor de VMWare que ha provocado que uno de los servidores se parara de manera abrupta y luego el servicio de LDAP no podía arrancar debido a que se había corrompido su base de datos interna, dando el siguiente error:

[root@LSICASX2 ldap]# service ldap start
Checking configuration files for slapd:  bdb_db_open: unclean shutdown detected; attempting recovery.
bdb_db_open: Recovery skipped in read-only mode. Run manual recovery if errors are encountered.
bdb(dc=forja,dc=ctti,dc=local): PANIC: fatal region error detected; run recovery
bdb_db_open: Database cannot be opened, err -30974. Restore from backup!
bdb(dc=forja,dc=ctti,dc=local): DB_ENV->lock_id_free interface requires an environment configured for the locking subsystem
backend_startup_one: bi_db_open failed! (-30974)
slap_startup failed (test would succeed using the -u switch)
                                                           [FAILED]
stale lock files may be present in /aqd/app/ldap           [WARNING]
[root@LSICASX2 ldap]#

Recuperar la base de datos de LDAP

Para recuperar la base de datos de LDAP, simplemente hay que ejecutar el comando slapd_db_recover de la siguiente manera:

[root@LSICASX2 ldap]# /usr/sbin/slapd_db_recover -v -h /aqd/app/ldap
Finding last valid log LSN: file: 209 offset 1040918
Recovery starting from [169][3058228]
Recovery complete at Fri Mar 22 10:21:10 2019
Maximum transaction ID 8344ce5d Recovery checkpoint [209][1041971]
[root@LSICASX2 ldap]# 

Una vez finalizado el proceso, ya podemos arrancar el servicio de LDAP con normalidad:

[root@LSICASX2 ldap]# service ldap start
Checking configuration files for slapd:  bdb_db_open: unclean shutdown detected; attempting recovery.
bdb_db_open: Recovery skipped in read-only mode. Run manual recovery if errors are encountered.
config file testing succeeded
                                                           [  OK  ]
Starting slapd:                                            [  OK  ]
[root@LSICASX2 ldap]#

Esto me ocurrió en un servidor bastante antiguo con Linux RedHat 5.2.

Summary
Article Name
Configurar un servidor y un cliente de LDAP en Linux CentOS 7
Description
1 Configuración del servidor de LDAP 1.1 Generamos una contraseña LDAP para el usuario root. 1.2 Copiamos los ficheros de configuración de LDAP por defecto a un directorio personalizado 1.3 Permitimos la autentificación de usuarios por LDAP 1.4 Desactivamos la configuración de LDAP por defecto 1.5 Creamos el fichero de configuración del servidor de LDAP 1.6 Arrancamos el servidor de LDAP 2 Damos de alta un usuario en el servidor de LDAP 2.1 Creamos un fichero LDIF con la estructura de datos lógica que entiende LDAP 2.2 Añadimos el usuario 3 Configuración del cliente de LDAP 3.1 Permitimos la autentificación de usuarios con el servidor de LDAP 3.2 Configuramos el fichero /etc/nsswitch.conf permitiendo LDAP 3.3 Habilitamos el servicio local LDAP name service daemon

Deja un comentario