Servidor Basado en Svnserve

Introducción

Subversion incluye Svnserve - un servidor ligero y autónomo que utiliza un protocolo propio sobre una conexión TCP/IP ordinaria. Es ideal para las instalaciones más pequeñas, o donde no se pueda utilizar un servidor completo Apache.

En la mayoría de los casos svnserve es más fácil de instalar y se ejecuta más rápido que el servidor basado en Apache, aunque no tiene algunas de las características más avanzadas. Y ahora que se incluye soporte SASL es fácil hacerlo seguro también.

Instalando svnserve

  1. Obtenga la última versión de Subversion desde http://subversion.apache.org/getting.html. Alternativamente obtenga un instalador pre-empaquetado desde CollabNet en http://www.collab.net/downloads/subversion. Este instalador pondrá svnserve como un servicio de Windows, y también incluye algunas de las herramientas que necesitará si va a utilizar SASL para la seguridad.

  2. Si ya tiene una versión de Subversion instalada, y svnserve se está ejecutando, necesitará pararlo antes de continuar.

  3. Ejecute el instalador de Subversion. Si ejecuta el instalador en su servidor (recomendado) puede saltarse el paso 4.

  4. Abra el explorador de Windows, vaya al directorio de instalación de Subversion (normalmenteC:\Archivos de programa\Subversion) y en el directorio bin, localice los archivos svnserve.exe, intl3_svn.dll, libapr.dll, libapriconv.dll, libapriutil.dll, libdb*.dll, libeay32.dll y ssleay32.dll - copie estos archivos, o simplemente copie todo el contenido del directorio bin, a un directorio de su servidor, por ejemplo c:\svnserve

Ejecutando svnserve

Ahora que svnserve está instalado, necesitará ejecutarlo en su servidor. La forma más sencilla es ejecutar lo siguiente desde una ventana DOS o bien crear un acceso directo de Windows:

svnserve.exe --daemon

svnserve ahora se iniciará esperando peticiones entrantes en el puerto 3690. La opción --daemon le dice a svnserve que se ejecute como un servicio, por lo que continuará ejecutándose hasta que manualmente se le mande terminar.

Si aún no ha creado un repositorio, siga las instrucciones dadas en la instalación del servidor basado en Apache “Configuración”.

Para comprobar que svnserve está funcionando, utilice TortoiseSVNNavegador para ver un repositorio.

Asumiendo que su repositorio está en c:\repos\TestRepo, y que su servidor se llama localhost, introduzca:

svn://localhost/repos/TestRepo

cuando le pregunte el navegador de repositorios.

También puede incrementar la seguridad y ahorrar tiempo introduciendo URLs con svnserve utilizando la opción --root para cambiar la ruta raíz y restringir el acceso a un directorio concreto del servidor:

svnserve.exe --daemon --root unidad:\ruta\al\repositorio

Utilizando el test anterior como guía, se debería ejecutar svnserve así:

svnserve.exe --daemon --root c:\repos

Y en TortoiseSVN la URL del navegador de repositorios se acorta así:

svn://localhost/TestRepo

Tenga en cuenta que la opción --root también se necesita si su repositorio está en una unidad o partición diferente del lugar donde está svnserve en su servidor.

Svnserve podrá servir un número de repositorios arbitrario. Simplemente colóquelos en algún lugar bajo la carpeta raíz que acaba de definir, y acceda a ellos utilizando una URL relativa a esa raíz.

Aviso

No cree o acceda a un repositorio Berkeley DB en una unidad de red compartida. No puede existir en un sistema de archivos remoto. Ni siquiera si tiene la unidad de red mapeada a una letra de unidad. Si intenta usar Berkeley DB en una unidad de red compartida, los resultados son imprevisibles - puede ver desde el principio errores misteriosos, o pueden pasar meses antes que descubra que su base de datos del repositorio está corrupta de una forma inimaginable.

Ejecutar svnserve como un servicio

Ejecutar svnserve como un usuario normalmente no es la mejor forma de hacerlo. Eso significa que siempre debe haber un usuario con la sesión iniciada en su servidor, y que debe acordarse de iniciarlo de nuevo tras cada reinicio. Una manera mejor es ejecutar svnserve como un servicio de Windows. Desde la versión 1.4 de Subversion, svnserve puede instalarse como un servicio de Windows nativo.

Para instalar svnserve como un servicio de Windows nativo, ejecute el siguiente comando todo en una línea para crear un servicio que se ejecute automáticamente cuando se inicie Windows.

sc create svnserve binpath= "c:\svnserve\svnserve.exe --service 
    --root c:\repos" displayname= "Subversion" depend= tcpip 
    start= auto

Si cualquiera de las rutas incluye espacios, tendrá que utilizar comillas (escapadas) en la ruta, como en este ejemplo:

sc create svnserve binpath= "
    \"C:\Archivos de programa\Subversion\bin\svnserve.exe\"
    --service --root c:\repos" displayname= "Subversion"
    depend= tcpip start= auto

También puede añadir una descripción después de crear el servicio. Esta descripción se mostrará en el Administrador de Servicios de Windows.

sc description svnserve "Servidor de Subversion (svnserve)"

Tenga en cuenta el formato no muy usual de la línea de comandos utilizado por sc. En los pares key= value no debe haber espacio entre la clave y el = pero sí debe haber un espacio antes del valor.

Sugerencia

Microsoft ahora recomienda que los servicios se ejecuten o con la cuenta de Servicio Local o con la cuenta de Servicio de Red. Tiene más información en The Services and Service Accounts Security Planning Guide. Para crear el servicio bajo la cuenta de Servicio Local, añada lo siguiente al ejemplo anterior.

obj= "NT AUTHORITY\LocalService"

Tenga en cuenta que deberá proporcionar a la cuenta de Servicio Local los permisos apropiados tanto para Subversion como para sus repositorios, y también a cualquier aplicación que utilicen los scripts gancho. El grupo por defecto para esto se llama "LOCAL SERVICE".

Una vez que haya instalado el servicio, necesitará ir al administrador de servicios para arrancarlo (sólo por esta vez; arrancará automáticamente cuando se reinicie el servidor).

Para obtener información más detallada, refiérase a Soporte de servicio de Windows para Svnserve.

Si ha instalado una versión anterior de svnserve utilizando el programa SVNService, y ahora quiere utilizar el soporte nativo, deberá desregistrar el programa SVNService como servicio (¡recuerde parar el servicio antes!). Símplemente utilice el comando

svnservice -remove

para eliminar la entrada del registro del servicio.

Autentificación básica con svnserve

La configuración por defecto de svnserve proporciona acceso anónimo de sólo-lectura. Esto significa que puede utilizar una URL de tipo svn:// para obtener y actualizar, o utilizar el navegador de repositorios en TortoiseSVN para ver el repositorio, pero no podrá confirmar ningún cambio.

Para permitir acceso de escritura en un repositorio, necesitará editar el archivo conf/svnserve.conf en el directorio de su repositorio. Este archivo controla la configuración del servicio svnserve, y también contiene información útil.

Puede habilitar el acceso anónimo para escritura simplemente poniendo:

[general]
anon-access = write

Sin embargo, no sabrá quién ha hecho cambios en el repositorio, dado que la propiedad svn:author estará vacía. Tampoco podrá controlar quién puede hacer cambios en el repositorio. ¡Esta es una configuración algo arriesgada!

Una forma de conseguir esto es crear una base de datos de contraseñas:

[general]
anon-access = none
auth-access = write
password-db = ficherodeusuarios

Donde ficherodeusuarios es un archivo que existe en el mismo directorio que svnserve.conf. Este archivo también puede estar en cualquier otro sitio de su sistema de archivos (útil cuando tiene múltiples repositorios que necesitan los mismos derechos de acceso) y puede ser referenciado utilizando una ruta absoluta, o una ruta relativa del directorio conf. Si incluye una ruta, debe estar escrita /a/la/forma/de/unix. No funcionará si utiliza \ o letras de unidades. El ficherodeusuarios debería tener una estructura como ésta:

[users]
usuario = contraseña
...

Este ejemplo denegaría cualquier acceso a los usuarios no autentificados (anónimos), y daría acceso de lectura-escritura a los usuarios listados en ficherodeusuarios.

Sugerencia

Si mantiene múltiples repositorios utilizando la misma base de datos de contraseñas, la utilización de un dominio de autentificación le hará la vida más fácil a los usuarios, dado que TortoiseSVN puede almacenar en caché sus credenciales para que sólo tenga que introducirlas una vez. Se puede encontrar más información en el libro de Subversion, específicamente en las secciones Crear un archivo 'users' y un dominio y Caché de credenciales de cliente

Mejor seguridad con SASL

¿Qué es SASL?

La Capa de seguridad y autenticación simple Cyrus (Cyrus Simple Authentication and Security Layer) es un software de código abierto escrito por la Universidad de Carnegie Mellon. Añade capacidades genéricas de autenticación y encriptación a cualquier protocolo de red, y desde Subversion 1.5 y posteriores, tanto el servidor svnserve como el cliente TortoiseSVN saben cómo hacer uso de esta biblioteca.

Para una discusión más completa de las opciones disponibles, debería leer el libro de Subversion en la sección Utilizando svnserve con SASL. Si simplemente está buscando una forma sencilla para poner autenticación y encriptación en un servidor Windows, para que su repositorio pueda accederse de forma segura a través del gran y malvado Internet, siga leyendo.

Autentificación SASL

Para activar los mecanismos específicos SASL en el servidor, necesitará hacer tres cosas. Primero, cree una sección [sasl] en el archivo svnserve.conf de su repositorio, con este par de clave-valor:

use-sasl = true

En segundo lugar, cree un archivo llamado svn.conf en un lugar conveniente - típicamente en el directorio donde está instalado Subversion.

En tercer lugar, cree dos nuevas entradas de registro para indicar a SASL dónde encontrar las cosas. Cree una clave de registro llamada [HKEY_LOCAL_MACHINE\SOFTWARE\Carnegie Mellon\Project Cyrus\SASL Library] y ponga dos nuevos valores de cadena dentro: SearchPath establecido a la carpeta que contiene los plug-ins sasl*.dll (normalmente en la carpeta de instalación de Subversion), y ConfFile establecido a la carpeta que contiene el archivo svn.conf. Si ha utilizado el instalador CollabNet, estas claves de registro ya habrán sido creadas por usted.

Edite el archivo svn.conf para que contenga lo siguiente:

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: DIGEST-MD5
sasldb_path: C:\TortoiseSVN\sasldb

La última línea muestra el lugar de la base de datos de autenticación, que es un archivo llamado sasldb. Este puede estar en cualquier sitio, pero una elección conveniente es la carpeta padre del repositorio. Asegúrese que el servicio svnserve tiene acceso de lectura sobre este archivo.

Si svnserve ya está ejecutándose, necesitará reiniciarlo para asegurarse que lee la configuración actualizada.

Ahora que todo está preparado, todo lo que necesita es crear algunos usuarios y contraseñas. Para hacerlo, necesitará el programa saslpasswd2. Si ha usado el instalador CollabNet, ese programa estará en el diretorio de instalación. Utilice un comando como este:

saslpasswd2 -c -f C:\TortoiseSVN\sasldb -u realm username

La opción -f establece el lugar de la base de datos, realm debe ser el mismo valor que ha definido en el archivo svnserve.conf de su repositorio, y el nombre de usuario es exactamente lo que se supone que es. Tenga en cuenta que el realm no admite espacios en blanco.

Puede listar los nombres de usuarios almacenados en la base de datos utilizando el programa sasldblistusers2.

Encriptación SASL

Para habilitar o deshabilitar diferentes niveles de encriptación, puede poner dos valores en el archivo svnserve.conf de su repositorio:

[sasl]
use-sasl = true
min-encryption = 128
max-encryption = 256

Las variables min-encryption y max-encryption controlan el nivel de encriptación demandado por el servidor. Para deshabilitar la encriptación completamente, establezca ambos valores a 0. Para habilitar la suma simple de comprobación (por ejemplo, previene alteraciones y garantiza la integridad de los datos sin encriptación), establezca ambos valores a 1. Si desea permitir (pero no requerir) encriptación, establezca el valor mínimo a 0 y el valor máximo a alguna longitud de bits. Para requerir encriptación incondicional, establezca ambos valores a números mayores de 1. En nuestro ejemplo anterior, requerimos a los clientes encriptación de al menos 128-bits, pero no más de 256-bits.

Autentificación con svn+ssh

Otra forma de autentificar a los usuarios con un servidor basado en svnserve es utilizar un shell seguro (SSH) para encapsular las peticiones a través suyo. No es tan sencillo de preparar como SASL, pero puede ser útil en algunos casos.

Con esta aproximación, svnserve no se ejecuta como un servicio, en cambio, el shell seguro inicia svnserve por usted, ejecutándolo como el usuario autentificado SSH. Para habilitar esto, necesita un servicio de shell seguro en su servidor.

En Apéndice G, Asegurando Svnserve utilizando SSH tiene un método básico para preparar su servidor. Puede encontrar otros temas SSH en el FAQ buscando “SSH”.

Puede encontrar más información sobre svnserve en el libro Control de versiones con Subversion.

Autorización basada en rutas con svnserve

Empezando con Subversion 1.3, svnserve soporta el mismo esquema de autorización basada en rutas que está disponible en el módulo mod_authz_svn de Apache. Necesita editar el archivo conf/svnserve.conf dentro del directorio de su repositorio y añadir una línea refiriéndose a su archivo de autorización.

[general]
authz-db = authz

Aquí, authz es un archivo que debe existir y que define los permisos de acceso. Puede utilizar un archivo separado por cada repositorio, o utilizar el mismo archivo para varios repositorios. Si desea una descripción del formato del archivo, lea “Autorización basada en rutas”.