howto secure svn server

Acest post vine in continuarea post-ului de instalare a unui server de svn. Voi face serverul de svn sa permita lucrul cu userii. Sa presupunem ca avem mai multe proiecte ( respectiv pentru fiecare proiect cate un repository aparte ) si in fiecare proiect lucreaza doar anumite persoane care va trebui sa aiba acces la acele proiecte.

Acum avem 2 proiecte : projectx si projecty :

root@srv1:~# cd /var/svn/
root@srv1:/var/svn# ls
root@srv1:/var/svn# svnadmin create projectx
root@srv1:/var/svn# svnadmin create projecty
root@srv1:/var/svn# ls -lah
total 16K
drwxr-xr-x  4 root root 4.0K 2010-02-07 17:20 .
drwxr-xr-x 16 root root 4.0K 2010-02-06 18:10 ..
drwxr-xr-x  6 root root 4.0K 2010-02-07 17:20 projectx
drwxr-xr-x  6 root root 4.0K 2010-02-07 17:20 projecty
root@srv1:/var/svn# chown -R www-data:www-data *
root@srv1:/var/svn# ls -lah
total 16K
drwxr-xr-x  4 root     root     4.0K 2010-02-07 17:20 .
drwxr-xr-x 16 root     root     4.0K 2010-02-06 18:10 ..
drwxr-xr-x  6 www-data www-data 4.0K 2010-02-07 17:20 projectx
drwxr-xr-x  6 www-data www-data 4.0K 2010-02-07 17:20 projecty

Trebuie sa facem nishte modificari ale serverului apache astfel ca sa permita accesul la toate proiectele ( repository-uri ) create.

Setari care le facem in fisierul /etc/apache2/mods-available/dav_svn.conf , si unde trebuie sa modificam urmatoarele linii :

<Location /svn>

vom accesa repository-urile prin url : http://myserver/svn

DAV svn

trebuie sa ramana decomentat

#SVNPath /var/svn/projectx
SVNParentPath /var/svn

comentam variabila SVNPath si decomentam variabila SVNParentPath – care specifica in ce directoriu se afla toate repository-urile care le vom da access prin apache. Prin acest mod repositoryurile vor avea urmatoarele url : http://myserver/svn/projectx si http://myserver/svn/projecty . Exista o variabila SVNListParentPath ( cu valorile posibile On si Off ) care, atunci cand este setata pe On url-ul http://myserver/svn va afisa lista tuturor proiectelor de svn. Ex :

Eu am setat aceasta variabila pe Off ( pentru a nu afisa lista tuturor proiectelor existente ).

Acum, pentru accesul la repository-uri, se face pe 3 nivele diferite :

  1. autentificare la nivel de apache
  2. directivele <Limit> si <LimitExcept> din fisierele de configurare.
  3. si o modalitate specifica pentru svn : mod_authz_svn

Eu voi folosi doar modalitatile 1 si 3. ( 2 l-as folosi daca as vrea sa fac un repository public cu drepturi pentru toti doar de right, ceea ce nu vreu ). Pentru a activa 1 modalitate decomentam urmatoarele linii :

 AuthType Basic
AuthName "Subversion Repository"
AuthUserFile /etc/apache2/dav_svn.passwd
Require valid-user

Fisierul /etc/apache2/dav_svn.passwd trebuie creat si populat cu userii care vor avea acess la repository-uri. Pentru primul user, adaugarea se va face astfel :

root@srv1:~# htpasswd -c /etc/apache2/dav_svn.passwd user1
New password:
Re-type new password:
Adding password for user user1

Parametrul “-c” specifica ca fisierul dav_svn.passwd trebuie creat. Pentru ceilalti utilizatori se va executa fara -c :

root@srv1:~# htpasswd /etc/apache2/dav_svn.passwd user2
New password:
Re-type new password:
Adding password for user user2

si acum fisierul dav_svn.passwd va arata astfel :

 1 user1:S9.kRNS4/zePM
2 user2:Kx.lSCcCuM.AE

Daca vom da restart serverului de apache (/etc/init.d/apache2 restart) vom avea 2 repository-uri la care vor avea acces 2 utilizatori.

Toti utilizatorii specificat in fisierul dav_svn.passwd vor avea access de Read/Write in toate repository-urile existe.

In acest moment apare problema : user1 lucreaza doar la projectx , iar user2 la projecty si nu ar trebuie sa aiba acces user2 la projectx si user1 la projecty. Pentru a rezolva si aceasta mica problema implementam si a 3-a modalitate de autentificare specifica pentru svn.
In fisierul /etc/apache2/mods-available/dav_svn.conf decomentez linia cu :

AuthzSVNAccessFile /etc/apache2/dav_svn.authz

fisierul dav_svn.authz are o sintaxa simpla, care trebuie creat. Pentru cazul prezentat mai sus, dav_svn.authz arata astfel :

1 [projectx:/]
2 user1 = rw
3
4 [projecty:/]
5 user2 = rw

deci, pentru repository-ul projectx, path : / (root) user-ul user1 are drepturi de citire/scriere, la fel si user2 pentru repository-ul projecty. De mentionat ca user1 nu are nici un fel de drept pentru repository-ul projecty si nici nu poate sa citeasca continutul si nici sa scrie, la fel si user2 cu projectx.

Daca la un moment dat se decide ca user1 trebuie sa aiba acces de r ( read ) asupra projecty atunci fisierul dav_svn.authz va arata astfel :

1 [projectx:/]
2 user1 = rw
3
4 [projecty:/]
5 user2 = rw
6 user1 = r

Mai multe setari se pot gasi in documentatia svn-ului.

Pentru a pune in aplicare toate modificarile facute in configurari trebuie sa restartam apache, si acum avem 2 useri, astfel ca fiecare user are specificate drepturile sale de acces la repository-urile cu care trebuie sa lucreze.

Atunci cand se adauga un nou user, trebuie de adaugat in fisierul dav_svn.passwd cu comanda htpasswd si apoi de specificat in dav_svn.authz drepturile lui la repository-uri.

Aici e arata doar modalitatea de setare pentru protocolul http, daca e nevoie de mai multa securitate… trebuie implementata https care presupune nishte pasi in plus.

cam atat, cred.