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:
- establecer un path seguro
- 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:
- un usuario que no pertenezca al grupo “svn” intentará crear un repositorio
- un usuario que sí pertenezca al grupo “svn” intentará crear un repositorio
- con el repositorio que hemos creado anteriormente, añadiremos un fichero
- a través del super-demonio de internet, haremos un checkout