Renuncia de responsabilidad: Este documento está aún en desarrollo y no debería ser condiderado todavía cómo oficial. |
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:
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.
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.
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
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.
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.
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.
El contenido de este documento está registrado bajo los términos de la licencia Creative Commons - Reconocimiento / Compartir Igual