ACLExtension: Permisos de grano fino en Mercurial

0
6123

ACLExtension: Permisos de grano fino en Mercurial

1. Introducción

Cuando publicamos un repositorio Mercurial y habilitamos la posibilidad de realizar push es muy habitual que necesitemos también controlar qué usuarios van a poder utilizar este comando. Aunque por defecto, Mercurial nos permite esto, el control sobre el repositorio lo podemos considerar de grano grueso ya que únicamente podremos decidir si un usuario puede subir o no sus cambios.

Mercurial permite añadir funcionalidades nuevas a través Extensiones. Actualmente tenemos a nuestra disposición un gran número de ellas, se encuentran dividas en dos grupos: aquellas que son mantenidas por Mercurial (se distribuyen con él) y extensiones desarrolladas por terceros qué deberán ser instaladas manualmente para poder utilizarlas.

Entre el abanico tan amplio existe una extensión llamada ACLExtension que nos permitirá aplicar permisos de grano fino a nuestro repositorios. Con esta extensión seremos capaces de controlar cosas como: quién puede realizar un branch, quién tiene permisos de escritura, quién puede hacer push sobre un determinado fichero, etc.

Os recomiendo que os leais «Publicar un repositorio Mercurial con Apache» ya que este tutorial es una ampliación de él. Todas las rutas y ficheros que hagamos referencia serán los utilizados en ese tutorial.

2. Entorno

Entorno utilizado para escribir este tutorial:

  • Hardware: VirtualBox 3.2.8 corriendo sobre un Mac Book Pro (Core 2 Duo 2,8 Ghz, 4 GB RAM, 500 GB)
  • Sistema Operativo: Ubuntu 64 bits 10.04 LTS
  • Mercurial: 1.6.3
  • Python: 2.6.1
  • Wsgi: 2.8.2

3. Habilitar una extensión

El proceso de activación de una extensión en Mercurial es muy sencillo. Sólo debemos añadir la extensión a la sección «extensions» de nuestro fichero de configuración de Mercurial. En nuestro caso en lo añadiremos a /var/hg/repositories/adictos-repo/.hg/hgrc que es el fichero de configuración de nuestro repositorio y quedaría algo como:

[extensions]  
acl=

Por cada extensión que queremos activar debemos añadir su alias y el path del script de nuestra extensión. Esto último lo debemos hacer si la extensión no se encuentra en los path de Mercurial o de Python. Como en nuestro caso la extensión ACL es interna a Mercurial no debemos añadir el path. Un ejemplo de activación de una extensión que no se encuentra en esos paths sería:

[extensions]  
myextension=/home/adictos/.hgext/myextension.py 

Es muy importante que el fichero hgrc sea propietario el usuario con el que estamos ejecutando Mercurial. En nuestro caso como estamos bajo un Apache sería www-data. Si no hacemos esto la configuración de extensiones, hooks y demás cosas no funcionaran.

4. Utilizando ACLExtension

Habilitada la extensión nos tocaría configurarla. Lo primero de todo es indicar a Mercurial cuales son las operaciones sobre el repositorio que van a ser controladas por nuestra extensión. La forma de realizar esto es utilizando hooks. Con los hooks seremos capaces de que Mercurial ejecute determinadas acciones cuando se produzca un determinado evento en el repositorio.

En nuestro caso vamos a vigilar los comandos de commit, push, pull, bundle y serve por tanto necesitamos añadir a nuestro fichero de configuración lo siguiente:

[hooks]  
pretxncommit.acl = python:hgext.acl.hook  
pretxnchangegroup.acl = python:hgext.acl.hook  

ACLExtensions tiene varias secciones para su configuración:

  • [acl]: sección donde se indica la fuente sobre la que se aplica las restricciones. Los valores posible son serve (http o ssh), push, pull y bundle. En nuestro caso al utilizar un acceso por http debemos configurar serve.
  • [acl.groups]: permite definir grupos internos de usuarios.
  • [acl.deny.branches]: en esta sección se restringe el acceso a las ramas.
  • [acl.allow.branches]: se configura el permiso de acceso a las ramas.
  • [acl.deny]: en esta sección se configura la restrincción de acceso a determinados rutas de los repositorios. ACL es la primera sección que revisa y si hay alguna coincidencia no se revisará ninguna otra sección.
  • [acl.allow]: permite configurar el acceso a los repositorios.

La forma más fácil de ver como funciona es verlo a través de un ejemplo. Nuestro repositorio es accedido través de un servidor Apache, por tanto en la sección [acl] debemos indicar que la fuente es del tipo «serve».

[acl]  
source=serve 

Vamos a suponer que tenemos tres usuarios: adictos, autentia y pmartinez. Para este ejemplo vamos a suponer que el primero pertenece al grupo de desarrolladores, el segundo al de administradores y el tercero no pertenece a ningún grupo.

[acl.groups]  
@developers=adictos  
@administrators=autentia 

Los administradores y desarrolladores son los únicos que pueden trabajar con cualquier rama en el repositorio. En cambio el usuario pmartinez sólo puede hacerlo sobre la rama «branch-a».

[acl.deny.branches]  
*=pmartinez  
[acl.allow.branches]  
branch-a=pmartinez  
*=@administrators,@developers  

Ahora queremos restringir el acceso a los desarrolladores al directorio reports del repositorio adictos-repo y permitir el acceso al resto del repositorio. En cambio los administradores tendrán permisos sobre todo y el usuario pmartinez sólo podrá acceder al directorio de docs.

[acl.deny]  
/var/hg/repositories/adictos-repo/reports/**=@developers  
  
[acl.allow]  
/var/hg/repositories/adictos-repo=@developers,@administrators  
/var/hg/repositories/adictos-repo/docs/**=pmartinez 

Acabamos de ver un ejemplo básico de configuración para que veáis lo sencillo que es aplicar seguridad de grano fino con ACLExtensión.

5 Conclusión

El uso de extensiones en Mercurial nos aportan más funcionalidades a nuestro repositorio. Esta vez hemos visto como usar ACLExtension para aplicar seguridad de grano fino pero existen muchas más que mejoran Mercurial y que permiten integrarse con otras aplicaciones como es el caso de bugzilla.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad