Configurar Subversion Server, con autenticación de usuarios por OpenLDAP y permisos por path utilizando Authz

En Ubuntu 11.04 (y mas nuevos también) ya no se suele utilizar el archivo de configuración de LDAP sino que se usa una base de datos de configuración Esto tiene la ventaja de que no es más necesario reiniciar el servicio al cambiar algún seteo.

Por defecto esta base de datos se puede consultar utilizando SUDO ya que no tiene un usuario y contraseña. Se puede crear uno o crear una nueva base de datos donde configurar esos usuarios

Información adicional para instalación de OpenLDAP en Ubuntu 11.04: Ubuntu Server Guide – 11.04 – OpenLDAP Server

En esta guia iré relatando los pasos que fui haciendo desde una instalación de Ubuntu 11.04 en blanco con Apache, Subversion y LDAP instalados pero con escasa configuración, hasta culminar con un sistema que me permite agregar usuarios por ldap y actualizar un archivo Authz para poder especificar permisos de SVN con granularidad.

Crear una nueva Base de datos

En LDAP cada nueva raíz base es una base de datos. Así que si quiero una rama para dc=soluciones dc=com dc=ar y de ahí abrir toda la organización, se debe crear una nueva base de datos comenzando con esa clave.

Para esto crear un archivo llamado create_database.ldif con el siguiente contenido

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

dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=soluciones3f,dc=com,dc=ar
olcAccess: to attrs=userPassword by self write by anonymous auth by  dn="cn=admin,dc=soluciones3f,dc=com,dc=ar" write by * none
olcAccess: to * by self write by dn="cn=admin,dc=soluciones3f,dc=com,dc=ar" write by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=soluciones3f,dc=com,dc=ar
olcRootPW: miclave

luego ejecutar el siguiente comando

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

Ya deberíamos tener una base de datos para la base dc=soluciones3f,dc=com,dc=ar con usuario admin y contraseña miclave. Sin embargo esta base de datos aun no tiene información y habrá que cargar al menos la información base con otro script.

Primera estructura de la base de datos

Luego de tener configurada la base de datos, se puede comenzar a crear datos. El primer dato que hay que cargar es el DN principal que es la misma base que se especifico en la creación de la base de datos.

Creamos un archivo que podemos llamar configuracion_inicial.ldif con el siguiente contenido

dn: dc=soluciones3f,dc=com,dc=ar
objectClass: top
objectClass: dcObject
objectClass: organization
o: Soluciones 3f SRL
dc: soluciones3f

Ejecutamos para agregar esta información, que nos pedirá la contraseña que especificamos cuando creamos la base de datos.

sudo ldapadd -H ldapi:/// -D "cn=admin,dc=soluciones3f,dc=com,dc=ar" -W -f configuracion_inicial_ldap.ldif

Para poder agregar algunos tipos de datos específicos que necesitaremos luego necesitamos también agregar algunos schemas mas al LDAP que son standard. Para esto ejecutamos los siguientes comandos

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

Configuración de Apache + SVN con LDAP

Lo primero es tener configurado Apache y SVN correctamente. No preocupándonos aun por la autenticación ni autorización.
La configuración de apache con svn no es el objeto de este documento.

Una vez configurado el SVN y Apache, debemos configurarlo para utilizar autenticación por medio de LDAP, esto requiere crear algunos usuarios en el directorio.

Al menos se requieren dos usuarios, uno contra el cual se hará el bind y se obtendrá el usuario y contraseña que se quiere realmente loguear. Estos se pueden crear utilizando alguna herramienta como phpldapadmin. Utilizando el template de Simple Security Object

Luego, hay que agregar algunas directivas a la configuración del Location (o VirtualHost) de apache para que valide los usuarios utilizando LDAP. Por ejemplo quedaría de la siguiente manera la configuración de un Location SVN con LDAP

<Location /svn>
    DAV svn
    SVNParentPath /var/svn

        AuthLDAPURL ldap://127.0.0.1/ou=people,dc=soluciones3f,dc=com,dc=ar?uid
        AuthLDAPBindDN "uid=admin,dc=soluciones3f,dc=com,dc=ar"
        AuthLDAPBindPassword "admin"
        AuthType Basic
        AuthName "Password Prompt"
        AuthBasicProvider ldap
        require valid-user
</Location>

De todo esto es importante notar AuthLDAPURL que es la url al servidor ldap que se utilizará para validar, indicando cual es el DN base en el cual se encuentran los usuarios con permiso de acceso. Luego del signo de pregunta va el nombre del atributo que se utilizará como nombre de usuario.

La directiva AuthLDAPBindDN es el usuario de LDAP que se utilizará para buscar los demás usuarios. Este debe tener permisos para buscar usuarios en el directorio, al menos en la rama indicada en AuthLDAPURL

Finalmente AuthLDAPBindPassword es la contraseña del usuario que se especifica en AuthLDAPBindDN

Con esta configuración se requiere un usuario válido para leer o escribir en cualquier repositorio.

Si surgen problemas, en el Log de Apache (/var/log/apache2/error.log) se pueden ver algunos mensajes, aunque no demasiados útiles, y recomiendo también, revisar que la contraseña y DN del usuario que se utiliza para hacer el Bind sean correctos.

Configuración de SVN con grupos de usuarios por directorio

Subversion puede gestionar los permisos de los diferentes usuarios para escribir o leer en un repositorio a nivel path. O sea, que un usuario puede escribir en un repositorio pero no en otro, o incluso dentro de un repositorio en algunos directorios puede tener permisos de lectura y otros no… y cosas así para administrar un poco la seguridad.

Esta flexibilidad se consigue por medio de archivos Authz los cuales se configuran en Apache, pero nada saben de LDAP lo cual los hacen un tedio de configurar. Pero afortunadamente hay un script en python que permite administrar estos archivos.

Más información en: http://www.thoughtspark.org/node/26 Source del script original en: https://bitbucket.org/jcscoobyrs/jw-tools

Requerimientos del script

  1. Como no puede ser de otra manera, hay que descargar el script de: BitBucket del creado del script
  2. El script requiere el modulo de python-ldap por lo que se debe instalar: sudo apt-get install python-ldap

Ejecución del script

Luego de instalados los requerimientos y dado permisos de ejecución sobre el script (chmod) se lo ejecuta con el siguiente comando:

./sync_ldap_groups_to_svn_authz.py -d "uid=admin,dc=snes3f,dc=com,dc=ar" -g "objectClass=groupOfNames" -u "objectClass=simpleSecurityObject" -i "uid" -p admin -z svn_users.authz

En este script se aprecia el parámetro -g que es para indicar cuales objetos son grupos. el parámetro -u para identificar a los que son usuarios y el parámetro -i para indicar, dentro de los usuarios, cual es el atributo que se usa como key

Se generará un archivo svn_users.authz con al definición de los usuarios y grupos obtenidos desde la el servidor LDAP. En este archivo, se puede agregar ANTES de la sección grupos, otras definiciones y áreas de permisos para los paths.

El archivo final queda con al forma

[algungrupo:/]
@algungrupo = rw
@internal = r

[soluciones3f:/]
@internal = rw

[groups]

### Start generated content: LDAP Groups to Subversion Authz Groups Bridge (2012/02/18 03:10:54) ###
internal = fernando, facundo
algungrupo = jorge

################################################################################
###########   LDAP Groups to Subversion Authz Groups Bridge (Legend)  ##########
################################################################################
### internal = cn=internal,ou=subversion,dc=soluciones3f,dc=com,dc=ar
### algungrupo = cn=algungrupo,ou=subversion,dc=soluciones3f,dc=com,dc=ar
################################################################################

### End generated content: LDAP Groups to Subversion Authz Groups Bridge ###

Se recomienda ajustar bien estos parámetros y pensar donde debería estar el archivo generado, teniendo en cuenta que este deberá ser luego accesible desde apache, y modificado en bases regulares por un cron u otro medio.

Configuración del servidor Apache

Con el archivo authz generado, solo resta configurar el servidor apache y el svn para que lo tengan en cuenta. Para este fin se agrega en la configuración del svn una linea con la siguiente forma

AuthzSVNAccessFile /etc/svn_users.authz

Luego de reiniciar apache deberían validarse correctamente los permisos.


Discussion Area - Leave a Comment