====== 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