Repository 32bit  Forum
Repository 64bit  Wiki

Appunti sull'installazione di un server SVN

Da Slacky.eu.
Versione delle 20:01, 27 ott 2006, autore: Slacky (Discussione | contributi)

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)


Luca Dutto, Paolo Carlo Pomi 22 Giugno 2006

Indice

Introduzione

In un ambiente di lavoro distribuito, dove diverse persone debbono collaborare allo stesso progetto, è comodo avere un sistema automatizzato di salvataggio, condivisione e revisione dei lavori. A tale fine, l'utilizzo della suite Subversion può essere la soluzione ideale: Subversion è un sistema di controllo di versione open source, che permette di gestire, come se fosse un normale file server, i documenti salvati all'interno di appositi depositi, chiamati repository. La differenza sostanziale con un file server è però la possibilità di tenere traccia di ogni revisione effettuata, permettendo di controllare le differenze tra le varie versioni e, eventualmente, tornare indietro ad una versione precedente. L'obiettivo di questi appunti è illustrare come installare un server Subversion, utilizzando Apache come web server e, soprattutto, gestendo la sicurezza (cifratura, autenticazione, autorizzazione) tramite certificati X.509.

Installazione del software

Per l'installazione del server SVN la scelta dell'ambiente di lavoro è ricaduta, in modo naturale, su un sistema GNU/Linux. In particolare, si è optato per la distribuzione Slackware, per le sue riconosciute caratteristiche di leggerezza, stabilità e affidabilità. Al momento della stesura di questi appunti è disponibile la versione 11.0 (stabile) della distribuzione. Non è obiettivo di questo documento entrare nei dettagli dell'installazione / configurazione di base del sistema (per i quali si rimanda il lettore all?ottima guida, in lingua italiana, Slackware for Dummies); verranno tuttavia indicati, di volta in volta, alcuni passaggi seguiti, al duplice scopo di guida e promemoria. Inoltre, come iniziale guida di riferimento è stato seguito lo Slackware - SVN HowTo, di cui verranno riproposti alcuni passaggi. All?interno della distribuzione sono già presenti i pacchetti precompilati del webserver Apache e della suite Subversion. Tuttavia il software presente in tali pacchetti non è sufficiente al nostro scopo: per poter infatti utilizzare Subversion come modulo di Apache (e non soltanto in modalità stand alone) è necessario avere Apache2. Nell'installazione base di Slackware è, invece, presente la versione stabile di Apache 1.33.34 . Il primo passo sarà allora disinstallare i pacchetti Apache e Subversion (di cui sarà necessaria una versione ricompilata) usando gli appositi tool (in modalità superutente):

root@degobah:~# removepkg apache
root@degobah:~# removepkg subversion

Una volta rimossi i pacchetti sarà necessario installare delle versioni aggiornate. Per semplicità si è scelto di utilizzare dei pacchetti precompilati, disponibili sul sito LinuxPackages. Recuperati i pacchetti apache2 (disponibile la versione 2.0.58) e subversion (versione 1.3.1) si procede all'installazione:

root@degobah:~# installpkg /path/to/pkg/apache2*.tgz
root@degobah:~# installpkg /path/to/pkg/subversion*.tgz

dove /path/to/pkg/ è il percorso in cui i pacchetti sono stati salvati localmente. In questo modo tutto il software necessario è automaticamente installato sul sistema, pronto per essere configurato.

Configurazione

Le funzionalità richieste alla nostra installazione di SVN sono:

  • creazione di cartelle, repository e file di accesso/configurazione di SVN
  • integrazione con Apache
  • utilizzo di SSL e Client Authentication
  • autorizzazione all'accesso/utilizzo tramite certificati X.509

Le operazioni sono esaminate nel dettaglio nelle sezioni seguenti.

Creazione dell'ambiente SVN

Per prima cosa, si crea la cartella, sul disco fisso, dove risiederanno fisicamente i repository SVN (tutte le seguenti operazioni vanno eseguite in modalità superutente).

mkdir -p /home/svn/repositories

La cartella /home/svn/repositories conterrà tutti i repository SVN. Passo successivo è creare i due file, necessari al sistema SVN, per definire gli utenti e le policy di accesso ai vari repository. Per il momento saranno vuoti, in seguito si definirà come utilizzarli (naturalmente i nomi sono arbitrari):

touch /home/svn/.svn-policy-file
touch /home/svn/.svn-auth-file

.svn-auth-file conterrà gli utenti autorizzati ad accedere al repository, mentre .svn-policy-file definirà le politiche di autorizzazione ai vari repository. Infine, la creazione del repository vero e proprio:

svnadmin create --fs-type fsfs /home/svn/repositories/test

L'opzione --fstype fsfs indica al programma di utilizzare il tipo FSFS come formato di salvataggio dei dati, invece del Berkeley DB. Il formato FSFS si appoggia al filesystem, è portabile tra sistemi differenti e non è sensibile a problemi di integrità, contrariamente al Berkeley DB, in caso di accidentali crash. Per ultimo, con il comando

chown -R nobody.nobody /home/svn/repositories/test

diamo all'utente Apache i permessi per il nuovo repository appena creato.

Integrazione con Apache

Per far sì che Apache si occupi di gestire le transazioni SVN, è necessario far caricare al webserver alcuni moduli. Si aggiungono allora al file di configurazione httpd.conf di Apache (sul nostro sistema si trova in /etc/apache2/) le seguenti direttive:

LoadModule dav_svn_module lib/apache2/mod_dav_svn.so
LoadModule authz_svn_module lib/apache2/mod_authz_svn.so

è possibile comunque che su altre distribuzioni Linux i file di configurazione siano in una diversa posizione.

Utilizzo di SSL e Client Authentication

A questo punto, per motivi di sicurezza, vogliamo che le transazioni col webserver avvengano utilizzando una connessione cifrata. Dobbiamo allora configurare Apache in modo che gestisca il nostro repository tramite SSL. Nella directory /etc/apache2 esiste il file ssl.conf, che imposta i parametri per gestire i siti sulla connessione protetta: sarà necessario modificare alcune impostazioni in tale file. Verranno in seguito, indicate esplicitamente solo le impostazioni aggiunte o modificate. Per prima cosa, volendo abilitare il supporto SSL, è necessario fornire al server un suo certificato. Se è già disponibile un certificato, basterà impostare in ssl.conf, all'interno della sezione di definizione del VirtualHost, il percorso relativo ai file del certificato e della relativa chiave privata:

SSLCertificateFile /etc/apache2/ssl.crt/server.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/server.key

I certificati, per convenzione, sono salvati nella cartella ssl.crt, le chiavi in ssl.key. Se non si disponesse di un certificato valido, è possibile utilizzare lo script pkgmkcert.sh presente nella directory di Apache per generare e installare automaticamente un certificato autofirmato. Dato che è richiesta l'autenticazione del client, è necessario impostare nel server un elenco di Certification Authority (CA) ritenute affidabili. Il server presenterà tale elenco al client, che dovrà rispondere, per poter accedere ai contenuti richiesti, presentando un certificato emesso da una di tali CA. Si crea allora un file contenente, uno in coda all'altro, tutti i certificati delle varie CA da noi autorizzate, codificati in formato PEM(Base64). Si aggiunge quindi al file di configurazione la linea

SSLCACertificateFile /etc/apache2/ssl.crt/test.crt

Per attivare infine, la client authentication si imposta:

SSLVerifyClient require
SSLVerifyDepth 5

In tal modo è necessario che il client presenti un certificato, e la catena di trust di tale certificato viene risalita di massimo 5 livelli. Ultima configurazione, di sicurezza: con l'opzione

SSLProtocol all -SSLv2

si disabilita il protocollo SSLv2, potenzialmente pericoloso. A questo punto, terminate le configurazioni generali del server, si aggiungono le direttive per il server SVN vero e proprio, all'interno di un blocco Location:

############ SVN ############
<Location /svn>
SSLOptions +FakeBasicAuth
DAV svn
SVNParentPath /home/svn/repositories
AuthName "Test SVN Repo"
AuthType Basic
AuthUserFile /home/svn/.svn-auth-file
AuthzSVNAccessFile /home/svn/.svn-policy-file
Require valid-user
</Location>

In tal modo indichiamo al server SVN di utilizzare la Fake Basic Authentication(spiegata in seguito), di utilizzare come file di policy .svn-policy-file, come file utenti .svn-auth-file e di volere, per accedere ai contenuti, l'autenticazione di un utente valido.

Autorizzazione tramite certificati

Utilizzando l'opzione SSLOptions +FakeBasicAuth Apache simula la Basic Authentication (ovvero effettuata tramite nome dell'utente e relativa password) estraendo, come nome utente, dal certificato x.509 del client il campo subject, e utilizzando come relativa password la stringa password (per maggiori dettagli, far riferimento alla documentazione ufficiale di ssl.html Apache mod ssl). I nomi utenti da aggiungere al file di autorizzazione dovranno allora essere tali Distinguished Name (DN), estratti dai certificati (l'operazione è riassunta brevemente nell'appendice A). In particolare, detto /C=IT/O=Test/CN=user1 il nostro DN di prova, l'operazione da svolgere per aggiungere l'utente sarà (da root):

htpasswd -s /home/svn/.svn-auth-file ?/C=IT/O=Test/CN=user1

e, alla richiesta della password, inserire la stringa password. Modifichiamo ora, con un editor di testo, il file delle policy del server SVN. Si inseriscono i vari utenti in gruppi di accesso, e, per ogni repository, si concedono privilegi ai vari gruppi. Ad esempio:

[groups]
testgroup = /C=IT/O=Test/CN=user1, /C=IT/O=Test/CN=user2
[test:/]
@testgroup = rw
normal_user3 = r

In questo caso si è definito un gruppo contenente due utenti (due DN), ai quali si concede l'accesso in lettura e scrittura al repository test. Esiste poi un utente normale con permessi di sola lettura. Un problema riscontrato, utilizzando i DN, è che è necessario inserirli in gruppi, non è possibile utilizzarli direttamente come utenti standard. Ricapitolando, utilizzando gli accorgimenti descritti precedentemente si ottengono:

  • sicurezza, tramite connessione cifrata con SSL
  • autenticazione dei client e restrizioni di accesso in base all'emissore del certificato
  • autorizzazione all'uso delle risorse tramite politiche definite dall'amministratore

Estrazione dei DN usando OpenSSL

Utilizzando gli strumenti forniti dalla suite OpenSSL è possibile estrarre, da un certificato, i vari campi che lo compongono. In particolare, ai nostri scopi interessa il campo subject, per effettuare l'autorizzazione degli utenti. Se si dispone già di un certificato codificato in formato PEM, è sufficiente utilizzare i seguenti comandi:

openssl x509 -in cert.pem -noout -subject

dove cert.pem è il certificato sotto analisi. L'output sarà simile a

subject= /C=IT/O=Test/CN=user1

di cui la parte di nostro interesse è

/C=IT/O=Test/CN=user1

Se invece avessimo a disposizione il certificato codificato in formato PKCS#12 (ad esempio, il proprio certificato personale, esportato del browser), sarà sufficiente eseguire

openssl pkcs12 -in cert.p12 -clcerts -nokeys | grep subject

Dopo aver inserito la import password, si ottiene il campo subject del certificato.

Utilizzo di certificati per utenti Linux

Per accedere ad un server configurato come illustrato in precedenza, l'utente deve presentare un certificato valido ad ogni transazione. Questo comporta l'inserire più volte il percorso relativo al proprio certificato, e la relativa password. Questo comportamento, per quanto sensato, è decisamente poco pratico, è possibile allora indicare al client SVN utilizzato (sia esso svn da linea di comando oppure un ambiente grafico, quale Subclipse o KDESvn) di utilizzare automaticamente un certificato. Nella home directory dell'utente esiste infatti la cartella (nascosta) .subversion. All'interno di tale cartella, nel file servers, è possibile indicare, tra le altre cose, il percorso dove il certificato (in formato PKCS#12) è salvato localmente. Basta aggiungere, in coda al file, le linee:

ssl-client-cert-file = /path/to/cert.p12
ssl-client-cert-password = mypassword

dove /path/to/cert.p12 e mypassword sono rispettivamente il certificato che si desidera usare e la relativa password.

Autore: Luca Dutto, Paolo Carlo Pomi

Strumenti personali
Namespace

Varianti