Languages

User login


Configurar l'apache per accedir remótament als repositoris de Subversion


Aquest document mira d'indicar com configurar el nostre servidor Apache 2 per a accedir als nostres repositoris de programari de subversion. Per a fer això s'ha de poguer configurar l'arxiu httpd.conf i poguer afegir mòduls al servidor.

El primer de tot és afegir els mòduls necessaris, mod_dav i mod_dav_svn:

urpmi  apache2-mod_dav apache2-mod_dav_svn

Un cop tenim els mòduls instal·lats hem d'incloure'ls a l'arxiu de configuració del servidor apache2. En mandrake aquest arxiu es troba a /etc/httpd/conf/httpd2.conf.

Per a incloure els mòduls hem d'escriure a on es carreguen els mòduls:

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

Aquí cal dir que al manual mostra com a genèric que el mòdul dav_svn_module també es trobi dins del directori "modules" i no dins d'"extramodules".

Després d'instal·lar els mòduls li has de dir a l'apache on és el teu repositori de Subversion, això també dincs del arxiu httpd2.conf. Es pot fer de dues maneres, amb Location i Directory.

Amb Location especifiques la terminació que carregarà el mòdul de subversion i on és el repositori. Amb Directory defineixes aquell directori en el que es carregarà el mòdul, sense especificar una terminació. Totes dues opcions són recursives, els seus subdirectoris també es veuen afectats.

Potser quedarà més clar amb exemples:


<Location /repos>
  DAV svn
  SVNPath /absolute/path/to/repository
</Location>

Això fa que al escriure la url elmeuservidor.net/repos es carregui el plugin i accedim al repositori. Cal tenir en compte que la directiva SVNPath és per a un sol repositori, per a cada nou repositori hauries de definir un nou location i reiniciar el servidor per a que els canvis tinguessin efecte.


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

Aquesta directiva en canvi defineix el arbre pare dels repositoris de subversion per el que pots accedir a tots els repositoris via "/repos/projecte1". També dir que es poden crear nous repositoris sense necessitat de reiniciar el servidor.

El location tant es pot fer servir amb un servidor únic com amb un de virtual, en aquest últim cas el location ha d'anar dins del i no definir DocumentRoot si es vol fer servir <Location />.

Cal remarcar que el cas d'emprar Location hem d'evitar que existeixi cap directori "real" amb el mateix nom que li hem donat al Location, doncs llavors el servidor no sabria que ha de fer i el resultat seria que es podria visualitzar però al conectar via svn ens donari l'error 301 - Mogut permanentment.

En aquest punt hem de veure que l'usuari que executa el apache2 ha de tenir permisos sobre els repositoris de subversion, sinó ens ocasionaria problemes.

Un cop fet tot això reiniciem el servidor apache2 veurem com accedint amb el navegador a http://elmeuserver.net/svn/ i el nom del repositori en visualitzarem els arxius que el formen.

Ara ja tenim el repositori creat i accesible remótament, però hi ha un problema, aquest repositori és accesible i modificable per a qualsevol persona, cosa que normalment no interesa. Arribats a aquest punt ens interesa crear un control sobre l'accés al repositori de programari.

Això es pot fer de diverses formes, amb certificat ssl, sota conexió segura https o autentificació bàsica. En aquest cas ho veurem amb autentificació bàsica, però cal tenir en compte que les claus s'envien en text pla i es poden snifejar (una possible solució és activar el https per al nostre servidor).

Aquí teniu una configuració oberta, tots els usuaris poden veure el repositori, però només els usuaris registrats poden modificar-ne el contingut, el que seria una configuració típica per a codi obert:


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

  # Com autentificar l'usuari
  AuthType Basic
  AuthName "Repositori de Subversion"
  AuthUserFile /path/to/users/file

  # Per a qualsevol altre operació que aquestes, demanar que s'autentifiqui.
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept>
</Location>

Aquí amb la línia AuthType Basic establim el tipus d'identificació, amb AuthName indiquem quin missatge sortirà per pantalla quan se'ns demani l'usuari i clau d'accés. AuthUserFile és la ruta al repositori. Amb les condicions establim que qualsevol usuari pot agafar els arxius i els permisos mínims per moure's per el repositori.

Si per el contrari volem que el repositori sigui de caire privat, només nosaltres ho poguem llegir, només fa falta que eliminem els tags de LimitExcept.

El problema d'això si us hi fixeu és que tenim una configuració global, és a dir, per a tots els repositoris aquesta configuració és igual. Això ens pot no importar si només tenim un repositori o si els projectes en els que estem tenen els mateixos programadors, però no sol ser així.

Subversion té un mode més complex per a gestionar cada repositori de forma individualitzada, de forma còmoda i sense requerir el reinici del servidor a cada modificació. Primer de tot hem de carregar el mòdul mod_authz_svn a l'apache com hem fet abans amb el mod_dav_svn.

LoadModule authz_svn_module               extramodules/mod_authz_svn.so

Ara hem d'afegir a dintre el Location de l'arxiu de configuració del repositori dins d'apache el paràmetre AuthzSVNAccessFile, que ens indica on es troba l'arxiu que conté les polítiques d'accés dels usuaris dins dels teus repositoris.

Hi ha tres configuracions que podem fer amb l'apache. La primera d'elles és no limitar-ne l'accés, amb el que tots els usuaris són tractats com a "anonymous".

<Location /repos>
DAV svn
SVNParentPath /usr/local/svn
# la nostra política de control d'accés
AuthzSVNAccessFile /ruta/al/arxiu/acces
</Location>

En l'altre extrem pots demanar autentificació a tot aquell que vol accedir al teu repositori:

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

# la nostra política de control d'accés
AuthzSVNAccessFile /ruta/al/arxiu/acces

# només usuaris autentificats poden accedir al repositori
Require valid-user

# com autetificar a un usuari
AuthType Basic
AuthName "Repositori Subversion"
AuthUserFile /ruta/al/arxiu/htacces
</Location>

La tercera solució és la més popular, donar accés de lectura a tothom i només d'escriptura als programadors del repositori.

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

# la nostra política de control d'accés
AuthzSVNAccessFile /ruta/a/arxiu/acces

# prova primer un accés anònim, recòrrer a
# l'autentificació si és necessari.
Satisfy Any
Require valid-user

# com autentificar a un usuari
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /ruta/al/arxiu/htacces
</Location>

Ara ens queda configurar l'arxiu d'accés on es defineixen les polítques de control. Hi ha dues opcions d'accés r (només lectura) i rw (lectura i escriptura). Cal tenir en compte que si un usuari no té definits els permissos, llavors ni hi té accés. Altra cosa a tenir en compte és que l'estructura per aplicar els permissos és [nom-repositori:/directori/intern]. Si no especifiquem el repositori les opcions s'aplicaran a tots els directoris que conincideixin amb el directori especificat. Veiem-ne un exemple:

[calc:/branca/calc/bug-142]
pau = rw
clara = r

Aquí podem veure que l'usuari pau té permisos de lectura i escriptura i clara només de lectura dins del directori /branca/calc/bug-142 dincs del repositori calc. Aquests permisos s'heredan pels subtirectoris, podent afegir nous permisos en els subdirectoris.

[calc:/branca/calc/bug-142]
pau = rw
clara = r

# dono a la clara accés d'escriptura només en el subdirectori 'test'
[calc:/branca/calc/bug-142/test]
clara = rw

En aquest cas en pau segueix tenint permisos d'escriptura en el subdirectori 'test' , hereda els permissos, i la clara també té permissos d'escriptura dins d'aquest subdirectori. Però podríem dir, i si vull que en pau no hi tingui accés a un directori en que hi té permís d'escriptura la clara i es troba dins de /branca/calc/bug-142?

Tant senzill com això:

[calc:/branca/calc/bug-142]
pau = rw
clara = r

[calc:/branca/calc/bug-142/secret]
pau =
clara =rw

Ara és la clara la qui té permissos d'escriptura dins del subdirectori "secret", però en pau, al no tenir un permís definit, nio hi té ni permís de lectura. Hem de tenir en compte que els permíssos s'heretan però es miren anant del subdirectori al que s'accedeix fins a l'arrel, prenent els permissos en aquest ordre, segons estiguin definits per als diferents usuaris.

Aquí podem pensar que si no s'hi pot accedir sense tenir un permís definit com farem que tothom pugui llegir els nostres repositoris si aquesta és la nostra intenció. La solució és fer servir el comodí *.

[/]
* = r

Amb això donem accés de lectura a TOTS els nostres repositoris, ja que no hi tenim cap nom de repositori definit.

Però aquest arxiu de configuració també permet definir grups d'usuaris, ambs els que és més senzill mantenir permisos de grups d'usuaris.

[groups]
calc-desenvolupadors = pau, clara, juan
paint-desenvolupadors = francesc, clara, cristina

I er incloure'ls en un repositori és tant senzill com afegir-hi un @ a davant del nom del grup que vols incloure:

[calc:/projectes/calc]
@calc-desenvolupadors = rw

[paint:/projectes/paint]
@paint-desenvolupadors = rw
pau = r

Ara ja queda tot cobert, sobre com crear nous repositoris a subversion i administrar-ne els permissos d'accés. Cal dir que via web subversion només mostra la versió més nova del repositori. Si el que es busca és també oferir totes les versions dels repositoris es pot optar per fer servir una aplicació anomenada ViewCVS (http://viewcvs.sourceforge.net/).

Cal recalcar que si es vol crear un servidor subversion tenint com a arrel /, per exemple svn.exemple.net, s'ha de vigilar de no tenir definit cap <Directory /> ja que llavors el servidor no sabria on ha de llegir.