httpd, el servidor HTTP Apache

El servidor HTTP apache es un servidor de red heavy duty que Subversion puede aprovechar. A través de un módulo propio, httpd permite servir a clientes repositorios Subversion por el protocolo WebDAV/DeltaV, el cual es una extensión sobre HTTP 1.1 (vea http://www.webdav.org/ para más información.) Este protocolo coge el ubicuo protocolo HTTP, núcleo de la World Wide Web, y añade la capacidad de escritura—específicamente el versionado de la misma. El resultado es un sistema robusto, estandarizado, empaquetado convenientemente como parte del software Apache 2.0, soportado por numerosos sistemas operativos y productos de terceros, y no necesita que sus administradores de red abran otro puerto adicional. [30] Si bien el servidor Apache-Subversion tiene más características que svnserve, también es más difícil de configurar. La flexibilidad a menudo se paga en complejidad.

Buena parte del texto siguiente incluye referencias a las directivas de configuración de Apache. Aunque proporcionamos algunos ejemplos que muestran el uso de estas directivas, describirlas con todo detalle está fuera del alcance de este capítulo. El equipo de Apache mantiene una documentación excelente, disponible públicamente en su página web en http://httpd.apache.org. Por ejemplo, una referencia general de las directivas de configuración está ubicada en http://httpd.apache.org/docs-2.0/mod/directives.html.

También, a medida que vaya realizando cambios en su configuración de Apache, es probable que en alguna parte cometerá algún fallo. Si no está familiarizado con el subsistema de archivos de registro de Apache, debería dedicarle un tiempo. En su fichero httpd.conf hay directivas que especifican ubicaciones físicas de los archivos de registro de acceso y error generados por apache (las directivas CustomLog y ErrorLog respectivamente). El módulo mod_dav_svn de Subversion usa también la interfaz de registro de mensajes de error de Apache. Siempre puede explorar el contenido de esos ficheros para encontrar información que podría revelar la fuente de un problema difícilmente discernible de otro modo.

Requisitos previos

Para hacer disponible su repositorio por HTTP, básicamente necesita cuatro componentes disponibles en dos paquetes. Necesita el comando httpd de Apache 2.0, el módulo DAV mod_dav que viene con él, Subversion, y el módulo mod_dav_svn, que proporciona sistemas de ficheros, distribuido con Subversion. Una vez tenga todos estos componentes, el proceso para hacer disponible su repositorio es tan simple como:

  • preparar y ejecutar httpd 2.0 con el módulo mod_dav,

  • instalar el plug-in mod_dav_svn para mod_dav, el cual usa las librerías de Subversion para acceder a un repositorio, y

  • configurar su fichero httpd.conf para exportar (o exponer) el repositorio.

Puede realizar los dos primeros pasos ya sea compilando httpd y Subversion a partir del código fuente, o instalando paquetes binarios precompilados en su sistema. Puede encontrar la información más actualizada sobre cómo compilar Subversion para su uso con el servidor HTTP Apache, al igual que cómo compilar y configurar Apache para este propósito, en el fichero INSTALL en el directorio raíz del código fuente de Subversion.

Configuración básica de Apache

Una vez tenga todos los componentes necesarios instalados en su sistema, todo lo que queda por hacer es configurar Apache mediante su fichero httpd.conf. Ordene a Apache que cargue el módulo mod_dav_svn module usando la directiva LoadModule. La directiva debe preceder cualquier otro elemento de configuración relacionado con Subversion. Si su Apache fue instalado usando el esquema por defecto, su módulo mod_dav_svn debería haber sido instalado en el subdirectorio modules de la instalación (a menudo /usr/local/apache2). La directiva LoadModule tiene una sintaxis sencilla, relacionando el nombre de un módulo con la ubicación de una librería dinámica en disco: disk:

LoadModule dav_svn_module     modules/mod_dav_svn.so

Tenga en cuenta que si mod_dav fue compilado como un objeto compartido (en lugar de haber sido enlazado de manera estática con el binario httpd), necesitará también una línea LoadModule similar para él. Asegúrese de que aparece antes de la línea mod_dav_svn:

LoadModule dav_module         modules/mod_dav.so
LoadModule dav_svn_module     modules/mod_dav_svn.so

En un lugar posterior de su fichero de configuración, necesita indicarle a Apache dónde guardará su repositorio (o repositorios) de Subversion. La directiva Location sigue una notación tipo XML, comenzando con una etiqueta de apertura y terminando con una de cierre, con varias otras directivas de configuración en medio. El propósito de la directiva Location es indicar a Apache que debe realizar algo especial cuando tenga que procesar peticiones dirigidas a una URL determinada o a una hija suya. En el caso de Subversion, quiere que Apache simplemente le pase el control a la capa DAV de todas las URLs que apunten a recursos versionados. Puede ordenar a Apache que delegue el control de todas las URLs cuyas porciones de rutas (aquella parte de la URL que sigue el nombre del servidor y número de puerto opcional) empiecen con /repos/ a un proveedor DAV cuyo repositorio se encuentre en /ruta/absoluta/al/repositorio usando la siguiente sintaxis de httpd.conf:

<Location /repos>
  DAV svn
  SVNPath /ruta/absoluta/al/repositorio
</Location>

Si planea soportar múltiples repositorios de Subversion que residirán en el mismo directorio padre de su disco local, puede usar una directiva alternativa, la directiva SVNParentPath, para indicar ese directorio padre común. Por ejemplo, si sabe que creará múltiples repositorios Subversion en el directorio /usr/local/svn que sería accesible mediante URLs como http://my.server.com/svn/repos1, http://my.server.com/svn/repos2, y así en adelante, podría usar la sintaxis de configuración httpd.conf del siguiente ejemplo:

<Location /svn>
  DAV svn

  # any "/svn/foo" URL will map to a repository /usr/local/svn/foo
  SVNParentPath /usr/local/svn
</Location>

Usando la sintaxis anterior, Apache delegará el control de todas las URLs cuyas porciones comiencen con /svn/ al proveedor DAV de Subversion, quien asumirá que todos los elementos en el directorio especificado por la directiva SVNParentPath son en realidad repositorios de Subversion. Esta es una sintaxis particularmente conveniente, ya que a diferencia de la directiva SVNPath, no necesita reiniciar Apache para crear y hacer disponibles nuevos repositorios.

Asegúrese de que cuando defina su nuevo Location, no se solapa con otras ubicaciones exportadas. Por ejemplo, si su DocumentRoot principal es /www, no exporte ningún repositorio Subversion en <Location /www/repos>. En caso de recibir una petición para la URI /www/repos/foo.c, Apache no sabrá si tiene que buscar el fichero repos/foo.c en DocumentRoot, o si debe delegar en mod_dav_svn para que devuelva foo.c del repositorio Subversion.

En este punto, debería considerar seriamente el tema de los permisos. Si ha estado ejecutando Apache durante algún tiempo como su servidor de web habitual, probablemente ya tenga una colección de contenido—páginas web, scripts y demás. Estos elementos ya han sido configurados con un conjunto de permisos que les permite funcionar con Apache, o de manera más apropiada, le permite a Apache funcionar con esos ficheros. Apache, cuando es usado como servidor de Subversion, también necesitará los permisos adecuados de lectura y escritura a su repositorio Subversion. (Vea Servidores y Permisos: Una Palabra de Advertencia.)

Tendrá que encontrar una configuración de permisos de sistema que satisfaga los requisitos de Subversion sin estropear instalaciones ya existentes de páginas web o scripts. Esto podría significar cambiar los permisos de su repositorio Subversion para que encajen con aquellos usados por otras elementos servidos por Apache, o podría significar usar las directivas User y Group del fichero httpd.conf para especificar que Apache debe ejecutarse con el usuario y grupo a quien pertenece su repositorio Subversion. No hay una única manera correcta de configurar sus permisos, y cada administrador tendrá diferentes razones para hacer las cosas a su manera. Sólo tenga presente que los problemas relacionados con los permisos son quizás el fallo más común cuando se configura un repositorio Subversion para ser usado con Apache.

Opciones de autenticación

En este punto, si ha configurado httpd.conf para que contenga algo como

<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
</Location>

...entonces su repositorio es accesible al mundo de manera anónima. Hasta que configure algunas políticas de autenticación y autorización, los repositorios Subversion que haga disponibles con la directiva Location serán generalmente accesibles por cualquiera. En otras palabras,

  • cualquiera puede usar su cliente de Subversion para obtener una copia local de la URL de un repositorio (o cualquiera de sus subdirectorios),

  • cualquiera puede navegar de manera interactiva las últimas revisiones del repositorio simplemente usando la URL del repositorio con su navegador web, y

  • cualquiera puede enviar cambios al repositorio.

Autenticación HTTP básica

La forma más sencilla de autenticar a un cliente es mediante el mecanismo de autenticación HTTP básico, que simplemente usa un nombre de usuario y clave para verificar que el usuario es quien dice ser. Apache proporciona la utilidad htpasswd para gestionar la lista de nombres de usuarios y claves aceptables, aquellos a quienes desea proporcionar acceso especial a su repositorio Subversion. Permitamos el acceso de escritura a Juan y Carmen. Primero, necesitamos añadirlos al fichero de claves.

$ ### First time: use -c to create the file
$ ### Use -m to use MD5 encryption of the password, which is more secure
$ htpasswd -cm /etc/svn-auth-file harry
New password: ***** 
Re-type new password: *****
Adding password for user harry
$ htpasswd /etc/svn-auth-file -m sally
New password: *******
Re-type new password: *******
Adding password for user sally
$

Ahora, necesitamos añadir algunas directivas httpd.conf más dentro del bloque Location para decirle a Apache qué hacer con su nuevo fichero de claves. La directiva AuthType especifica el tipo del sistema de autenticación que va a usar. En este caso, queremos especificar el sistema de autenticación Basic. AuthName es un nombre arbitrario que usted proporciona para el dominio de autenticación. La mayoría de los navegadores mostrarán este nombre en una ventana de diálogo emergente cuando el navegador le pregunte su nombre y clave. Finalmente, use la directiva AuthUserFile para especificar la ubicación del fichero de claves creado usando htpasswd.

Tras añadir estas tres directivas, su bloque <Location> debería tener un aspecto similar a este:

<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /etc/svn-auth-file
</Location>

Este bloque <Location> todavía no está completo, y no hará nada útil. Meramente indica a Apache que cuando requiera autorización, Apache debe obtener el nombre de usuario y clave del cliente Subversion. Lo que falta aquí, no obstante, son las directivas que le dicen a Apache qué tipos de solicitudes por parte de los clientes requieren autorización. Donde se requiera autorización, Apache demandará también autenticación. Lo mas sencillo es proteger todas las peticiones. Añadir Require valid-user indica a Apache que todas las peticiones requieren un usuario autenticado:

<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /etc/svn-auth-file
  Require valid-user
</Location>

Asegúrese de leer la siguiente sección (“Opciones de autorización”) para más detalles sobre la directiva Require y otros modos de establecer políticas de autorización.

Una advertencia: en la autenticación básica por HTTP las palabras claves viajan por la red casi como texto simple, y son por lo tanto extremadamente inseguras. Si está preocupado por la existencia de un rastreador de claves, lo mejor sería usar algún tipo de cifrado SSL, para que los clientes se autentiquen vía https:// en lugar de http://; como mínimo podrá configurar Apache para que use use un certificado firmado por sí mismo. [31] Consulte la documentación de Apache (y la de OpenSSL) para saber cómo hacer esto.

Gestión de certificados SSL

Las empresas que necesitan exponer sus repositorios a un acceso externo al firewall de la compañía deberían ser conscientes de que grupos no autorizados podrían estar rastreando su tráfico de red. SSL consigue que ese tipo de atención no deseada desemboque con menor probabilidad en fugas de datos sensitivos.

Si se compila un cliente de Subversion para que use OpenSSL, entonces ganará la habilidad de hablar con un servidor Apache vía URLs https://. La librería Neon usada por el cliente Subversion no solo es capaz de verificar los certificados de servidor, sino que también puede proporcionar certificados de cliente cuando sean solicitados. Una vez el cliente y servidor hayan intercambiado sus certificados SSL y realizado una autenticación mutua con éxito, todas sus comunicaciones siguientes serán cifradas con una clave de sesión.

Está fuera del alcance de este libro describir la generación de certificados de cliente y servidor, y cómo configurar Apache para usarlos. Muchos otros libros, incluyendo la propia documentación de Apache, describen esta tarea. Pero lo que podemos cubrir aquí es cómo gestionar los certificados de cliente y servidor desde un cliente Subversion ordinario.

Cuando un cliente Subversion se comunica con Apache vía https://, puede recibir dos tipos diferentes de información:

  • un certificado de servidor

  • una demanda de un certificado de cliente

Si el cliente recibe un certificado de servidor, necesita verificar que confía en el certificado: ¿es realmente el servidor quien dice ser? La librería OpenSSL realiza esto examinando al firmante del certificado de servidor o la autoridad certificadora (CA). Si OpenSSL no es capaz de confiar automáticamente en la CA, o bien ocurre algún otro problema (como que el certificado expiró o no concuerda con el nombre del servidor), el cliente de línea de comando de Subversion le preguntará si quiere confiar en el certificado del servidor de todas maneras:

$ svn list https://host.example.com/repos/project

Error validating server certificate for 'https://home.example.com:443':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
Certificate information:
 - Hostname: host.example.com
 - Valid: from Jan 30 19:23:56 2004 GMT until Jan 30 19:23:56 2006 GMT
 - Issuer: CA, example.com, Sometown, California, US
 - Fingerprint: 7d:e1:a9:34:33:39:ba:6a:e9:a5:c4:22:98:7b:76:5c:92:a0:9c:7b

(R)eject, accept (t)emporarily or accept (p)ermanently?

Este diálogo debería parecerle familiar; es esencialmente la misma pregunta que ha observado proveniente de su navegador web (¡que es meramente otro cliente HTTP como Subversion!). Si elige la opción (p)ermanente, el certificado de servidor será guardado en el área auth/ de su fichero privado de configuración de parámetros de ejecución, del mismo modo que es guardado su nombre de usuario y clave (vea “Client Credentials Caching”.) Si se cachea, Subversion recordará confiar de manera automática en este certificado en futuras negociaciones.

Su fichero servers del área de la configuración de parámetros de ejecución también le permite a su cliente de Subversion confiar de manera automática en CAs específicos, ya sea de manera global o individual. Simplemente modifique la variable ssl-authority-files para que sea una lista de certificados de CA con codificación PEM separados por punto y coma:

[global]
ssl-authority-files = /path/to/CAcert1.pem;/path/to/CAcert2.pem

Muchas instalaciones de OpenSSL confían por defecto de manera casi universal en un conjunto predefinido de CAs. para hacer que el cliente Subversion confíe de manera automática en estas autoridades estándar, cambie la variable ssl-trust-default-ca a true.

Cuando dialoga con Apache, un cliente de Subversion también podría recibir una petición de certificado de cliente. Apache está solicitando al cliente que se identifique: ¿es el cliente realmente quien dice ser? Si todo va bien, el cliente de Subversion devuelve un certificado privado firmado por la CA en quien confía Apache. El certificado de cliente habitualmente se almacena cifrado en el disco, protegido por una palabra clave local. Cuando Subversion recibe esta petición, le preguntará tanto por la ruta al certificado como por la palabra clave que lo protege:

$ svn list https://host.example.com/repos/project

Authentication realm: https://host.example.com:443
Client certificate filename: /path/to/my/cert.p12
Passphrase for '/path/to/my/cert.p12':  ********
…

Tenga que el certificado de un cliente es un fichero p12. Para usar un certificado de cliente con Subversion, debe estar en el formato PKCS#12, que es un estándar portable. La mayoría de los navegadores son capaces de importar y exportar certificados en este formato. Otra opción es usar las herramientas de línea de comando de OpenSSL para convertir certificados existentes a PKCS#12.

De nuevo, el fichero servers del área de configuración de parámetros de ejecución le permite automatizar este proceso por cada máquina. Una o ambas informaciones pueden ser descritas en variables de ejecución:

[groups]
examplehost = host.example.com

[examplehost]
ssl-client-cert-file = /path/to/my/cert.p12
ssl-client-cert-password = somepassword

Una vez creadas las variables ssl-client-cert-file y ssl-client-cert-password, el cliente Subversion responderá automáticamente a peticiones de certificado de cliente sin tener que preguntarle. [32]

Opciones de autorización

En este punto, ya ha configurado la autenticación, pero no la autorización. Apache es capaz de cuestionar a los clientes y confirmar sus identidades, pero todavía no sabe cómo permitir o restringir el acceso a los clientes con esas identidades. Esta sección describe dos estrategias para controlar el acceso a sus repositorios.

Control de acceso simple

La forma de control de acceso más simple a un repositorio es autorizar a ciertos usuarios el acceso de sólo lectura, o lectura y escritura.

Puede restringir el acceso sobre todas las operaciones del repositorio añadiendo la directiva Require valid-user al bloque <Location>. Usando nuestro ejemplo anterior, esto equivaldría a que sólo los clientes que clamasen ser juan o carmen, y proporcionan la clave correcta para su usuario correspondiente, podrían hacer operaciones con el repositorio Subversion:

<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn

  # how to authenticate a user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /path/to/users/file
  
  # only authenticated users may access the repository
  Require valid-user
</Location>

A veces no necesita extremar tanto la seguridad. Por ejemplo, el propio repositorio de código fuente de Subversion ubicado en http://svn.collab.net/repos/svn permite a cualquiera realizar operaciones de sólo lectura (como por ejemplo obtener copias locales y explorar el repositorio con un navegador web), pero restringe todas las operaciones de escritura a usuarios autenticados. Para realizar este tipo de selección restrictiva, puede usar las directivas de configuración Limit y LimitExcept. Igual que la directiva Location, estos bloques tienen etiquetas de comienzo y final, y las anidaría dentro de su bloque <Location>.

Los parámetros presentes en las directivas Limit y LimitExcept son los tipos de peticiones HTTP afectadas por ese bloque. Por ejemplo, si quisiese prohibir todo el acceso a su repositorio excepto las operaciones actualmente soportadas de sólo lectura, podría usar la directiva LimitExcept incluyendo los tipos de peticiones GET, PROPFIND, OPTIONS, y REPORT. Entonces la directiva anteriormente mencionada Require valid-user sería colocada dentro del bloque <LimitExcept> en lugar del bloque.

<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn

  # how to authenticate a user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /path/to/users/file

  # For any operations other than these, require an authenticated user.
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept>
</Location>

Estos son sólo unos pocos ejemplos simples. Para más información detallada sobre el control de acceso de Apache y la directiva Require, échele un vistazo a la sección Security de la colección de tutoriales en la sección de documentación de Apache en http://httpd.apache.org/docs-2.0/misc/tutorials.html.

Control de acceso por directorio

Es posible establecer permisos más precisos usando el segundo módulo de Apache httpd, mod_authz_svn. Este módulo coge las diversas URLs opacas del cliente al servidor, solicita a mod_dav_svn que las decodifique, y entonces posiblemente veta estas peticiones basándose en la política definida en un fichero de configuración.

Si ha instalado Subversion a partir del código fuente, mod_authz_svn habrá sido instalado automáticamente junto a mod_dav_svn. Muchas distribuciones binarias también lo instalan automáticamente. Para verificar que está instalado correctamente, asegúrese de que viene justo tras la directiva LoadModule de mod_dav_svn en httpd.conf:

LoadModule dav_module         modules/mod_dav.so
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

Para activar este módulo, necesita configurar su bloque Location para que use la directiva AuthzSVNAccessFile, la cual especifica el fichero que contiene la política de permisos para las rutas en sus repositorios. (Discutiremos el formato de este fichero dentro de unos momentos.)

Apache es flexible, así que tiene la opción de configurar su bloque con uno de estos tres patrones generales. Para comenzar, escoja uno de estos patrones básicos de configuración. (Los ejemplos que vienen a continuación son muy simples; vea la documentación de Apache para más detalles sobre las opciones de autenticación y autorización.)

El bloque más simple es permitir el acceso a cualquiera. En este escenario, Apache nunca envía solicitudes de autenticación, así que todos los usuarios son tratados como anónimos.

Ejemplo 6.1. A sample configuration for anonymous access.

            <Location /repos>
              DAV svn
              SVNParentPath /usr/local/svn

              # our access control policy
              AuthzSVNAccessFile /path/to/access/file                 
            </Location>
          

En el lado opuesto de la escala de paranoia, puede configurar su bloque para demandar la autenticación de todo el mundo. Todos los clientes deberán proporcionar credenciales para identificarse. Su bloque requiere de manera incondicional la autenticación vía directiva Require valid-user, y define un método de autenticación.

Ejemplo 6.2. A sample configuration for authenticated access.

            <Location /repos>
              DAV svn
              SVNParentPath /usr/local/svn
            
              # our access control policy
              AuthzSVNAccessFile /path/to/access/file                 
            
              # only authenticated users may access the repository
              Require valid-user
            
              # how to authenticate a user
              AuthType Basic
              AuthName "Subversion repository"
              AuthUserFile /path/to/users/file                  
            </Location>
          

Un tercer patrón muy popular es permitir una combinación de acceso autenticado y anónimo. Por ejemplo, muchos administradores quieren que los usuarios anónimos puedan leer ciertos directorios del repositorio, pero restringen la lectura (o escritura) de otras áreas más sensibles a usuarios autenticados. Con esta configuración, todos los usuarios comienzan accediendo al repositorio de manera anónima. Si su política de control de acceso requiere un nombre de usuario real en algún punto, Apache demandará una autenticación del cliente. Para hacer esto, use tanto la directiva Satisfy Any como Require valid-user simultáneamente.

Ejemplo 6.3. A sample configuration for mixed authenticated/anonymous access.

            <Location /repos>
              DAV svn
              SVNParentPath /usr/local/svn
            
              # our access control policy
              AuthzSVNAccessFile /path/to/access/file                 
            
              # try anonymous access first, resort to real 
              # authentication if necessary.
              Satisfy Any
              Require valid-user
            
              # how to authenticate a user
              AuthType Basic
              AuthName "Subversion repository"
              AuthUserFile /path/to/users/file                  
            </Location>
          

Una vez tenga configurado su bloque Location básico, puede crear un fichero de acceso y definir en él algunas reglas de autorización.

La sintaxis del fichero de acceso es la misma que la usada por svnserve.conf y los ficheros del área de configuración de parámetros de ejecución. Las líneas que comienzan con una almohadilla (#) son ignoradas. En su forma más simple, cada sección nombra a un repositorio y ruta dentro del mismo, y los nombres de usuario autenticados son los nombres de las opciones dentro de cada sección. El valor de cada opción describe el nivel de acceso del usuario a la ruta del repositorio: ya sea r (sólo lectura) o rw (lectura-escritura). Si el nombre de un usuario no se menciona, no se le permite el acceso.

Para ser más específicos, el valor de los nombres de sección tienen la forma [repositorio-nombre:ruta] o la forma [ruta]. Si está usando la directiva SVNParentPath, entonces es importante especificar los nombres de repositorio en sus secciones. Si los omite, una sección como [/algún/directorio] coincidirá con la ruta /algún/directorio en cada repositorio. No obstante si está usando la directiva SVNPath, entonces está bien definir rutas en sus secciones—después de todo, sólo hay un repositorio.

[calc:/branches/calc/bug-142]
harry = rw
sally = r

En este primer ejemplo, el usuario juan tiene permisos de lectura y escritura sobre el directorio /branches/calc/bug-142 del repositorio calc, pero el usuario carmen sólo tiene permisos de lectura. Cualquier otro usuario tendrá bloqueado el acceso a este directorio.

Por supuesto, los permisos son heredados del directorio padre al hijo. Esto significa que puede especificar un subdirectorio con una política de acceso diferente para Carmen:

[calc:/branches/calc/bug-142]
harry = rw
sally = r

# give sally write access only to the 'testing' subdir
[calc:/branches/calc/bug-142/testing]
sally = rw

Ahora Carmen puede escribir en el subdirectorio testing de la rama, pero sigue accediendo con permisos de sólo lectura a otras ubicaciones. Mientras tanto, Juan continua con permisos de lectura-escritura para toda la rama.

También es posible denegarle los permisos a alguien de manera explícita mediante reglas de herencia, ajustando su variable de nombre de usuario a nada:

[calc:/branches/calc/bug-142]
harry = rw
sally = r

[calc:/branches/calc/bug-142/secret]
harry =

En este ejemplo, Juan tiene acceso de lectura-escritura a todo el árbol bug-142, pero no tiene acceso en absoluto al subdirectorio secret dentro del mismo.

Por defecto, nadie tiene acceso en absoluto al repositorio. Esto significa que si comienza con un fichero vacío, probablemente querrá permitir el acceso de lectura la raíz del repositorio a todos los usuarios. Puede hacer esto con la variable asterisco (*), la cual significa todos los usuarios:

[/]
* = r

Ésta es una configuración común; fíjese que no hay nombre de repositorio nombrado en el nombre de la sección. Esto hace todos los repositorios legibles por todos los usuarios, usando tanto SVNPath como SVNParentPath. Una vez todos los usuarios tienen acceso de lectura a los repositorios, puede dar permisos explícitos rw a determinados usuarios en subdirectorios específicos dentro de repositorios específicos.

La variable asterisco (*) también merece aquí una mención especial: es el único patrón que coincide con el usuario anónimo. Si ha configurado su bloque Location para permitir una mezcla de acceso anónimo y autenticado, todos los usuarios comienzan accediendo a Apache de forma anónima. mod_authz_svn busca el valor * definido para la ruta que se está accediendo; si no puede encontrar uno, entonces Apache demanda una autenticación real del cliente.

El fichero de acceso también le permite definir grupos enteros de usuarios, de manera muy similar al fichero /etc/group Unix:

[groups]
calc-developers = harry, sally, joe
paint-developers = frank, sally, jane
everyone = harry, sally, joe, frank, sally, jane

A los grupos se les puede facilitar el acceso igual que a los usuarios. Distíngalos con el prefijo arroba (@):

[calc:/projects/calc]
@calc-developers = rw

[paint:/projects/paint]
@paint-developers = rw
jane = r 

...y eso es prácticamente todo lo que hay que hacer.

Regalitos extra

Hemos cubierto la mayoría de las opciones de autenticación y autorización para Apache y mod_dav_svn. Pero Apache proporciona algunas otras características interesantes.

Navegar por el repositorio

Uno de los beneficios más útiles de una configuración Apache/WebDAV de su repositorio Subversion es que las revisiones más recientes de sus ficheros y directorios versionados están disponibles inmediatamente para ser visualizados con un navegador web normal. Dado que Subversion usa URLs para identificar recursos versionados, aquellas URLs basadas en HTTP para acceder al repositorio pueden teclearse directamente en un navegador. Su navegador realizará una petición GET para esta URL, y dependiendo de que ésta represente un directorio o fichero versionado, mod_dav_svn responderá con un listado de directorio o con el contenido del fichero.

Dado que las URLs no contienen información sobre qué versión del recurso desea ver, mod_dav_svn responderá siempre con la versión más reciente. Esta funcionalidad tiene el maravilloso efecto secundario de que puede pasar a sus colegas referencias a documentos, y esas URLs siempre apuntarán a la última manifestación de los mismos. Por supuesto, también puede usar las URLs como hiperenlaces desde otras páginas web.

Generalmente obtendrá más utilidad del uso de URLs a ficheros versionados—después de todo, ahí es donde suele estar el contenido interesante. Pero quizás disponga de la ocasión de navegar por un listado de directorio de Subversion, y percibir que el HTML generado para mostrar el listado es muy básico, y desde luego no está pensado para ser estéticamente agradable (o incluso interesante). Para permitir la personalización de estas muestras de directorio, Subversion proporciona una característica de indexado XML. Una única directiva SVNIndexXSLT en el bloque Location de httpd.conf indicará a mod_dav_svn que genere la salida del listado de directorio en un XML, usando como referencia una hoja de estilo XSLT de su elección:

<Location /svn>
  DAV svn
  SVNParentPath /usr/local/svn
  SVNIndexXSLT "/svnindex.xsl"
  …
</Location>

Usando la directiva SVNIndexXSLT y una hoja de estilo XSLT creativa, puede hacer que sus listados de directorio concuerden con los esquemas de color e imágenes usados en otras partes de su página web. O, si lo prefiere, puede usar las hojas de estilo de ejemplo que proporciona la distribución de código fuente de Subversion en el directorio tools/xslt/. Tenga en cuenta que la ruta que apunta al directorio SVNIndexXSLT es en realidad una URL—¡los navegadores deben poder leer sus hojas de estilo para poder usarlas!

Otras características

Algunas de las características proporcionadas por Apache en su rol de servidor web robusto también pueden ser aprovechadas para incrementar la funcionalidad o seguridad en Subversion. Subversion se comunica con Apache usando Neon, que es una librería HTTP/WebDAV genérica con soporte para mecanismos tales como SSL (Secure Socket Layer, discutidos anteriormente) y compresión Deflate (el mismo algoritmo usado por los programas gzip y PKZIP para reducir ficheros en bloques de datos de tamaño menor). Sólo necesita compilar el soporte de las características que desea tener en Subversion y Apache, y configurar adecuadamente estos programas para que las usen.

La compresión Deflate carga ligeramente al cliente y al servidor para comprimir y descomprimir transmisiones por red para minimizar el tamaño de los datos. En aquellos casos donde el ancho de banda de red es escaso, este tipo de compresión puede incrementar sustancialmente la velocidad con la que se comunican el servidor y el cliente. En casos extremos, la minimización de la transmisión por red puede marcar la diferencia entre una operación cuyo tiempo de espera es agotado o termina con éxito.

Menos interesantes, pero igualmente útiles, son otras características de la relación entre Apache y Subversion, como la capacidad de especificar un puerto específico (en lugar del puerto 80 por defecto de HTTP) o un nombre de dominio virtual mediante el cual se pueda acceder a un repositorio de Subversion, o la capacidad de acceder al repositorio a través de un proxy. Estas cosas las soporta Neon, así que Subversion las obtiene de manera gratuita.

Por último, dado que mod_dav_svn habla un dialecto semi completo de WebDAV/DeltaV, es posible acceder al repositorio mediante clientes DAV de terceros. La mayoría de los sistemas operativos modernos (Win32, OS X, y Linux) tienen soporte para montar un servidor DAV como un recurso estándar de red. Ésto es un tema complicado; para más detalles, lea Apéndice C, WebDAV y autoversionado.



[30] Realmente odian hacer eso.

[31] Aunque los certificados de servidor auto firmados siguen siendo vulnerables a ataques del hombre en medio , tal ataque es todavía más difícil de conseguir por un observador casual, comparado con el rastreado de claves desprotegidas.

[32] Aquellos más conscientes de la seguridad quizás no deseen almacenar la clave del certificado de cliente en el fichero servers del área de configuración de parámetros de ejecución.