martes, 11 de septiembre de 2012

SVN - Control de acceso con Authz

Actualmente utilizamos en la empresa SVN como sistema de control de versiones para nuestros proyectos, es práctico y nos ha servido bastante bien, hasta ahora hemos utilizado el método del archivo "passwd" para dar acceso a los repositorios de los proyectos, no habíamos necesitado de nada más.

Actualmente ha surgido la necesidad de buscar una manera de crear un repositorio común para toda la organización pero con acceso limitado por carpetas para los diferentes usuarios.
Leyendo un poco acerca de las diferentes formas de control de acceso para SVN encontré que usando  svnserve, y configurando el archivo "authz" se puede configurar el acceso a directorios, en base a usuario o grupos de usuarios.

En este caso lo mejor es crear el árbol de directorios que se usará para que en base a ese árbol configuremos el archivo "authz", aunque siempre se puede modificar si se agregan mas directorios y se quiere mantener el acceso restringido a estos.

NOTA es importante definir bien la estructura del directorio, desde los niveles mas bajos a los mas altos.

Primero creamos un repositorio, lo llamaremos "Proyectos", editamos el archivo svnserve.conf que se crea, buscamos y descomentamos las siguientes lineas:


#    anon-access = read #    auth-access = write .
.
.
#   password-db = passwd

para que queden sin la almoadilla "#"

anon-access = read

auth-access = write
.
.
.
password-db = passwd

Y añadimos los usuarios que vayan a utilizar el repositorio en el archivo "passwd"

para este ejemplo agregaré 4 usuarios:

[users]
admin = adminssecret
devchief = chiefssecret
developer1 = devs1secret
developer2 = devs2secret
developer3 = devs3secret

Después creamos la estructura de directorios:

Voy a poner un ejemplo simple de estructura de directorios:

Directorio Raiz: --Proyectos
                              --Web
                                 --PERL
                                 --PHP
                                 --RUBY








importamos a nuestro repositorio el directorio raiz con los subdirectorios:
ya sea que lo hagan con un cliente gráfico como VCSRabbit o Tortoise
o desde la terminal, que sería así:

$ svn import -m "estructura" --username admin --password adminssecret Proyectos/  svn://tuserver/Proyectos 

Así queda creada la estructura de directorios base en el repositorio.

Ahora si! es hora de configurar el archivo "authz"
Abrimos el archivo authz que se encuentra en el directorio de nuestro repositorio y buscamos la sección [groups] que es donde configuraremos los grupos con los usuarios que definimos en el archivo "passwd"

deberá quedar algo así:


[groups]
Admins = admin, devchief
Developersphp = developer1, developer3
Developersperl = developer2
Developersruby = developer2, developer3

después de esta sección vamos a configurar el acceso a los directorios de la siguiente manera:

primero tenemos que dar acceso a todos los usuario a la raíz del repositorio, pero solo daremos permiso de escritura al grupo de administradores. No se le puede otorgar un permiso de escritura a un usuario/grupo si no tiene acceso de lectura al directorio padre.

[/]
@Admins = rw   #con esto damos acceso de lectura y escritura a el grupo Admins
* = r    #con esto damos acceso a todos acceso de lectura

[/Web] #Ahora configuramos los accesos para el siguiente nivel, que es el directorio "Web"
* = r    #con esto damos acceso a todos acceso de lectura
@Admins = rw   #con esto damos acceso de lectura y escritura a el grupo Admins

[/Web/PHP]  #Ahora configuramos los accesos para el siguiente sub-nivel,  de Web, que es el directorio "PHP"
@Developersphp = rw   #con esto damos acceso de lectura y escritura a el grupo Developersphp, entonces SOLO el usuario developer1, developer3 podrán ver y escribir este directorio
@Admins = rw #con esto damos acceso de lectura y escritura a el grupo Admins
* =   #Con esto se asegura que nadie mas tenga ningún tipo de acceso al directorio

[/Web/PERL] #Ahora configuramos los accesos para el siguiente sub-nivel,  de Web, que es el directorio "PERL"
@Developersperl = rw #con esto damos acceso de lectura y escritura a el grupo Developersperl, entonces SOLO el usuario developer2 podrá ver y escribir este directorio
@Admins = rw
* =


[/Web/RUBY] #Ahora configuramos los accesos para el siguiente sub-nivel,  de Web, que es el directorio "RUBY"
@Developersruby = rw #con esto damos acceso de lectura y escritura a el grupo Developersruby, entonces SOLO los usuarios developer2 y developer3 podrán ver y escribir este directorio
@Admins = rw
* =


 #Nota si se desea puede darse acceso a usuarios por separado de a siguiente forma:
#[/Web/PERL] 
#developer2 = rw
#devchief  = r
#* =

Guardamos y cerramos el archivo.
Ahora hay que descomentar una linea más en el archivo "svnserve.conf"
Buscamos la siguiente linea:

# authz-db = authz

lo descomentamos y lo dejamos así:


authz-db = authz


Guardamos y cerramos el archivo, y reiniciamos el demonio o servicio de svnserve.

Ahora cuando el usuario "admin" haga un checkout del repositorio podrá ver y escribir en todos los directorios. Y cuando el usuario developer1 solo podrá ver y escribir en el directorio "PHP" y así para cada uno de los diferentes usuarios que configuramos en el archivo authz.

3 comentarios:

Renato dijo...

Los sistemas de control de acceso biométrico son la tecnología con más demanda en el mercado actual. Se ha migrado de sistemas mecánicos y con personal especializado, a tener procesos de control de entrada y salida completamente automatizados con diferentes tipos de tecnologías y dispositivos.

Dani dijo...

Muchas gracias por el aporte,

Solo me encontre con un pequeño fallo, y es que según la documentación oficial es mejor asignar los permisos de esta forma:
[nombrerepo:/carpeta]
harry = rw
sally = r

Así me ha funcionado a la perfección.

Un saludo y gracias,
Daniel Chaur

Unknown dijo...

Creo que cuando defines el nombre del repositorio es cuando manejas con un archivo authz mas de un repositorio. Y un gusto ayudar, gracias por los comentarios.