El programa svnserve es un servidor ligero,
capaz de hablar a clientes sobre TCP/IP utilizando un
protocolo con estado personalizado.
Los clientes contactan un servidor svnserve
utilizando URLs que comienzan con el esquema svn://
o svn+ssh://
. Esta sección explica las
diferentes maneras de ejecutar un svnserve, cómo
los clientes se autentican ellos mismos con el servidor, y cómo
se configura un control de acceso apropiado a su repositorio.
Existen unas cuantas maneras diferentes de invocar
el programa svnserve. Si se lo invoca
sin argumentos, usted no verá nada más que un mensaje de
ayuda. No obstante, si planea que inetd
dispare el proceso, puede pasar la opción -i
(--inetd
):
$ svnserve -i ( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) )
Cuando es invocado con la opción --inetd
,
svnserve intenta comunicarse con un
cliente Subversion a través de stdin y
stdout utilizando un protocolo
personalizado. Este es un comportamiento estándar de los
programas que son ejecutados a través de inetd.
El IANA
ha reservado el puerto 3690 para el protocolo
Subversion, por lo tanto en un sistema tipo Unix usted puede
agregar líneas a /etc/services
como éstas
(si es que no existen todavía):
svn 3690/tcp # Subversion svn 3690/udp # Subversion
Y si su sistema utiliza un demonio inetd
tipo Unix clásico, puede agregar esta línea a
/etc/inetd.conf
:
svn stream tcp nowait svnowner /usr/local/bin/svnserve svnserve -i
Asegúrese que “svnowner” es un usuario que posee permisos apropiados para acceder a su repositorio. Ahora, cuando una conexión cliente ingrese a su servidor en el puerto 3690, inetd disparará un proceso svnserve para servirlo.
Una segunda opción es ejecutar svnserve
un proceso “demonio” independiente. Para esto,
utilice la opción -d
:
$ svnserve -d $ # svnserve is now running, listening on port 3690
Cuando svnserve ejecute en modo demonio,
usted puede utilizar las opciones --listen-port=
y --listen-host=
para personalizar el puerto
y nombre exacto en el cual “escuchará”.
Aún queda una tercera forma de invocar a svnserve,
y esa es en “modo túnel”, con la opción -t
.
Este modo supone que un programa de servicio remoto tal como
RSH o SSH ha autenticado un
cliente exitosamente y ahora está invocando un proceso privado
svnserve como tal usuario.
El programa svnserve se comporta normalmente
(comunicándose a través de stdin y
stdout), y asume que el tráfico está siendo
redirigido automáticamente a través de algún tipo de túnel
de vuelta al cliente. Cuando svnserve es
invocado por un agente túnel como éste, está seguro que el usuario
autenticado posee acceso total de lectura y escritura a los archivos
de la base de datos del repositorio. (Ver Servidores y Permisos: Una Palabra de Advertencia.) Esencialmente es lo mismo que
un usuario local accediendo al repositorio a través de
las URLs file:///
.
Una vez el programa svnserve se esté
ejecutando, hace que cada repositorio en su sistema se
encuentre disponibles a la red. Un cliente necesita especificar
una ruta absoluta en la URL del repositorio.
Por ejemplo, si un repositorio se encuentra ubicado en
/usr/local/repositories/project1
, el cliente
accederá a través de svn://host.example.com/usr/local/repositories/project1
. Para incrementar la seguridad, usted puede pasar
la opción -r
a svnserve,
que limita a exportar sólo los repositorios debajo de esa
ruta:
$ svnserve -d -r /usr/local/repositories …
En efecto, utilizando la opción -r
modifica la ubicación que el programa tratará como raíz del
espacio de sistema de archivos remoto. En consecuencia,
los clientes utilizarán URLs que tengan la porción que
le ha sido removida de la ruta, dejando URLs mucho más cortas
(y mucho menos reveladoras):
$ svn checkout svn://host.example.com/project1 …
Cuando un cliente se conecta a un proceso svnserve, las siguientes cosas suceden:
El cliente selecciona un repositorio específico.
El servidor procesa el archivo
conf/svnserve.conf
del repositorio, y comienza
a poner en ejecución cualquier política de autenticación y autorización
definida en éste.
Dependiendo de la situación y las políticas de autorización,
se le puede permitir al cliente realizar pedidos de forma anónima, y sin haber recibido la demanda de autenticación, O
el cliente puede ser consultado por la autenticación en cualquier momento, O
si opera en el “modo túnel”, el cliente se anuncia a sí mismo que ya ha sido autenticado externamente.
En el momento de escribir estas líneas, el servidor sólo sabe cómo realizar la autenticación por CRAM-MD5 [29]. En esencia, el servidor envía unos pocos datos al cliente. El cliente usa el algoritmo hash MD5 para crear una huella digital de los datos y la palabra clave combinados, y envía la huella digital como respuesta. El servidor realiza el mismo cálculo con la palabra clave almacenada para verificar que el resultado es idéntico. En ningún momento el password real viaja a través de la red.
También es posible, por supuesto, que el cliente se autentifique externamente vía agente de túnel , como por ejemplo SSH. En este caso, el servidor simplemente examina el usuario bajo el cual se está ejecutando, y lo usa durante la autenticación.
Tal y como habrá imaginado, el fichero
svnserve.conf
es el mecanismo
central de un repositorio para controlar las políticas de
autenticación y autorización. El fichero sigue el mismo
formato que otros ficheros de configuración (vea “Área de configuración de parámetros de ejecución”): los nombres de sección
están enmarcados por corchetes ([
y ]
), los comentarios comienzan
con almohadillas (#
), y cada sección
contiene variables específicas que pueden ser modificadas
(variable = valor
). Démonos un paseo
por este fichero para aprender a usarlas.
Por ahora, la sección [general]
de
svnserve.conf
tiene todas las
variables que usted necesita. Comencemos definiendo un
fichero que contenga nombres de usuario y palabras clave,
y una realm de autenticación:
[general] password-db = userfile realm = example realm
El nombre realm
es algo que
define usted. Le dice a los clientes a qué tipo de
“espacio de nombres de autenticación” se están
conectando; el cliente de Subversion lo muestra durante
las preguntas de autenticación, y lo usa como palabra clave
(junto con el nombre y puerto del servidor) para cachear
las credenciales en disco
(vea “Client Credentials Caching”.) La variable
password-db
apunta a un fichero separado
que contiene una lista de nombres de usuario y claves,
usando el mismo formato familiar. Por ejemplo:
[users] harry = foopassword sally = barpassword
El valor de password-db
puede ser
una ruta absoluta o relativa al fichero de usuarios. Para
muchos administradores, es sencillo guardar el
fichero justo en el área conf/
del
repositorio, junto a svnserve.conf
.
Por otra parte, es posible querer compartir el mismo
fichero de usuarios entre dos o más repositorios; en este
caso, el fichero probablemente debería ubicarse en un lugar
más público. Los repositorios que compartan el fichero
de usuarios también deberían estar configurados para
usar la misma realm, dado que la lista de usuarios define
esencialmente un realm de autenticación. Esté donde esté el
fichero, asegúrese de ajustar apropiadamente los permisos
de lectura y escritura. Si sabe bajo qué usuario(s) se
ejecutará svnserve, restrinja el acceso
de lectura al fichero correspondientemente.
Hay dos variables más en el fichero
svnserve.conf
: determinan qué
pueden hacer los usuarios autenticados y sin autenticar
(anónimos). Las variables anon-access
y auth-access
pueden tener los valores
none
, read
,
o write
. Poner el valor a
none
restringe el acceso de todo tipo;
read
permite únicamente el acceso de
sólo lectura al repositorio, y write
permite acceso completo de lectura y escritura.
Por ejemplo:
[general] password-db = userfile realm = example realm # anonymous users can only read the repository anon-access = read # authenticated users can both read and write auth-access = write
Los parámetros del ejemplo, son de hecho los valores por defecto de las variables, en caso de que olvide definirlas. Si desea ser aun más conservativo, puede bloquear el acceso anónimo completamente:
[general] password-db = userfile realm = example realm # anonymous users aren't allowed anon-access = none # authenticated users can both read and write auth-access = write
Fíjese que svnserve sólo entiende de control de acceso “básico”. Un usuario tiene acceso universal de lectura escritura, acceso universal de lectura, o ningún tipo de acceso. No hay control detallado del acceso a rutas específicas dentro del repositorio. Para muchos proyectos y equipos, este nivel de control de acceso es más que suficiente. No obstante, si necesita control de acceso por directorio, tendrá que usar Apache en lugar de svnserve como su proceso servidor.
La autenticación de serie de svnserve puede ser muy útil, porque evita tener que crear cuentas de sistema reales. Por otro lado, algunos administradores ya tienen entornos de autenticación SSH bien establecidos y funcionando. En estas situaciones, todos los usuarios del proyecto tienen cuentas en el sistema y la habilidad para conectarse con SSH a la máquina servidora.
Es fácil usar SSH junto con
svnserve. El cliente simplemente usa
el esquema de URL svn+ssh://
para
conectar:
$ whoami harry $ svn list svn+ssh://host.example.com/repos/project harry@host.example.com's password: ***** foo bar baz …
Lo que sucede en esta situación es que el cliente de
Subversion invoca el proceso local ssh,
conectándolo con host.example.com
,
autenticándose como el usuario juan
, y
entonces lanzando un proceso svnserve
privado en la máquina remota, que se ejecuta como
el usuario juan
. El comando
svnserve se invoca en modo túnel
(-t
) y todo el protocolo de red es
canalizado a través “tunneled” de la conexión
cifrada por ssh, el agente del túnel.
svnserve se da cuenta de que se está
ejecutando como el usuario juan
, y si
el cliente realiza cambios en el repositorio, el nombre de
usuario autenticado será usado para atribuir la autoría de
la nueva revisión.
Cuando se usa un túnel, la autorización es principalmente
controlada por los permisos del sistema operativo a los
ficheros de la base de datos del repositorio; es casi
igual que si Juan estuviese accediendo al repositorio
directamente vía URL file:///
. Si
necesita que múltiples usuarios del sistema accedan al
repositorio directamente, podría ponerlos en un mismo grupo,
y ajustar cuidadosamente sus umasks. (Asegúrese de haber leído “Ofrecer múltiples métodos de acceso al repositorio”.) Pero incluso en el caso de usar
túneles, el fichero svnserve.conf
todavía puede ser usado para bloquear el acceso,
simplemente usando auth-access = read
o auth-access = none
.
Podría pensar que la historia del túnel por SSH acabaría
aquí, pero no lo hace. Subversion le permite
personalizar el comportamiento de los túneles en su
fichero de configuración config
(vea “Área de configuración de parámetros de ejecución”.) Por ejemplo,
supongamos que desea usar RSH en lugar de SSH. En
la sección [tunnels]
de su fichero
config
, defina lo siguiente:
[tunnels] rsh = rsh
Y ahora, usted puede usar esta nueva definición de
túnel usando un esquema URL que concuerde
con el nombre de su nueva variable:
svn+rsh://host/path
. Cuando
use el nuevo esquema URL, el cliente Subversion
estará ejecutando realmente el comando rsh
host svnserve -t tras las cortinas. Si
incluye un nombre de usuario en la URL (por ejemplo,
svn+rsh://nombreusuario@host/path
) el
cliente también lo incluirá en su comando (rsh
nombreusuario@host svnserve -t.) Pero puede
definir nuevos esquemas de túneles mucho más elaborados
que eso:
[tunnels] joessh = $JOESSH /opt/alternate/ssh -p 29934
Este ejemplo muestra varias cosas. Primero, enseña cómo
hacer que el cliente de Subversion lance un
binario de túnel muy específico (uno ubicado
en /opt/alternate/ssh
) con
opciones específicas. En este caso, acceder a la
URL svn+joessh://
invocaría este
particular binario de SSH con -p 29934
como parámetro—útil si desea que el programa de túnel
se conecte a un puerto no estándar.
Segundo, enseña cómo definir una nueva variable de
entorno personalizada que puede reemplazar el nombre de
un programa de túnel. Modificar la variable de entorno
SVN_SSH
es un modo conveniente de
reemplazar el agente de túneles SSH por defecto. Pero
si necesita tener diferentes reemplazos para servidores
diferentes, cada uno de ellos conectando quizás a un
puerto diferente o usando un conjunto diferente de
opciones, puede usar el mecanismo demostrado en este
ejemplo. Ahora, si fuese a crear la variable de entorno
JOESSH
, su valor reemplazaría el valor
completo de la variable del túnel—se ejecutaría
$JOESSH en lugar de /opt/alternate/ssh -p
29934
.