Making of a forge: LDAP (II)

En esta segunda entrega dedicada a LDAP, vamos a establecer unos mínimos mecanismos de seguridad en nuestro servidor OpenLDAP. La idea es poder utilizar Apache Directory Studio desde una máquina remota para dar de alta usuarios y grupos. Normalmente la administración de los diferentes servicios de la forja (incluyendo los usuarios y grupos gestionados por LDAP) la haremos remotamente. No queremos tener que abrir una conexión SSH o VNC con la máquina cada vez que queramos tocar la configuración de algún servicio.

Lo que hemos hecho es activar TLS como mecanismo de conexión con el servidor OpenLDAP. Para ello he seguido principalmente las instrucciones proporcionadas en esta página: https://help.ubuntu.com/9.10/serverguide/C/openldap-server.html.

Estos son los pasos que he seguido:

Lo primero es crear un certificado con el que se autenticará el servidor LDAP, es importante que el Common Name sea el nombre del servidor (dev.sidelab.es). Aunque el certificado va a estar autofirmado, al menos al hacer coincidir el nombre del certificado con el del servidor evitaremos que los servicios que hagan uso del servidor OpenLDAP se quejen de que el nombre del servidor no coincide con el nombre de la máquina.

openssl req -new -x509 -nodes -out slapdcert.pem -keyout slapdkey.pem -days 3650

En segundo lugar copiaremos los certificados a /etc/ldap y cambiaremos los permisos a los ficheros para que sean del usuario y grupo openldap:

sudo cp slapdcert.pem /etc/ldap
sudo cp slapdkey.pem /etc/ldap
sudo chown openldap:openldap slapdcert.pem
sudo chown openldap:openldap slapdkey.pem

Ahora que lo tenemos todo preparado, vamos a activar tsl en OpenLDAP. Para ello hay que crear un fichero tls-condif.ldif con el siguiente contenido:

dn: cn=config
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/slapdcert.pem

dn: cn=config
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/slapdkey.pem

y lo añadimos a la bbdd config de OpenLDAP así:

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

Por seguridad, vamos a editar el fichero /etc/default/slapd para dejar activa la conexión segura para todas las interfaces y la no segura sólo en la 127.0.0.1, de esta forma cualquier conexión externa deberá realizarse bajo TLS:

SLAPD_SERVICES="ldap://127.0.0.1/ ldaps:///"

Finalmente, paramos el servicio y reiniciamos el proceso slapd:

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

En este momento, si nos conectamos con Apache Directory Studio, podemos dar de alta una conexión ldaps.

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.