Gentoo Logo

Renuncia de responsabilidad: Este documento está aún en desarrollo y no debería ser condiderado todavía cómo oficial.


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 usted 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 usted 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. Usted 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ñ
{SSHA}EzP6I82DZRnW+ou6lyiXHGxSpSOw2XO4

Now edit the LDAP Server config at /etc/openldap/slapd.conf: Ahora edite la configuración del Servidor LDAP en /etc/openldap/slapd.conf:

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

# Incluya los esquemas de datos necesarios debajo de core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema

# Descomente el modulepath y el módulo hdb
modulepath    /usr/lib/openldap/openldap
# moduleload    back_shell.so
# moduleload    back_relay.so
# moduleload    back_perl.so
# moduleload    back_passwd.so
# moduleload    back_null.so
# moduleload    back_monitor.so
# moduleload    back_meta.so
moduleload    back_hdb.so
# moduleload    back_dnssrv.so

# Descomente las restricciones de acceso de ejemplo (Nota:
¡mantenga la indentación!)

access to dn.base="" by * read
access to dn.base="cn=Subschema" by * read
access to *
   by self write
   by users read
   by anonymous auth

# Definición de la base de datos BDB

database        hdb
suffix          "dc=genfic,dc=com"
checkpoint      32      30 # <kbyte> <min>
rootdn          "cn=Manager,dc=genfic,dc=com"
rootpw          {SSHA}EzP6I82DZRnW+ou6lyiXHGxSpSOw2XO4
directory       /var/lib/openldap-ldbm
index           objectClass     eq

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://auth.genfic.com:389/
TLS_REQCERT  allow

Ahora edite /etc/conf.d/slapd y añada lo siguiente, comentando la línea existente:

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

# Nota: no usamos cn=config aquí, por tanto quédese con
esta línea:
OPTS="-h 'ldap:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"

Inicie slapd:

Listado de Código 2.6: Iniciar SLAPd

# /etc/init.d/slapd start

Puede probarlo con la siguiente instrucción:

Listado de Código 2.7: 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.  Configuración del cliente

Migrar los datos existentes a ldap

Go to http://www.padl.com/OSS/MigrationTools.html y busque los guiones allí. La configuración está establecida en la página. Nosotros ya no los proporcionamos porque los guiones son un potencial agujero de seguridad si los deja en el sistema después de haberlos trasladado. Cuando haya acabado de migrar los datos, continue en la sección siguiente.

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 3.1: 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 3.2: /etc/pam.d/system-auth

# Nota: Sólo 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 3.3: /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

uri ldap://auth.genfic.com/
pam_password exop

ldap_version 3
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
nss_base_passwd ou=People,dc=genfic,dc=com
nss_base_shadow ou=People,dc=genfic,dc=com
nss_base_group  ou=Group,dc=genfic,dc=com
nss_base_hosts  ou=Hosts,dc=genfic,dc=com

scope one

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 3.4: 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 3.5: /etc/nsswitch.conf

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

Para probar los cambios, escriba:

Listado de Código 3.6: Prueba de la autorización con LDAP

# getent passwd|grep 0:0
(Debería devolver dos entradas:)
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash

Si observa, una de las lineas copiadas en su /etc/ldap.conf está comentada (the rootbinddn line): 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 yo hago es mantener el fichero vacío y cuando necesito cambiar cualquier contraseña que está tanto en ldap como en /etc/passwd escribo la contraseña en él durante 10 segundos mientras hago los cambios y la borro cuando he acabado.

4.  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 4.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 4.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=root,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.

5.  Trabajando con OpenLDAP

Manteniendo el directorio

Puede empezar utilizando el directorio para autentificar usuarios en apache/proftpd/qmail/samba. Puede administrarlo con Webmin, que proporciona una interfaz de administración sencilla. Puede también usar phpldapadmin, luma, diradm, jxplorer o lat.

6.  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

Actualizado 11 de noviembre, 2008

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
Editor

Brandon Hale
Editor

Benny Chuang
Editor

Markus Ullmann
Editor

John Christian Stoddart
Traductor

José Luis Rivero
Traductor

Carles Ferrer Peris
Traductor

Donate to support our development efforts.

Support OSL
Gentoo Centric Hosting: vr.org
Tek Alchemy
SevenL.net
Global Netoptex Inc.
Bytemark
Online Kredit Index
Copyright 2001-2009 Gentoo Foundation, Inc. Questions, Comments? Contact us.