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