User Tools

Site Tools


linux:securingsubversion

Securing Subversion

Nota del autor: Este documento es bastante antiguo (2003?) y supongo que algunas de las directices que aquí se dan ya se han incorporado a las mayores distribuciones. Por no decir que seguramente habrá guias mejores (incluso libros) editados al respecto.

Hecho este disclaimer, vamos con lo que nos interesa.

Pasos para crear un repositorio seguro:

Por defecto, seremos paranoicos con los permisos y la seguridad:

  1. establecer un path seguro
  2. umask 022

Crear un grupo “svn” de usuarios de svn:

groupadd svn

Crear un usuario “svn” que será el que ejecute el servidor, y el propietario del repositorio:

useradd -c 'Subversion unpriviledged user' -d /var/svn/ -g svn -G svn -s /bin/false svn

Los comandos de subversion, que se ejecuten únicamente por el usuario svn y el grupo svn:

chupete:~# chgrp svn /usr/local/bin/svn*
chupete:~# chmod 550 /usr/local/bin/svn*
# el comando "svn" debe tener permisos de ejecución globales (555) debido
# a que todos los usuarios deberán tener acceso al mismo (por si quieren
# utilizar Subversion como cliente)
chupete:~# chmod 555 /usr/local/bin/svn
chupete:~# ls -la /usr/local/bin/svn*
-r-xr-xr-x    1 svn      svn        360019 Aug  8 17:22 /usr/local/bin/svn
-r-xr-x---    1 svn      svn        101569 Aug  8 17:23 /usr/local/bin/svnadmin
-r-xr-x---    1 svn      svn         89589 Aug  8 17:23 /usr/local/bin/svndumpfilter
-r-xr-x---    1 svn      svn        121222 Aug  8 17:23 /usr/local/bin/svnlook
-r-xr-x---    1 svn      svn        150360 Aug  8 17:23 /usr/local/bin/svnserve
-r-xr-x---    1 svn      svn         77564 Aug  8 17:23 /usr/local/bin/svnversion

Aquí puede ser un buen momento para preguntar al usuario qué cuentas del sistema podrán ejecutar los comandos de svn y los añadiremos al grupo “svn”

chupete:/var# usermod -G svn rluna
chupete:/var# usermod -G svn pruebas1

Aquí crearemos el directorio donde se alojará el repositorio. El directorio lo creará el usuario que ejecuta este script y luego cambiará los permisos para el usuario svn:

Haremos su svn y ejecutaremos:

umask 002
svnadmin create /var/svn

Luego, pondremos los permisos de la siguiente forma (comprobar si esto es realmente necesario):

chonw svn:svn /var/svn * -R
chmod  775 /var/svn/conf
chmod  600 /var/svn/conf/passwd
chmod  600 /var/svn/conf/svnserve.conf
chmod  775 /var/svn/dav
chmod 2775 /var/svn/db
chmod 2775 /var/svn/db/transactions
chmod 2775 /var/svn/db/revprops
chmod  664 /var/svn/db/revprops/0
chmod 2775 /var/svn/db/revs
chmod  664 /var/svn/db/revs/0
chmod  664 /var/svn/db/current
chmod  664 /var/svn/db/fs-type
chmod  664 /var/svn/db/uuid
chmod  664 /var/svn/db/write-lock
chmod  775 /var/svn/hooks
chmod  644 /var/svn/hooks/*tmpl
chmod  775 /var/svn/locks
chmod  664 /var/svn/locks/*lock
chmod  444 /var/svn/format
chmod  775 /var/svn/

Configuración del acceso remoto al repositorio

Para el caso de ejecutar svnserve desde el superdemonio de internet, haremos:

chupete:~# joe /etc/services
[....]
mysql           3306/tcp                        # MySQL
mysql           3306/udp                        # MySQL
svn             3690/tcp                        # Subversion
svn             3690/udp                        # Subversion
rfe             5002/tcp                        # Radio Free Ethernet
rfe             5002/udp                        # Actually uses UDP only
chupete:/etc# joe xinetd.conf
# Subversion
service svn
{
        socket_type     = stream
        protocol        = tcp
        wait            = no
        user            = svn
        group           = svn
        umask           = 002
        server          = /usr/local/bin/svnserve
        server_args     = -i -r /var/svn
}
chupete:/var/svn/conf# joe svnserve.conf
[general]
### These options control access to the repository for unauthenticated
### and authenticated users.  Valid values are "write", "read",
### and "none".  The sample settings below are the defaults.
anon-access = read
auth-access = write
### The password-db option controls the location of the password
### database file.  Unless you specify a path starting with a /,
### the file's location is relative to the conf directory.
### Uncomment the line below to use the default password file.
# password-db = passwd
### This option specifies the authentication realm of the repository.
### If two repositories have the same authentication realm, they should
### have the same password database, and vice versa.  The default realm
### is repository's uuid.
realm = Project TAS repository

También es necesario configurar adecuadamente el fichero passwd que se encuentra en el mismo directorio:

chupete:/var/svn/conf# more passwd
### The name and password for each user follow, one account per line.

[users]
rluna=pepinillo

Finalmente, haremos las siguientes pruebas en el sistema para verificar que el cambio de permisos ha funcionado:

  1. un usuario que no pertenezca al grupo “svn” intentará crear un repositorio
  2. un usuario que sí pertenezca al grupo “svn” intentará crear un repositorio
  3. con el repositorio que hemos creado anteriormente, añadiremos un fichero
  4. a través del super-demonio de internet, haremos un checkout
linux/securingsubversion.txt · Last modified: 2014/12/24 10:42 (external edit)