martes, 11 de agosto de 2009

Servidor SVN con usuarios y permisos de repositorios

Hola nuevamente, recientemente he abierto un nuevo blog que se dedicará netamente a lo que es php, dicho blog cuya direccion es http://aprendefacilphp.blogspot.com/ será entonces el lugar donde publique mis codigos de php y muestre lo poco que sé. ;P

Bueno, para empezar con nuestro tema quisiera darles una breve explicación de lo que es el SVN o Sistema de Control de Versiones, este sistema fue "diseñado" para sustituir al CVS (Sistema Concurrente de Versiones). Lo que permite es que varias personas trabajando en un mismo proyecto (ya sea de programación o no) puedan escribir sus respectivos archivos, realizar modificaciones e inclusive solucionar problemas sin temor a que se sobre-escriban los fuentes. Por ej. Yo tengo dos compañeros mas de trabajo, y todos estamos trabajando en un proyecto de desarrollo web, cada uno de nosotros trabaja en un área específica, pero a veces uno encuentra un problema en el código del otro y lo soluciona, pero que ocurre si el otro estaba trabajando en el mismo archivo, pues ahi es donde surge el sistema, Cuando alguien empieza a trabajar en un archivo (en este caso existente) al descargarlo se dice que se descargó en un número de versión digamos en este caso el 89 y al mismo tiempo mi compañero tambien descargó ese mismo número de versión, cuando yo suba mis modificaciones (ya que lo hago primero) el archivo pasará a la versión 90, y cuando mi compañero quiera subir sus cambios, el sistema le notificará que hay una versión mas reciente y que el archivo que el descargó tiene una anterior, notificándole asi que puede haber un conflicto, normalmente el sistema descarga ambos archivos y permite al usuario "corregir" o tomar los cambios de uno sin afectar al otro, una vez solucionado se suben los nuevos cambios y el archivo pasa a pertenecer a la version 91. Ese es sólo un ej. Hay varios mas así por ejemplo, podemos tener branchs o saltos o ramas de versiones que a partir de un número determinado sigue en paralelo al otro, esto por ej, cuando se desarrollan sistemas para clientes, y necesitan ser iguales en la base pero diferentes en algunos detalles, pues este sistema lo facilita, asi como tambien luego permite hacer un merge o mezcla de ambos para obtener una version conjunta de ambos. Bueno, no seguiré explicando porque se hará muy largo esto, no soy muy bueno con la teoría así que les sugiero pregunten a papá google que pueden hacer con el SVN y prueben, que echando a perder se aprende ;P

Bueno, luego de mucho tiempo de haber puesto en práctica este tutorial http://slackdhabyx.wordpress.com/2007/08/28/activar-subversion-con-apache-en-slackware-12/ siempre quise que pudiera haber un cierto tipo de limitación de acceso a los usuarios, es decir. Por ejemplo:

Tengo 7 repositorios con software que es de mi empresa, pero quiero sacar un nuevo proyecto público(nótese que en este caso uso proyecto como repositorio indistintamente) pero quiero que participe más gente y no quiero montarlo en otro servidor, quiero que esté en el mio. Pues como lo tenia según ese tutorial no lo iba a poder hacer, ya que una vez que creo el usuario, este puede acceder a cualquiera de los proyectos y descargarlos sin problemas, pues entonces me puse a investigar con google y econtré este otro tutorial http://svn-access-mana.sourceforge.net/ que sugiere que use un archivo de limitacion de acceso al usuario(no sólo al repositorio sino que inclusive a una carpeta solamente), con este archivo pues, se me facilitó todo, pues puedo restringir el acceso tanto de lectura como de escritura por repositorio.

Bueno a continuación pongo como tengo estructurado mis archivos de configuración:
en mi archivo de configuracion del apache ademas de los modulos del svn que se cita en el primer blog pongo el codigo de la siguiente manera

<Directory "/repositorio/svn">
Options Indexes FollowSymLinks
Order allow,deny
Allow from all
</Directory>
<Location /repositorios>
DAV svn
SVNParentPath /repositorio/svn
#nueva linea
AuthzSVNAccessFile /etc/svn/users-access-file
#fin de nueva linea
SVNListParentPath on
AuthType Basic
AuthName "Repositorio SVN"
AuthUserFile /etc/svn-auth-file
Require valid-user
</Location>
Con esa "nueva linea" que se agregó permito que se restrinja el acceso a los usuarios definidos en el archivo de autenticación svn

y a continuación pongo el script de configuración
/etc/svn/users-access-file

[/]
* =
[repo1:/]
p431i7o = rw
user2 = rw
user3 =
[repo2:/]
p431i7o = rw
user2 = r
user3 = r
[repo3:/]
p431i7o = rw
user2 =
user3 = r
  • con esto en la repo1 tanto yo como el user2 tenemos permiso de lectura y escritura mientras que se le deniega el acceso al user3
  • en la repo2 todos tenemos permiso de lectura pero solo yo puedo escribir
  • y en la repo3 podemos leer solamente el user3 y yo luego el user2 no puede acceder

Puede parecer una pequeñez esto, pero me llevo como 2 horas encontrar esta respuesta (luego de habermelo propuesto) y creo que esto a alguien le servirá.

Una vez mas recomiendo leer previamente el primer blog, para poder tener montado el servidor svn y un repositorio de ejemplo, luego ya podran continuar con este ejemplo :)

Si te gustó el post pues deja un comentario, y si no te gustó igual déjalo que con críticas constructivas podemos mejorar el mundo :)

5 comentarios:

  1. Estaba buscando exáctamente lo mismo, me quedo con la copla y lo intento ya os cometaré mis avances

    ResponderEliminar
  2. Hola, quisiera saber como darle privilegio a un archivo especifico del repositorio svn, por ejemplo el usuario hola que pueda leer solo el cpontenido de la carpeta branches. Gracias.

    ResponderEliminar
  3. Excelente funciona muy bien con CollabNet Subversion Edge 1.1.0.
    Grs por la solución le habian intentado con la ayuda en linea que tiene el paquete y no me funciono.

    ResponderEliminar
  4. Hola, muchas gracias por la explicación, me ha sido muy útil la parte de denegar permisos!

    En respuesta a "Idgm_99", añado un pequeño ejemplo de lo que pide, y añado también la agrupación de usuarios en diferentes grupos, para facilitar las cosas:

    --------------------------------------------------------------------
    [groups]
    # =========================================
    ADMINS = user1, user2
    # =========================================
    A_DEPT = user3, user4, user5
    B_DEPT = user6, user7
    # =========================================
    KEY_USERS_X = user4
    # =========================================
    INVITED = user_invited
    # =========================================

    [/]
    @ADMINS = rw

    [REPO_X:/]
    * = r
    @A_DEPT = rw
    @B_DEPT =
    [/TCPE]
    @KEY_USERS_X = rw
    * =

    ### This file is an example authorization file for svnserve.
    ### Its format is identical to that of mod_authz_svn authorization
    ### files.
    ### As shown below each section defines authorizations for the path and
    ### (optional) repository specified by the section name.
    ### The authorizations follow. An authorization line can refer to a
    ### single user, to a group of users defined in a special [groups]
    ### section, or to anyone using the '*' wildcard. Each definition can
    ### grant read ('r') access, read-write ('rw') access, or no access
    ### ('').

    --------------------------------------------------------------------


    Explicación:
    ============

    Hay 8 usuarios diferentes, y 5 grupos de usuarios definidos.
    - Administradores (usuarios 1 y 2)
    - Departamento A (usuarios 3, 4 y 5)
    - Departamento A (usuarios 6 y 7)
    - Usuarios Clave X "Key users X" (usuario 4, que ya estaba en otro grupo)
    - Inviatados (usuario invitado)

    Todo esto esta definido en la sección de grupos (véase que empieza en "[groups]" y termina cuando de define algun repositorio, en este caso usamos "[/]" que indica TODOS los repositorios).

    Explicamos la zona de definición de permisos:
    [/] --> Con esto indicamos que nos referimos a todos
    @ADMINS = rw --> Aquí estamos dándo permisos de escritura y lectura al grupo de administradores (usuarios 1 y 2).


    La parte un poco más complicada, es definir dentro de un mismo repositorio diferentes permisos:

    [REPO_X:/]
    * = r
    @A_DEPT = rw
    @B_DEPT =
    [/Z_FOLDER]
    @KEY_USERS_X = rw
    * =

    Aquí estamos definiendo en el repositorio "REPO_X", permisos de lectura a todos los usuarios (* = r), permisos de lectura y escritura a los usuarios del "A_DEPT" (@A_DEPT = rw), y le denegamos todo acceso a todos los usuarios del "B_DEPT" (@B_DEPT = ).
    Además, con la última parte, indicamos que para la carpeta "Z_FOLDER" de este mismo repositorio, los Usuarios Clave X "Key users X" (usuario 4, que ya estaba en otro grupo) tendrán acceso a esta carpeta, pero todo el resto no, ya que así se lo especificamos (* = )

    ResponderEliminar
  5. Ayuda por favor, mi SVN si autentica usuarios y si distingue cuando es R o RW pero quiero denegarle el acceso dejandolo en blanco y de igual forma accede, por ejemplo tiene acceso al trunk pero quiero denegarle el acceso a una carpeta dentro de este y le asigno un espacio en blanco pero igual deja acceder alguien podria ayudarme?

    ResponderEliminar