LDAP (OpenLDAP): instalación y configuración (I)

LDAP (OpenLDAP): instalación y configuración (I):
LDAP son las siglas de Lightweight Directory Access Protocol (en español Protocolo Ligero de Acceso a Directorios) que hacen referencia a un protocolo a nivel de aplicación el cual permite el acceso a un servicio de directorio ordenado y distribuido para buscar diversa información en un entorno de red. LDAP también es considerado una base de datos (aunque su sistema de almacenamiento puede ser diferente) a la que pueden realizarse consultas.

OpenLDAPLlevaba tiempo queriendo probar LDAP y finalmente me he decidido, sobre todo por el hecho de utilizarlo para autenticación y gestión de usuarios de forma centralizada. Pese a no poder ponerlo en práctica de momento a gran escala, me conformo con hacer alguna que otra prueba con pequeños entornos virtuales.

En esta entrada voy a tratar de momento lo más básico de OpenLDAP. Sobre todo no voy a entrar prácticamente en todo lo relacionado con creación “manual” de arboles de directorios pues de momento no domino al 100% la estructuración de objetos y demás, vamos a usar los scripts que ofrece OpenLDAP para migración e importación de objetos.

Instalación de OpenLDAP


La instalación de OpenLDAP (implementación Open Source de LDAP) la vamos a hacer a través de YUM (RHEL, CentOS, Fedora…), en Debian o similar podéis hacerlo por APT, no tiene mayor complicación.

# yum install -y openldap openldap-servers openldap-clients

Configuración inicial/básica de OpenLDAP


La configuración básica que tenemos que revisar una vez instalado se encuentra en el fichero de configuración slapd.conf. Lo primero que especificamos es la definición de una base de datos o directorio en la que almacenaremos toda la información (bdb en este caso), la información/sufijo del dominio (ldap-db.com en nuestro caso) y el DN que tendrá acceso total (root, Manager o como queráis llamarlo) sin restricciones a la información (rootdn).

A tener en cuenta respecto al suffix, que en este caso es ldap-db.com es que al especificarlo se separa el nombre del dominio (ldap-db) y su TLD (com). Se pueden especificar varios pero es necesario mínimo uno para cada base de datos:

# vim /etc/openldap/slapd.conf

database          bdb
suffix          "dc=ldap-db,dc=com"
rootdn          "cn=gestion,dc=ldap-db,dc=com"
rootpw          {SSHA}6SPjVCdtjv2aC3O+pvddSiFkdKGEAa3sH

La string que véis en rootpw es la clave del usuario de gestión (rootdn), la hemos generado con el comando slappaswd:

# slappasswd
New password:
Re-enter new password:
{SSHA}6SPjVCdtjv2aC3O+pvddSiFkdKGEAa3sH

Ya podemos arrancar el servidor ldap, también lo configuramos para que arranque de forma automática tras reinicios:

# /etc/init.d/ldap start
Checking configuration files for slapd:  config file testing succeeded
[  OK  ]
Starting slapd:                                            [  OK  ]

# chkconfig ldap on

Cómo insertar o importar registros en la base de datos LDAP


Ahora mismo ya tenemos inicializada nuestra base de datos bdb, pero no hay ningún dato en ella. Todo lo relacionado con la arquitectura y estructuración de la base de datos es un tema muy extenso y complejo, así que os emplazo a la documentación en www.openldap.org para familiarizaros con ella. Lo que vamos a hacer en este caso es exportar los usuarios y grupos de sistema (junto con sus claves) a formato ldif para tenerlos dentro del directorio LDAP y poder usar la autenticación a través de él. Para ello utilizamos los scripts en perl que nos ofrece el propio OpenLDAP. Se encuentran en:

/usr/share/openldap/migration

Estos scripts permiten migrar al formato ldif toda la información del sistema. Lo primero que hacemos es configurar unas variables en el script migrate_common.ph:

$DEFAULT_MAIL_DOMAIN = "ldap-db.com";
$DEFAULT_BASE = "dc=ldap-db,dc=com";
# Las siguientes variables es por si queremos evitar
# la exportación de usuarios y grupos de sistema que
# no interesan...
$IGNORE_UID_BELOW = 1000;
$IGNORE_GID_BELOW = 100;
$IGNORE_UID_ABOVE = 9999;
$IGNORE_GID_ABOVE = 9999;

Después importamos la base de la configuración:

# /usr/share/openldap/migration/migrate_base.pl > base.ldif
# ldapadd -x -W -D 'cn=gestion, dc=ldap-db, dc=com' -h 127.0.0.1 -f base.ldif
Enter LDAP Password:
adding new entry "dc=ldap-db,dc=com"
adding new entry "ou=Hosts,dc=ldap-db,dc=com"
adding new entry "ou=Rpc,dc=ldap-db,dc=com"
adding new entry "ou=Services,dc=ldap-db,dc=com"
adding new entry "nisMapName=netgroup.byuser,dc=ldap-db,dc=com"
adding new entry "ou=Mounts,dc=ldap-db,dc=com"
adding new entry "ou=Networks,dc=ldap-db,dc=com"
adding new entry "ou=People,dc=ldap-db,dc=com"
adding new entry "ou=Group,dc=ldap-db,dc=com"
adding new entry "ou=Netgroup,dc=ldap-db,dc=com"
adding new entry "ou=Protocols,dc=ldap-db,dc=com"
adding new entry "ou=Aliases,dc=ldap-db,dc=com"
adding new entry "nisMapName=netgroup.byhost,dc=ldap-db,dc=com"

Después podemos ya hacer lo mismo para los usuarios y grupos del sistema, de esta forma ya tendremos los objetos base de la base de datos/árbol LDAP y todos los usuarios y grupos del sistema:

# /usr/share/openldap/migration/migrate_group.pl /etc/group /tmp/group.ldif
# /usr/share/openldap/migration/migrate_passwd.pl /etc/passwd /tmp/passwd.ldif

E importamos al árbol LDAP:

# ldapadd -x -W -D 'cn=gestion, dc=ldap-db, dc=com' -h 127.0.0.1 -f passwd.ldif
Enter LDAP Password:
adding new entry "uid=root,ou=People,dc=ldap-db,dc=com"
adding new entry "uid=bin,ou=People,dc=ldap-db,dc=com"
adding new entry "uid=daemon,ou=People,dc=ldap-db,dc=com"
adding new entry "uid=adm,ou=People,dc=ldap-db,dc=com"
adding new entry "uid=lp,ou=People,dc=ldap-db,dc=com"
adding new entry "uid=sync,ou=People,dc=ldap-db,dc=com"
adding new entry "uid=shutdown,ou=People,dc=ldap-db,dc=com"
...
...
...

# ldapadd -x -W -D 'cn=gestion, dc=ldap-db, dc=com' -h 127.0.0.1 -f group.ldif
Enter LDAP Password:
adding new entry "cn=root,ou=Group,dc=ldap-db,dc=com"
adding new entry "cn=bin,ou=Group,dc=ldap-db,dc=com"
adding new entry "cn=daemon,ou=Group,dc=ldap-db,dc=com"
adding new entry "cn=sys,ou=Group,dc=ldap-db,dc=com"
adding new entry "cn=adm,ou=Group,dc=ldap-db,dc=com"
adding new entry "cn=uucp,ou=Group,dc=ldap-db,dc=com"
adding new entry "cn=man,ou=Group,dc=ldap-db,dc=com"
...
...
...
...

Y si ahora lanzamos una consulta contra LDAP veremos estas entradas reflejadas:

# ldapsearch -x -b 'dc=ldap-db,dc=com' '(objectclass=*)'
# extended LDIF
#
# LDAPv3
# base  with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# ldap-db.com
dn: dc=ldap-db,dc=com
...
...

Configurar el sistema para autenticar contra LDAP


Una vez configurado OpenLDAP podemos hacer lo propio con el sistema para que utilice su directorio de forma activa. En este caso utilizando la autenticación en el sistema de usuarios a través de LDAP.

Tenemos que modificar el fichero /etc/nsswitch.conf e indicarle que la autenticación a través de passwd/shadow/group también se puede hacer vía LDAP:

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

Luego modificamos el fichero /etc/ldap.conf indicando:

URI ldap://<IP_SERVIDOR_LDAP_O_FQDN:389/
base dc=ldap-db,dc=com

Bien, ahora usando el comando getent podemos verificar si está cogiendo los datos vía LDAP, si salen los usuarios dos veces es que lo coge bien (una por passwd y otra por LDAP):

# getent passwd | grep alex
alex:x:27:27:Alex Garcia:/var/lib/mysql:/bin/bash
alex:x:27:27:Alex Garcia:/var/lib/mysql:/bin/bash

Si ahora borraramos el usuario “alex” del passwd y shadow (visudo, vipw y vigr: editando ficheros críticos en Linux de forma segura), aparecería sólo una vez, pero podríamos seguir haciendo login con el usuario, porque lo coge de LDAP. Guardar un backup antes de los ficheros que modifiquéis:

# getent passwd | grep alex
alex:x:27:27:Alex Garcia:/var/lib/mysql:/bin/bash

Activar log de LDAP


Vamos a activar el logging de LDAP para verificar que todo funciona OK. Para ello añadimos la siguiente línea al fichero /etc/openldap/slapd.conf:

loglevel 128

Luego a nivel de syslog, en el fichero /etc/syslog.conf:

local4.*                  /var/log/ldap.log

Y reiniciamos:

# /etc/init.d/syslog restart && /etc/init.d/ldap restart

Volviendo a la prueba de antes, si la hacéis de nuevo y hacéis login con un usuario veréis que autentica vía LDAP en el log:

Aug 31 01:19:16 cluster02 slapd[2312]: => access_allowed: search access to "uid=alex,ou=People,dc=ldap-db,dc=com" "objectClass" requested
Aug 31 01:19:16 cluster02 slapd[2312]: => access_allowed: backend default search access granted to "(anonymous)"
Aug 31 01:19:16 cluster02 slapd[2312]: => access_allowed: search access to "uid=alex,ou=People,dc=ldap-db,dc=com" "uid" requested
Aug 31 01:19:16 cluster02 slapd[2312]: => access_allowed: backend default search access granted to "(anonymous)"
Aug 31 01:19:16 cluster02 slapd[2312]: => access_allowed: read access to "uid=alex,ou=People,dc=ldap-db,dc=com" "entry" requested


En próximas entradas veremos entre otras cosas como por ejemplo configurar ssh para que use también la autenticación LDAP, añadir y borrar registros, tareas de mantenimiento en el árbol de directorios, etc.

También te puede interesar:

Comentarios

Entradas populares de este blog

Buscar la sesión por PID y ver la query SQL en Oracle

Como mover un indice de tipo LOB a un tablespace diferente

Eliminar procesos MySQL que están en estado SLEEP por determinado tiempo