Making of a forge: LDAP (I)

Update: Desde que escribí esta entrada hemos estado moviéndonos para tratar de hacer más sencillo y fiable el proceso de instalación de la forja. En este sentido, el proyecto SidelabCode Stack es básicamente un programa Java que instala y configura todos los servicios necesarios. Puedes echar un vistazo al proyecto para ver cómo se hace. El código del proyecto es la documentación más actualizada que tenemos sobre este proceso, y actualmente está siendo mejorado. La versión actual de SidelabCode fue instalada completamente con SidelabCode Stack.

Como comentamos en esta entrada, vamos a instalar una forja propia en sidelab. Tenemos un servidor y de momento vamos a montar en él todos los servicios, tratando de mantenerlos lo más separados posible de forma que en un futuro puedan migrarse a diferentes máquinas (si las conseguimos).

En esta serie de entradas comentaremos los pasos que hemos seguido hasta tener la forja funcionando. Es importante destacar que estos pasos los hemos realizado primero en una instalación de Ubuntu sobre Virtual Box. Este enfoque es altamente recomendable, dado que nuestra experiencia es que los tutoriales que uno encuentra en general requieren de algunos ajustes para nuestro sistema concreto.

También destacar que esta serie de entradas están basadas en Ubuntu 10.04. Cuando comenzamos la instalación estaba todavía en beta, pero dado que es una distribución LTS, decidimos utilizarla. Ahora ya podéis seguir estos pasos sobre la versión final.

Dicho esto, en esta primera parte vamos a instalar un sistema de gestión de usuarios y grupos. Concretamente, vamos a instalar OpenLDAP, una implementación libre de LDAP, un servicio de directorio ampliamente utilizado.

Preliminares

Antes de continuar, te recomiendo que le eches un vistazo a esta implementación de un servidor LDAP de Apache. Nosotros no hemos probado el servidor, pero sí el cliente, que es una aplicación basada en la plataforma Eclipse. Te recomiendo que consideres seriamente esta posibilidad, porque sin duda hace el proceso de instalación del servidor mucho más sencillo. A nosotros nos ha costado mucho echar a andar OpenLDAP, así que estás avisado.

Si algo sale mal en algún momento, siempre puedes revertir openldap a una configuración por defecto utilizando el siguiente comando:

dpkg-reconfigure slapd

Los pasos que seguimos están basados en este tutorial. Tampoco viene mal tener a mano la guía oficial de OpenLDAP.

Los ficheros que se muestran aquí hacen referencia a detalles del árbol ldap para sidelab. Debes cambiar estos detalles por los tuyos. Esto es lo que comenta el tutorial que hemos seguido:

  1. “This howto uses dc=example,dc=com as the tree for the openldap server. Change these to the base tree that you want to have eg: dc=yourdomain,dc=tld. You need to do this everywhere dc=example,dc=com is used. Also for the entries o=example and dc:example in the base.ldif.”
  2. “Hard returns in all of the provided files are needed since they mark the end of a command when being applied to the openldap server.”

Instalación

Como hemos comentado, comenzamos con una instalación limpia de Ubuntu 10.04 Lucid Lynx. Actualmente sólo la versión beta2 está disponible… veamos cómo se comporta.

En primer lugar tenemos que instalar openldap y el conjunto de utilidades que nos permitirán realizar modificaciones sobre la base de datos que utiliza. El paquete que instala openldap se llama slapd, que es el nombre del servidor:

sudo apt-get -y install slapd ldap-utils

A continuación damos de alta los esquemas que necesitemos. Los esquemas definen estructuras de datos que utilizaremos. Nosotros hemos añadido las que se recomendaban en el tutorial:


cd /etc/ldap
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif

Vamos a crear el fichero que configura la base de datos que utilizará nuestro servidor. La base de datos es una Berkeley DB. Creamos el fichero db.ldif. La ruta /var/lib/ldap define el lugar donde se almacenará la base de datos. Hay que sustituir [passwd] por una contraseña que se utilizará para realizar tareas de administración en el servidor ldap. Cambia también dc=sidelab,dc=es por tus datos.


# Load dynamic backend modules
dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: {0}back_hdb

# Create the database
dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=sidelab,dc=es
olcRootDN: cn=admin,dc=sidelab,dc=es
olcRootPW: [passwd]
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcDbIndex: uid pres,eq
olcDbIndex: cn,sn,mail pres,eq,approx,sub
olcDbIndex: objectClass eq

Aplicamos la configuración establecida en el fichero con el siguiente comando:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f db.ldif

A continuación vamos a crear la raíz de nuestro directorio. La raíz será dc=sidelab,dc=es y vamos a añadir un usuario con rol de administrador. Introduciremos la contraseña de este usuario cifrada con MD5. Se puede escoger otro método de cifrado, pero habría que ver qué métodos hay disponibles. Utilizamos para cifrar la contraseña el comando slappasswd:

slappasswd -h {MD5}

Hay que introducir la contraseña 2 veces.

A continuación creamos la raíz de nuestro directorio mediante el siguiente fichero, que denominamos base.ldif (hay que sustituir [passwd en md5] por la cadena que devolvió slappasswd y las referencias a sidelab por tus datos):


dn: dc=sidelab,dc=es
objectClass: dcObject
objectclass: organization
o: sidelab.es
dc: sidelab
description: sidelab LDAP Root

dn: cn=admin,dc=sidelab,dc=es
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
userPassword: {MD5}[passwd en md5]==
description: LDAP administrator

Aplicamos los cambios:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f base.ldif

En el tutorial se sugería que se eliminaran ciertas reglas de acceso que impiden a phpldapadmin acceder al ldap. Nosotros no habíamos descubierto todavía Apache Directory Studio, por lo que nos planteábamos utilizar phpldapadmin como herramienta de administración de nuestra instalación ldap. Si vas a utilizar la herramienta de Apache quizá no sea necesario realizar este paso, pero nosotros no lo hemos probado.

Creamos el fichero config.ldif. Este fichero no se corresponde exactamente con el que viene en el tutorial, dado que observamos que en la instalación openldap de Ubuntu 10.04 fallaba una de las acciones (que aquí ya está eliminada):


dn: cn=config
changetype: modify
delete: olcAuthzRegexp

dn: olcDatabase={-1}frontend,cn=config
changetype: modify
delete: olcAccess

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=admin,cn=config

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {MD5}[passwd en md5]==

dn: olcDatabase={0}config,cn=config
changetype: modify
delete: olcAccess

De nuevo aplicamos los cambios:

sudo ldapadd -Y EXTERNAL -H ldapi:/// -f config.ldif

A continuación configuramos cierto control de acceso. Creamos el fichero acl.ldif. Este fichero no es exactamente el que viene en el tutorial, hemos quitado el acceso de lectura para todo el mundo (sin autenticación), que era la segunda entrada olcAccess:


dn: olcDatabase={1}hdb,cn=config
add: olcAccess
olcAccess: to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=sidelab,dc=es" write by anonymous auth by self write by * none
olcAccess: to * by dn="cn=admin,dc=sidelab,dc=es" write by users read

Aplicamos los cambios:

sudo ldapmodify -x -D cn=admin,cn=config -W -f acl.ldif

En esta ocasión nos pide la contraseña. Introducir la que se especificó en el comando slappasswd.

Si necesitáramos cambiar los permisos posteriormente (lo que nos ha pasado a nosotros) podemos hacer un fichero como este:


dn: olcDatabase={1}hdb,cn=config
changetype: modify
delete: olcAccess
olcAccess: {1}

dn: olcDatabase={1}hdb,cn=config
add: olcAccess
olcAccess: {1}to * by dn=”cn=admin,dc=sidelab,dc=es” write

Los número entre llaves hacen referencia al número de entrada olcAccess. De esta forma borramos una entrada específica e insertamos en una posición específica. Hay que tener en cuenta que la primera entrada que hace matching es la que se aplica. Aplicar los cambios así:


ldapmodify -x -D cn=admin,cn=config -W -f acl3.ldif

Hay que reiniciar el proceso slapd y es recomendable realizar una búsqueda para comprobar que todo está ok:


sudo kill -INT `cat /var/run/slapd/slapd.pid`
sudo /etc/init.d/slapd start
ldapsearch -xLLL -b cn=config -D cn=admin,cn=config -W olcAccess

Por último, hasta que activemos la seguridad, vamos a asegurarnos de permitir acceso al servidor sólo desde la interfaz local 127.0.0.1. Editamos el fichero /etc/default/slapd para dejar activa sólo la conexión a través de 127.0.0.1:


SLAPD_SERVICES="ldap://127.0.0.1/"

Parar el servicio y reiniciar slapd:


sudo kill -INT `cat /var/run/slapd/slapd.pid`
sudo /etc/init.d/slapd start

Con esto tenemos un servidor openldap funcionando. Podemos utilizar Apache Directory Studio para conectarnos a él, hacer búsquedas e insertar entradas.

9 thoughts on “Making of a forge: LDAP (I)

  1. Daniel Chaur

    Buenos días,

    Después de seguir este tutorial, solo me queda agradecerte enormemente. Llevaba 3 días dedicando casi 8 ocho horas seguidas intentando instalar el LDAP y no daba con ningún tutorial que no utilizase la versión “antigua” del LDAP.

    Ha funcionado perfecto, ahora me queda integrarlo con SAMBA y comenzar a pulirlo.

    De nuevo, muchas gracias.

    Un saludo,
    Dani

  2. Francisco Gortázar

    Nosotros hemos tenido el mismo problema, por eso nos ha parecido interesante compartir el proceso que hemos seguido hasta echarlo a andar. Si te ha funcionado a ti también es que el proceso es robusto.

    Un saludo,
    Patxi.

  3. Justo

    Hola, para empezar, muchas gracias por la ayuda.

    Escribo para comentar que tras crear el fichero db.ldif y ejecutar “sudo ldapadd -Y EXTERNAL -H ldapi:/// -f base.ldif” me da el siguiente fallo:

    adding new entry “cn={0}module,cn=config”
    ldap_add: Naming violation (64)

    No se a que se refiere con dicho fallo… Un saludo y gracias

    • Francisco Gortázar

      Pues no sé qué te puede estar pasando. ¿Estás utilizando Ubuntu 10.04?
      En cualquier caso, el error me parece un poco raro, porque base.ldif no añade la entrada que te da el error (cn={0}module,cn=config), eso se hace en el db.ldif. Comprueba que hayas seguido exactamente los mismos pasos.

      Recuerda que puedes revertir ldap a su configuración por defecto con:

      dpkg-reconfigure slapd

      y volver a empezar.

  4. jorge

    Buenas tardes, he siguido el tutorial, y me ha parecido muy bien, gracias. Solo que tengon un problema que no me renoce la contraseña,me da: ldap_bind: Invalid credentials (49)

    • Francisco Gortázar

      Jorge, el tutorial es largo y es fácil equivocarse en alguno de los pasos. En cualquier caso, nosotros lo hemos probado con Ubuntu 10.04, no sé si con otras distribuciones puede haber problemas. Te recomiendo que empieces de nuevo desde el principio, revirtiendo ldap a su configuración inicial con el comando “dpkg-reconfigure slapd”.

  5. Adolfredo Belizario

    Hola, primero que todo quiero agradecerte por el tutorial.

    Quiero comentarte que resulta que cuando trato de reiniciar el servicio del slapd me lo tumba pero no me lo monta, esto es lo que me aparece en la terminal (root@pdcserver:/# /etc/init.d/slapd restart
    Stopping OpenLDAP: slapd.
    Starting OpenLDAP: slapd failed!), luego trato de iniciarlo por el comando start pero tampoco lo monta, (root@pdcserver:/# /etc/init.d/slapd start
    Starting OpenLDAP: slapd failed!).
    La unica forma de iniciarlo es en modo debug por el comando slapd -d 256 en terminal me muestra esto (root@pdcserver:/# slapd -d 256
    @(#) $OpenLDAP: slapd 2.4.23 (Nov 22 2010 17:42:40) $
    @borges:/home/devel/openldap/trunk/debian/build/servers/slapd
    slapd starting
    ), en este momento todo va bien tengo mi servidor iniciado, en modo debub pero esta iniciado.
    Ahora todo esto lo hago porque cuando trato de cargar los esquemas, me daba un error de conexion con el servidor ldap, en la terminal muestra esto (root@pdcserver:/etc/ldap# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
    ldap_sasl_interactive_bind_s: Can’t contact LDAP server (-1)) por eso pensé que el error estaba en el reinicio del servidor ldap porque no me iniciaba cuando reiniciaba, en vista de esto lo trate de inicirar en modo debug, pero me sigue apareciendo el mismo error “ldap_sasl_interactive_bind_s: Can’t contact LDAP server (-1)”.

    Luego probe el comando “ldapsearch -b dc=midominio,dc=com -H ldap://midominio.com:389/ -x -W”, meto mi clave de ldap y me aparece ahora este error “ldap_sasl_bind(SIMPLE): Can’t contact LDAP server (-1)”, de verdad no se a que se debe? le agredeceria su ayuda!!! muchas gracias.

    • Francisco Gortázar

      Alfredo,

      El tema de instalar OpenLDAP no es nada trivial. Ya lo hemos tenido que hacer varias veces, y hemos ido refinando las instrucciones de instalación. Échale un vistazo a esta página donde puedes encontrar la última versión del tutorial:

      https://dev.sidelab.es/projects/sidelabapi/wiki/Instal-ldap_

      No somos expertos en OpenLDAP, sólo lo usamos como herramienta para gestionar el control de acceso de diferentes servicios de una forja de software, así que no te puedo ayudar mucho en el problema que me comentas. Mira a ver si siguiendo la última versión del tutorial te funciona.

      No sé si usar OpenLDAP es un requisito estricto en tu caso, pero si sigues teniendo problemas te recomiendo echar un vistazo al proyecto Apache Directory, donde puedes encontrar una implementación de LDAP v3 compatible totalmente en Java y que probablemente te dé menos dolores de cabeza:

      http://directory.apache.org/

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s