Gentoo Logo

Guía Gentoo para la autenticación con OpenLDAP

Contenido:

1.  Empezando con OpenLDAP

¿Qué es LDAP?

LDAP significa Lightweight Directory Access Protocol (Protocolo Ligero de Acceso a Directorios). Basado en X.500, abarca muchas de sus funciones principales, pero carece de las funciones más esotéricas de X.500. Pero, ¿qué es este X.500 y por qué hay un LDAP?

X.500 es un modelo de Servicio de Directorio basado en el concepto OSI (interconexión de sistemas abiertos). Contiene definiciones de espacios de nombres y los protocolos para preguntar y actualizar el directorio. Sin embargo, X.500 ha sido creado para ser excesivamente estricto en algunas situaciones. Entrando en LDAP, al igual que X.500, proporciona un modelo de datos/espacio de nombres para el directorio y el protocolo. No obstante, LDAP está diseñado para ejecutarse directamente sobre la pila TCP/IP. Vea a LDAP como una versión ligera de X.500.

No lo entiendo. ¿Qué es un directorio?

Un directorio es una base de datos especializada diseñada para frecuentes consultas pero para infrecuentes actualizaciones. A diferencia de las bases de datos generalistas, no contiene soporte para transacciones o funcionalidad de vuelta atrás ("roll-back"). Los directorios son fácilmente replicados para incrementar disponibilidad y fiabilidad. Cuando los directorios son replicados, se permiten inconsistencias temporales con tal de que acaben siendo finalmente sincronizadas.

¿Cómo está estructurada la información?

Toda la información dentro de un directorio está estructurada jerárquicamente. Aún más, si intenta introducir datos en el directorio, el directorio debe conocer cómo almacenar estos datos en un árbol. Eche un vistazo a la compañía de ficción y a su organigrama:

Listado de Código 1.1: Estructura organizativa de GenFic, una empresa Gentoo Ficticia

dc:         com
             |
dc:        genfic (Organización)
          /      \
ou:  Personas servidores(Unidades organizativas)
      /    \     ..
uid: ..   John    (Datos específicos de las UO)

Puesto que no puede alimentar la base de datos con este tipo de "ascii-art", cada nodo de tal árbol debe ser definido. Para nombrar tales nodos, LDAP usa un sistema de definición de nombres. La mayor parte de distribuciones de LDAP (incluyendo OpenLDAP) ya contienen un buen número de esquemas predefinidos (y comúnmente aprobados), como el "inetorgperson", frecuentemente utilizado para definir usuarios.

Animamos a las personas interesadas a leer la Guía de Administración OpenLDAP.

Pero ... ¿para qué se utiliza?

LDAP puede ser utilizado con varios propósitos. En este documento se trata la administración centralizada de usuarios, manteniendo todas las cuentas de usuario en una única ubicación LDAP (lo que no significa que esté albergada en un único servidor, puesto que LDAP soporta alta disponibilidad y redundancia), y sin embargo LDAP puede utilizarse igualmente para otros fines:

  • Infraestructura de clave pública
  • Calendario compartido
  • Libreta de direcciones compartida
  • Almacenamiento para DHCP, DNS, ...
  • Directivas de configuración para las clases del sistema (guardando registro de las configuraciones de varios servidores)
  • ...

2.  Configurando OpenLDAP

Configuración inicial

Nota: En este documento utilizamos la dirección genfic.com como ejemplo. Deberá, desde luego, cambiarlo. Sin embargo, asegúrese que el nodo superior es un dominio oficial de primer nivel (net, com, cc, be, ...).

Primero instale OpenLDAP:

Listado de Código 2.1: Instalación de OpenLDAP

# emerge openldap

Ahora cree una contraseña que usará después:

Listado de Código 2.2: Generar una contraseña

# slappasswd
New password: mi-contraseña
Re-enter new password: mi-contraseña
{SSHA}EzP6I82DZRnW+ou6lyiXHGxSpSOw2XO4

Ahora edite la configuración del Servidor LDAP en /etc/openldap/slapd.conf. Abajo mostramos un ejemplo de fichero de configuración con el que se puede comenzar. Para un análisis más detallado del fichero de configuración, le sugerimos que trabaje con la guía del administrador de OpenLDAP.

Listado de Código 2.3: /etc/openldap/slapd.conf

include        /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include        /etc/openldap/schema/misc.schema

pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args

# Elimine el comentario de las restricciones simples de acceso (Nota: ¡respete la indentación!)
serverID 0 Utilizado en el caso de replicación
loglevel 0

## Controles de acceso
access to dn.base="" by * read
access to dn.base="cn=Subschema" by * read
access to *
  by self write
  by users read
  by anonymous read

## Definición de la base de datos
database hdb
suffix "dc=genfic,dc=com"
checkpoint 32 30
rootdn "cn=Manager,dc=genfic,dc=com"
rootpw "{SSHA}EzP6I82DZRnW+ou6lyiXHGxSpSOw2XO4" # Mire el comando slappasswd previo
directory "/var/lib/openldap-ldbm"
index objectClass eq

## Sincronización (tomar de otro servidor LDAP)
syncrepl rid=000
  provider=ldap://ldap2.genfic.com
  type=refreshAndPersist
  retry="5 5 300 +"
  searchbase="dc=genfic,dc=com"
  attrs="*,+"
  bindmethod="simple"
  binddn="cn=ldapreader,dc=genfic,dc=com"
  credentials="ldapsyncpass"

index entryCSN eq
index entryUUID eq

mirrormode TRUE

overlay syncprov
syncprov-checkpoint 100 10

Luego edite el fichero de configuración del cliente LDAP:

Listado de Código 2.4: /etc/openldap/ldap.conf

# nano -w /etc/openldap/ldap.conf
  (Añada lo siguiente ...)

BASE         dc=genfic, dc=com
URI          ldap://ldap.genfic.com:389/ ldap://ldap1.genfic.com:389/ ldap://ldap2.genfic.com:389/
TLS_REQCERT  allow
TIMELIMIT    2

Ahora edite /etc/conf.d/slapd y ajuste la siguiente línea OPTS:

Listado de Código 2.5: /etc/conf.d/slapd

OPTS="-h 'ldaps:// ldap:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"

Finalmente, cree la estructura /var/lib/openldap-ldbm:

Listado de Código 2.6: Preparar la localización openldap-ldbm

~# mkdir -p /var/lib/openldap-ldbm
~# chown ldap:ldap /var/lib/openldap-ldbm
~# chmod 700 /var/lib/openldap-ldbm

Inicie slapd:

Listado de Código 2.7: Iniciar SLAPd

# /etc/init.d/slapd start

Puede probarlo con la siguiente instrucción:

Listado de Código 2.8: Prueba del servicio SLAPd

# ldapsearch -x -D "cn=Manager,dc=genfic,dc=com" -W

Si recibe un error, pruebe a añadir -d 255 para incrementar el nivel de detalle de los avisos y poder resolver el problema que pueda tener.

3.  Replicación

Si necesita alta disponibilidad

Si su entorno requiere alta disponibilidad, entonces necesitará configurar la replicación de los cambios a través de múltiples sistemas LDAP. La replicación dentro de OpenLDAP, en esta guía, se configura utilizando una cuenta especial de replicación (ldapreader) la cual posee privilegios de lectura en el servidor LDAP primario y que toma los cambios relizados en este servidor LDAP primario al secundario.

Esta configuración es entonces copiada, permitiendo al servidor LDAP secundario actuar igual que el primario. Gracias a la estructura interna de OpenLDAP, los cambios no se aplican de nuevo si ya están en la estructura LDAP.

Configurando la replicación

Para configurar la replicación, en primer lugar realice la configuración de un segundo servidor OpenLDAP, del mismo modo que se ha descrito arriba. Sin embargo, tenga cuidado de que, en el fichero de configuración:

  • el proveedor de la replicación sincronizada apunta al otro sistema, y
  • el serverID de cada sistema OpenLDAP es diferente.

A continuación, cree la cuenta de sincronización. Crearemos un fichero LDIF (el formato utilizado como entrada de datos para los servidores LDAP) y añádalo a cada servidor LDAP:

Listado de Código 3.1: Crear la cuenta ldapreader

~# slappasswd -s contraseñademilector
 {SSHA}XvbdAv6rdskp9HgFaFL9YhGkJH3HSkiM

~# cat ldapreader.ldif
dn: cn=ldapreader,dc=genfic,dc=com
userPassword: {SSHA}XvbdAv6rdskp9HgFaFL9YhGkJH3HSkiM
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: ldapreader
description: Lector LDAP utilizado para sincronización

~# ldapadd -x -W -D "cn=Manager,dc=genfic,dc=com" -f ldapreader.ldif
Password: introduzca la contraseña de administración

4.  Configuración del cliente

Migrar los datos existentes a ldap

Configurar OpenLDAP para su administración centralizada y la gestión de elementos Linux/Unix comunes, no es fácil. Gracias a algunas herramientas y guiones disponibles en Internet, la migración desde un punto de vista de un sistema de administración simple a un sistema centralizado y gestionado basado en OpenLDAP no es muy complicado.

Vaya a http://www.padl.com/OSS/MigrationTools.html y descargue los guiones que allí se encuentren. Necesitará las herramientas de migración y el guión make_master.sh.

A continuación, extraiga las herramientas y copie el guión make_master.sh dentro de la localización extraída:

Listado de Código 4.1: Extrar MigrationTools (Herramientas de migración)

~# mktemp -d
/tmp/tmp.zchomocO3Q
~# cd /tmp/tmp.zchomocO3Q
~# tar xvzf /path/to/MigrationTools.tgz
~# mv /camino/a/make_master.sh MigrationTools-47
~# cd MigrationTools-47

El siguiente paso ahora es migrar la información de su sistema a OpenLDAP. Esto se realiza con el guión make_master.sh después de proporcionarle la información relacionada con su estructura y entorno LDAP.

En el momento de escribir esta guía, las herramientas necesarias, requieren las siguientes entradas:

Entrada Descripción Ejemplo
LDAP BaseDN La localización base (raíz) de su árbol dc=genfic,dc=com
Mail domain Dominio utilizado en las direcciones de correo electrónico genfic.com
Mail host Nombre de dominio completamente cualificado (FQDN) de la infraestructura de su servidor de correo smtp.genfic.com
LDAP Root DN Información de la cuenta administrativa de su estructura LDAP cn=Manager,dc=genfic,dc=com
LDAP Root Password Contraseña de la cuenta administrativa, comparar con el comando slappasswd anterior

La herramienta también le preguntará qué cuentas y ajustes necesita migrar.

Configuración de PAM

En primer lugar, configuraremos PAM para permitir la autorización con LDAP. Instalemos sys-auth/pam_ldap ya que PAM soporta la autentificación LDAP, y sys-auth/nss_ldap porque nuestro sistema puede negociar con servidores LDAP para obtener información adicional (usado por nsswitch.conf).

Listado de Código 4.2: Instalar pam_ldap y nss_ldap

# emerge pam_ldap nss_ldap

Ahora añada las siguientes líneas en los lugares adecuados de /etc/pam.d/system-auth:

Listado de Código 4.3: /etc/pam.d/system-auth

# Nota: Solo añádalas. ¡No suprima cosas o su sistema podría no
volver a arrancar de nuevo!

auth    sufficient  pam_ldap.so use_first_pass
account    sufficient   pam_ldap.so
password   sufficient   pam_ldap.so use_authtok use_first_pass
session    optional     pam_ldap.so

# Fichero de ejemplo:
#%PAM-1.0

auth       required     pam_env.so
auth       sufficient   pam_unix.so try_first_pass likeauth nullok
auth       sufficient   pam_ldap.so use_first_pass
auth    required    pam_deny.so

account    sufficient   pam_ldap.so
account    required     pam_unix.so

password   required     pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 try_first_pass retry=3
password   sufficient   pam_unix.so try_first_pass use_authtok nullok md5 shadow
password   sufficient   pam_ldap.so use_authtok use_first_pass
password    required pam_deny.so

session required    pam_limits.so
session required    pam_unix.so
session    optional     pam_ldap.so

Ahora cambie /etc/ldap.conf para que tenga:

Listado de Código 4.4: /etc/ldap.conf

#host 127.0.0.1
#base dc=padl,dc=com

suffix          "dc=genfic,dc=com"
#rootbinddn uid=root,ou=People,dc=genfic,dc=com
bind_policy soft
bind_timelimit 2
ldap_version 3
nss_base_group ou=Group,dc=genfic,dc=com
nss_base_hosts ou=Hosts,dc=genfic,dc=com
nss_base_passwd ou=People,dc=genfic,dc=com
nss_base_shadow ou=People,dc=genfic,dc=com
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
pam_password exop
scope one
timelimit 2
uri ldap://ldap.genfic.com/ ldap://ldap1.genfic.com ldap://ldap2.genfic.com

Luego, copie el fichero (OpenLDAP) ldap.conf del servidor en el cliente para que éste tenga en cuenta el entorno LDAP:

Listado de Código 4.5: Copiar el OpenLDAP ldap.conf

(Sustituya ldap-server con el nombre de su servidor LDAP)
# scp ldap-server:/etc/openldap/ldap.conf /etc/openldap

Finalmente, configure sus clientes para que verifiquen en LDAP las cuentas de sistema:

Listado de Código 4.6: /etc/nsswitch.conf

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

Si observa, una de las lineas copiadas en su /etc/ldap.conf está comentada (la línea rootbinddn): no la necesita salvo que quiera cambiar la contraseña de un usuario como superusuario. En este caso, necesita escribir la contraseña de root en /etc/ldap.secret con texto en claro. Esto es PELIGROSO por lo que debería tener permisos "600". Lo que debe hacer es mantener el fichero vacío y cuando necesite cambiar cualquier contraseña que está tanto en ldap como en /etc/passwd escriba la contraseña en él durante 10 segundos mientras hace los cambios y bórrela cuando haya acabado.

5.  Seguridad del servidor LDAP

Permisos de OpenLDAP

Si echamos un vistazo a /etc/openldap/slapd.conf podrá ver que se pueden especificar ACLs (listas de control de acceso, o permisos, si lo prefiere) de qué datos pueden los usuarios leer y/o escribir:

Listado de Código 5.1: /etc/openldap/slapd.conf

access to *
  by dn="uid=root,ou=People,dc=genfic,dc=com" write
  by users read
  by anonymous auth

access to attrs=userPassword,gecos,description,loginShell
  by self write

Esto le da acceso a todo a lo que a un usuario le está permitido cambiar. Si es su información, entonces tiene acceso de escritura; si es la de otro usuario, entonces puede leerla; un usuario anónimo puede enviar un usuario/contraseña para ser conectado. Hay cuatro niveles, del menor al mayor: autorización búsqueda lectura escritura.

La siguiente ACL es un poco más segura puesto que impide a los usuarios normales leer la contraseña enmascarada de otros usuarios:

Listado de Código 5.2: /etc/openldap/slapd.conf

access to attrs="userPassword"
  by dn="uid=root,ou=People,dc=genfic,dc=com" write
  by dn="uid=John,ou=People,dc=genfic,dc=com" write
  by anonymous auth
  by self write
  by * none

access to *
  by dn="uid=John,ou=People,dc=genfic,dc=com" write
  by * search

Este ejemplo le da acceso a root y John para leer/escribir/buscar en todo el árbol por debajo de dc=genfic,dc=com. También permite a los usuarios cambiar su propia userPassword. Y en la sentencia final cualquier otro tiene la capacidad de búsqueda, lo que significa que puede introducir un filtro de búsqueda pero no puede leer los resultados de la búsqueda. Puede tener múltiples ACLs pero la regla de procesamiento es de abajo arriba, por lo que su nivel superior debe ser el más restrictivo.

6.  Trabajando con OpenLDAP

Manteniendo el directorio

Puede empezar utilizando el directorio para autentificar usuarios en apache/proftpd/qmail/samba. Puede administrarlo con phpldapadmin, diradm, jxplorer o lat, que proporcionan interfaces de administración sencillos.

7.  Agradecimientos

Quisiera agradecer a Matt Heler el préstamo de su equipo para poder realizar esta guía. Gracias también a toda la gente simpática de #ldap @ irc.freenode.net.



Imprimir

Página actualizada 15 de agosto, 2011

Sumario: Esta guía explica los aspectos básicos de LDAP y muestra cómo instalar OpenLDAP con la finalidad de conseguir la autenticación entre un grupo de máquinas Gentoo.

Benjamin Coles
Autor

Sven Vermeulen
Autor

Brandon Hale
Editor

Benny Chuang
Editor

Markus Ullmann
Editor

Joshua Saddler
Editor

John Christian Stoddart
Traductor

José Luis Rivero
Traductor

Carles Ferrer Peris
Traductor

José María Alonso
Traductor

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.