Apache subversion sobre OpenSuse II

Con el post anterior veiamos como usar un repositorio Subversion en Apache, lo montabamos desde un servidor de ficheros donde residian los repositorios compartidos.

Ahora vamos a añadirle algo de seguridad y depuracion. Imaginemos que en nuestra empresa tenemos multitud de proyectos y que queremos que el acceso a los mismos sea restringido vía web.

La idea inicial sobre subversion es utilizar un servidor web Apache el cual estará integrado con el servidor subversion, que a su vez manejara las peticiones hacia los repositorios del servidor de ficheros donde actualmente estan alojados los repositorios de los diferentes proyectos.

A su vez accedemos a los distintos repositorios con autenticacion LDAP del dominio, lo cual lo configuraremos en Apache.

A nivel interno desde la intranet podemos usar los diferentes repositorios que estan compartidos accediendo al servidor de ficheros. Esto permite un acceso mas rapido a nivel interno, pero la idea a largo plazo es que todo el mundo acceda por el servidor apache tanto desde dentro como desde fuera. Para ello en otro post pongo como crear una extranet con seguridad.

CONFIGURACION DE SUBVERSION

1.- Configuramos subversion segun el siguiente procedimiento, el cual esta pensado de una forma sencilla la cual vamos a depurar adaptandolo a nuestro servidor. Hay que tener en cuenta que si quisiesemos añadir muchos repositorios a nuestro Apache sería una tarea pesada en tener una llamada a Location por cada uno de ellos.

Si nos fijamos este procedimiento esta hecho para utilizar repositorios con autentiacion LDAP de todos los usuarios del dominio, con lo cual todo el mundo que tenga un usuario en nuestro DOMINIO podria acceder y modificar los ficheros de un proyecto. Esto podría supoer un problema de seguridad a nivel interno (¿para que quieren ver los miembros de RRHH los proyectos de desarrollo?), por lo que podemos incluir Grupos del Active Directory. Ademas dentro del grupo de usuarios que pueden acceder a un proyecto vamos a añadir permisos de escritura y lectura.

PROBLEMAS DE SEGURIDAD

Existen tres tipos de acceso a Subversion segun lo estoy montando, del cual vamos a centrarnos en uno que sera el que acabaremos implantando finalmente:

1.- Acceso vía web:http://servidor-web/svn/<repositorio>

Aqui podemos prepararlo para que solo se pueda acceder por certificado y usuario del dominio.

Se puede restringir la consulta LDAP para que busque los usuarios en un grupo determinado.

Se puede restringir los permisos de escritura y lectura con el fichero “authz” alojado en el repositorio. Con esto los jefes tendran permisos sobre unas carpetas que el resto de usuarios no. Esta es una forma mas restrictiva para controlar el acceso a los ficheros “mas valiosos” de la empresa.

Nosotros trataremos de implantar este modelo ya que ofrece la autenticacion por LDAP y restricciones de acceso en el tema de los permisos.

2.- Acceso interno por carpetas compartidas en \\servidor-ficheros\Subversion\<repositorio>

Se puede apuntar el Tortoise directamente sobre el repositorio alojado en el servidor de ficheros.

Se autentifica por usuario de dominio, coge por defecto el usuario de Windows con el que estas logeado. Ademas Tortoise es muy configurable y podemos dejarlo a nuestro gusto.

Tras ver el tema de los permisos, este modo tambien se puede configurar con el fichero “authz” con algun que otro problema.

3.- Acceso por protocolo de subversion: svn://servidor-ficheros/<repositorio>

Aqui habríamos instalado el msi de subversion en un server windows.

Autenticación mediante el fichero “passwd” alojado en cada repositorio. Si no se usa este fichero, no se puede acceder con el protocolo svn. Este es un fichero de texto plano y no permite la integración con LDAP por lo que las contraseñas van en texto y son visibles con solo abrir el fichero.

Este protocolo se podria usar desde el exterior si permitiesemos el trafico en el firewall, pero estamos en las mismas. No nos interesa que los passwords se guarden en un fichero y depender de este fichero. Nos interesa LDAP!!!

MONTAJE DEL SERVIDOR DE FICHEROS

Vamos allá,

hemos quedado que vamos a montar una carpeta compartida del servidor de ficheros en /etc/fstab y si alguna vez se queda pillado se puede desmontar a mano y volverlo a montar. Lo he añadido al fichero y esta es su apariencia:

/dev/sda2 / ext3 acl,user_xattr 1 1
/dev/sda3 /home ext3 acl,user_xattr 1 2
/dev/sda1 swap swap defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs noauto 0 0
debugfs /sys/kernel/debug debugfs noauto 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
/dev/fd0 /media/floppy auto noauto,user,sync 0 0
//IP_servidor_de_ficheros/Subversion /srv/svn/repositorios/servidor-ficheros cifs uid=wwwrun,gid=www,username=DOMINIO/subversion,password=*password*,dmask=0777,fmask=0777 0 0

Donde nos interesa la ultima linea, en la cual se incluyen algunas caracteristicas a tener en cuenta:

  • el origen de los datos en el servidor de ficheros: //192.168.0.2/Subversion
  • donde se monta en el servidor local: /srv/svn/repositorios/servidor-ficheros
  • el tipo de montado: CIFS
  • el usuario y grupo con el que se monta en el servidor apache:  uid=wwwrun,gid=www
  • el usuario de dominio y password con el que se accede al servidor de ficheros:  username=DOMINIO/subversion,password=*password*
  • permisos con los que se monta (los que yo he puesto no son los mas indicados :)): dmask=0777,fmask=0777

Al arrancar la maquina he tenido algún problema al poner el nombre del servidor de datos por DNS en vez de por IP, ya que supongo que el servicio de nombres se levanta mas tarde.

AUTENTICACION LDAP y MACROS

En el fichero /etc/apache/conf.d/subversion.conf (al cual llamamos desde httpd.conf) he comentado todas las líneas que en el procedimiento se detalla, y actualmente funciona con las macros. Este es el fichero donde metere las macros y las llamadas a las mismas por cada repositorio.

En un principio no habrá ningun repositorio funcionando, solo el de pruebas y el que vayamos añadiendo poco a poco. En una empresa, a la larga habra que incluir todos los repositorios en el servidor apache.
Las macros es una extension de Apache (un modulo) que permite agilizar la tarea creando una “plantilla” con variables.

1.- Filtrando por un grupo (es necesario ser miembro de ese grupo LDAP para acceder al repositorio):

<Macro SvnReposOneGroup $path_svn $GrupoLDAP1>
	<Location /svn/$path_svn>
	DAV svn
	SVNPath /srv/svn/repositorios/servidor-ficheros/$path_svn
	AuthType Basic
	AuthName "Authorization for project2 required"
	AuthBasicProvider ldap
	AuthzLDAPAuthoritative off
	AuthLDAPBindDN "CN=ldapauth,CN=Users,DC=dominio,DC=com"
	AuthLDAPBindPassword ldapauth
	AuthLDAPURL ldap://servidor-ldap.dominio.com:3268/DC=dominio,DC=com?sAMAccountName?sub?(&(objectClass=*)(memberOf=CN=$GrupoLDAP1,OU=_GruposNuevos,DC=dominio,DC=com))
	require valid-user
	</Location>
</Macro>

#Llamamos a la macro y le pasamos variables.
Use SvnReposOneGroup prueba G_Sistemas

Aqui autenticamos mediante LDAP con el servidor de dominio AD y para ello empleamos el usuario “ldapauth” de mismo password. No hace falta decir que este debe ser un usuario valido y por supuesto convendría poner una contraseña mas compleja. “SVNPATH” nos indica la ruta al nombre del repositorio al que le hemos pasado una variable. Esta variable la definimos en “Use SvnReposOneGroup” donde indicamos el nombre del repositorio “prueba” y el grupo del AD (G_Sistemas) cuyos miembros tendran permiso para autenticar por LDAP en el repositorio.

2.- Filtrando por dos grupos ( es necesario ser miembro de uno de los dos grupos LDAP para entrar)

<Macro SvnReposTwoGroup $path_svn $GrupoLDAP1 $GrupoLDAP2>
	<Location /svn/$path_svn>
	DAV svn
	SVNPath /srv/svn/repositorios/servidor-ficheros/$path_svn
	AuthType Basic
	AuthName "Authorization for project2 required"
	AuthBasicProvider ldap
	AuthzLDAPAuthoritative off
	AuthLDAPBindDN "CN=ldapauth,CN=Users,DC=dominio,DC=com"
	AuthLDAPBindPassword ldapauth
	AuthLDAPURL ldap://servidor-ldap.dominio.com:3268/DC=dominio,DC=com?sAMAccountName?sub?(&(objectClass=*)(|(memberOf=CN= $GrupoLDAP1,OU=_GruposNuevos,DC=dominio,DC=com)(memberOf=CN= $GrupoLDAP2,OU=_GruposNuevos,DC=dominio,DC=com)))
	require valid-user
	</Location>
</Macro>

#Llamamos a la macro y le pasamos variables.
Use SvnReposTwoGroup prueba G_Sistemas G_Jefes

3.- También se puede hacer con la directiva de apache “Require group”, la cual no he podido hacer funcionar. Esta bien saber que existe. No hace falta decir que las consultas LDAP es un pequeño mundo y existen muchas combinaciones.

RESTRICCIONES DE SEGURIDAD

Esta restriccion de seguridad todavia no la vamos a aplicar hasta que explotemos subversion. Las cosas poco a poco, pero esta bien explicarlo y ver como funciona:
1.- Mediante la directiva “AuthzSVNAccessFile” vamos a filtrar los permisos de escritura y lectura una vez autenticados por LDAP .
2.- El filtro se aplicaria asi:

<Macro SvnReposNoGroup $path_svn $GrupoLDAP1>
<Location /svn/$path_svn>
DAV svn
SVNPath /srv/svn/repositorios/servidor-ficheros/$path_svn
AuthType Basic
AuthName "Authorization for project required"
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPBindDN "CN=ldapauth,CN=Users,DC=dominio,DC=com"
AuthLDAPBindPassword ldapauth
AuthLDAPURL ldap://servidor-ldap.dominio.com:3268/DC=dominio,DC=com?sAMAccountName?sub?(&(objectClass=*)(memberOf=CN=$GrupoLDAP1,OU=_GruposNuevos,DC=dominio,DC=com))
AuthzSVNAccessFile /srv/svn/repositorios/servidor-ficheros/$path_svn/conf/authz
require valid-user
</Location>
</Macro>

Use SvnReposOneGroup prueba G_Sistemas

Donde el fichero authz contendría lo siguiente:

[groups]
adm = paco.flores
tec = luis.perez,angel.martin
# Directorio raiz del erpositorio
[/]
* = r
adm = rw
#carpeta tags dentro del directorio raiz
[/tags]
tec = rw
adm = r

Lo cual restringe el acceso de escritura por grupos. Este fichero lo debería de modificar el Jefe de proyecto o la persona que tenga la responsabilidad de hacerlo (por no hablar de jefes :P) para restringir el acceso de escritura, y lo debería de modificar a mano.

Accederemos a: http://servidor-web/svn/repositorio/

Fijaos bien en el la ruta de la web donde en mi caso “Location” es /svn/ seguido del nombre del repositorio que hemos pasado por variable.

Al final si utilizamos una sola macro, debajo deberemos de hacer las llamadas a la misma mediante “Use” por cada repositorio que queramos incluir en el servidor Web,

Etiquetas: , ,

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


A %d blogueros les gusta esto: