Serveur basé sur Svnserve

Introduction

Subversion est livré avec Svnserve - un serveur stand-alone léger qui utilise une variante du protocole TCP/IP pour se connecter. C'est la solution idéale pour de petites installations, ou si un bon gros Apache ne peut être utilisé.

Dans la plupart des cas svnserve est plus facile à installer et fonctionne plus rapidement que le serveur utilisant Apache, cela dit il y manque quelques fonctionnalités. D'autant plus maintenant qu'est inclu le support SASL.

Installer svnserve

  1. Récupérez la dernière version de Subversion à cet endroit http://subversion.apache.org/getting.html. Vous pouvez également récupérer le programme d'installation prépackagé chez CollabNet ici : http://www.collab.net/downloads/subversion. Ce programme d'install mettra en place svnserve comme service Windows, et inclura quelques outils utiles si vous comptez utiliser SASL pour sécuriser votre serveur.

  2. Si vous déjà une version de Subversion d'installée, et que svnserve est lancé, vous devrez l'arrêter avant de continuer.

  3. Exécutez le programme d'installation de Subversion. Si vous l'exécutez sur votre serveur (ce qui est recommendé) vous pouvez passer l'étape 4.

  4. Ouvrez l'explorateur Windows, allez au répertoire d'installation de Subversion (habituellement C:\Program Files\Subversion) et dans le répertoire bin, trouvez les fichiers svnserve.exe, intl3_svn.dll, libapr.dll, libapriconv.dll, libapriutil.dll, libdb*.dll, libeay32.dll et ssleay32.dll - copiez ces fichiers, ou copiez simplement tout le contenu du répertoire bin, dans un répertoire sur votre serveur, par exemple c:\svnserve

Exécuter svnserve

Maintenant que svnserve est installé, vous avez besoin qu'il tourne sur votre serveur. L'approche la plus simple est d'exécuter ce qui suit à partir d'un interpréteur de commandes DOS ou de créer un raccourci Windows :

svnserve.exe --daemon

svnserve démarrera maintenant en attendant des requêtes entrantes sur le port 3690. Le commutateur --daemon indique à svnserve de fonctionner comme un processus de démon, donc il existera toujours jusqu'à ce qu'il soit arrêté manuellement.

Si vous n'avez pas encore créé de référentiel, suivez les instructions données avec le paramétrage du serveur Apache la section intitulée « Configuration ».

Pour tester que svnserve fonctionne, utilisez TortoiseSVNExplorateur de référentiel pour voir un référentiel.

En supposant que votre référentiel est placé dans c:\repos\TestRepo et votre serveur est appelé localhost, entrer :

svn://localhost/repos/TestRepo

quand l'explorateur de référentiel le demande.

Vous pouvez aussi augmenter la sécurité et gagner du temps en entrant l'URL avec svnserve en utilisant le commutateur --root pour indiquer l'emplacement racine et limiter l'accès à un répertoire spécifique sur le serveur :

svnserve.exe --daemon --root disque:\chemin\vers\racine\référentiel

En utilisant le test précédent comme guide, svnserve fonctionnerait maintenant comme :

svnserve.exe --daemon --root c:\référentiels

Et dans TortoiseSVN notre URL de l'explorateur de référentiel est maintenant raccourcie en :

svn://localhost/TestRéférentiel

Notez que le commutateur --root est aussi nécessaire si votre référentiel est placé sur une partition ou un disque différent de l'emplacement de svnserve sur votre serveur.

Svnserve s'occupera de plusieurs référentiels. Indiquez juste leur emplacement dans le répertoire racine, et accédez y en utilisant des chemins relatifs à la racine.

Avertissement

Ne créez pas ou n'accédez pas à un référentiel Berkeley DB sur un partage réseau. Il ne peut pas exister sur un système de fichiers distant. Même si vous faites mapper le disque réseau à une lettre de disque. Si vous essayez d'utiliser Berkeley DB sur un partage réseau, les résultats sont imprévisibles - vous pouvez voir des erreurs mystérieuses tout de suite, ou cela peut s'écouler des mois avant que vous ne découvriez que votre base de données du référentiel est subtilement corrompue.

Exécuter svnserve en tant que service

Exécuter svnserve par un utilisateur n'est généralement pas la meilleure solution. Cela revient à avoir toujours un utilisateur connecté sur votre serveur et vous rappeler de le relancer après un redémarrage. Une meilleure manière consiste à lancer svnserve en tant que service Windows. À partir de Subversion 1.4, svnserve peut être installé comme un service windows natif.

Pour installer svnserve comme service Windows, exécutez la commande suivante. Le service sera alors créé et lancé à chaque démarrage de Windows.

sc create svnserve binpath= "c:\svnserve\svnserve.exe --service 
    --root c:\referentiel" displayname= "Subversion" depend= tcpip 
    start= auto

Si un des chemin d'accès contient des espaces, vous devrez encapsuler ceux ci avec des double cotes, comme suit :

sc create svnserve binpath= "
    \"C:\Program Files\Subversion\bin\svnserve.exe\"
    --service --root c:\referentiel" displayname= "Subversion" 
    depend= tcpip start= auto

Vous pouvez également ajouter une description après avoir créé le service. Elle sera visible depuis la fenêtre de gestion des services de Windows.

sc description svnserve "Serveur Subversion (svnserve)"

Notez la ligne de commande relativement atypique utilisée par sc. Dans la paire clé= valeur il ne doit pas y avoir d'espace entre la clé et le = mais il doit y en avoir un avant la valeur.

Astuce

Microsoft recommande maintenant que les services soient exécutés soit par le compte Service Local soit par le compte Service Réseau. Référez-vous The Services and Service Accounts Security Planning Guide. Pour créer le service sous le compte Service Local, ajoutez ce qui suit à l'exemple ci-dessus.

obj= "NT AUTHORITY\LocalService"

Notez que vous devriez donner au compte Service Local les droits appropriés tant pour Subversion et vos référentiels que pour toute application utilisée par les scripts hook. Le groupe intégré pour cela est appelé "SERVICE LOCAL".

A partir du moment où vous avez installé le service, vous devez aller dans la fenêtre de gestion des services pour le démarrer (juste cette fois ci, il se lancera ensuite automatiquement après le redémarrage du serveur).

Pour plus d'informations, consultez le documentWindows Service Support for Svnserve.

Si vous aviez une ancienne version de svnserve utilisant le wrapper SVNService, et que vous voulez maintenant utiliser le support natif, vous devez désincrire le wrapper comme service (n'oubliez pas d'arrêter d'abord le service !). Utilisez simplement la commande

svnservice -remove

pour retirer l'entrée dans la base de registre.

Authentification de base avec svnserve

L'installation par défaut de svnserve fournit un accès anonyme en lecture seule. Cela signifie que vous pouvez utiliser une URL du type svn:// pour extraire, mettre à jour, ou utiliser l'explorateur de référentiel dans TortoiseSVN pour voir le référentiel, mais vous ne pourrez faire aucune livraison.

Pour permettre l'accès en écriture à un référentiel, vous devez éditer le fichier conf/svnserve.conf dans votre répertoire de référentiel. Ce fichier contrôle la configuration du démon svnserve et contient aussi la documentation utile.

Vous pouvez activer l'accès en écriture anonyme en mettant simplement :

[general]
anon-access = write

Cependant, vous ne saurez pas qui a fait des changements à un référentiel, puisque la propriété svn:author sera vide. Vous serez aussi incapables de contrôler qui fait des changements à un référentiel. C'est un paramétrage quelque peu risqué !

Une façon de surmonter cela est de créer une base de données de mot de passe :

[general]
anon-access = none
auth-access = write
password-db = fichier_utilisateur

fichier_utilisateur est un fichier qui existe dans le même répertoire que svnserve.conf. Ce fichier peut vivre ailleurs dans votre système de fichiers (utile pour quand vous avez plusieurs référentiels qui exigent les mêmes droits d'accès) et peuvent être référencés en utilisant un chemin absolu, ou un chemin relatif au répertoire conf. Si vous incluez un chemin, il doit être écrit de /la/manière/unix. L'utilisation de \ ou des lettres de disque ne marchera pas. Le fichier_utilisateur devrait avoir une structure de :

[users]
nom_utilisateur = mot_de_passe
...

Cet exemple interdira tout accès aux utilisateurs non authentifiés (anonymes) et donnera l'accès en lecture-écriture aux utilisateurs inscrits dans fichier_utilisateur.

Astuce

Si vous gérez plusieurs référentiels avec la même base de données de mots de passe, l'utilisation d'un groupe d'identification facilitera la tâche des utilisateurs, dans la mesure où TortoiseSVN peut garder vos accréditations dans la mémoire cache vous n'avez à les saisir qu'une seule fois. Plus d'informations sont disponibles dans le manuel de Subversion dans les sections Create a 'users' file and realm and Client Credentials Caching

Sécuriser le serveur avec SASL

Qu'est-ce que SASL ?

La couche d'authentification et de sécurisation Cyrus est open source et développée par l'université Carnegie Mellon. Elle étoffe les protocoles réseau de capacités d'authentification et de cryptage, et tout comme Subversion à partir de sa version 1.5, svnserve et TortoiseSVN savent utiliser de cette librairie.

Pour plus de détails sur les options disponibles, consultez la section Using svnserve with SASL du manuel de référence de Subversion. Si vous recherchez un moyen simple de mettre en place un système d'authentification et de cryptage sur un serveur Windows, de manière à pouvoir accéder à votre référentiel depuis le gros méchant Internet, continuez à lire.

Authentification SASL

Pour activer le mécanisme spéficique à SASL sur le serverr, vous aurez besoin de faire trois choses. Premièrement, créer une section [sasl] dans le fichier svnserve.conf de votre référentiel, avec ce couple clé-valeur:

use-sasl = true

Ensuite, créez un fichier nommé svn.conf au bon endroit - typiquement dans le réportoire d'installation de Subversion.

Troisièmement, créer deux clefs de registre pour indiquer à SASL où trouver les éléments. Créez une clé nommée [HKEY_LOCAL_MACHINE\SOFTWARE\Carnegie Mellon\Project Cyrus\SASL Library] et insérez y deux valeurs de type chaine de caractère: SearchPath ayant comme valeur le chemin contenant le greffon sasl*.dll (qui est normalement le répertoire d'installation de Subversion), et ConfFile ayant comme valeur le chemin contenant le fichier svn.conf. Si vous avez utilisé le programme d'installation de CollabNet, ces clés auront déjà été créées pour vous.

Ajoutez les lignes suivantes au fichier svn.conf :

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: DIGEST-MD5
sasldb_path: C:\TortoiseSVN\sasldb

La dernière ligne contient le chemin vers la base de données d'authentification, qui est un fichier nommé sasldb. Elle peut aller n'importe où, mais un choix adapté est le répertoire parent du référentiel. Assurez vous que le service svnserve à le droit de lire ce fichier.

Si svnserve est démarré, redémarrez le pour qu'il puisse prendre en compte les nouvelles valeurs de configuration.

A présent que tout est mis en place, il ne vous reste plus qu'à créer des utilisateurs ainsi que leur mot de passe. Pour ce faire, utilisez l'utilitaire saslpasswd2. Si vous avez utilisé le programme d'installation de CollabNet, cet utilitaire sera dans le répertoire d'installation. Utilisez une commande du style :

saslpasswd2 -c -f C:\TortoiseSVN\sasldb -u realm utilisateur

L'option -f donne le chemin vers la base de données, realm doit avoir la même valeur que celle définie dans le fichier svnserve.conf de votre référentiel, et utilisateur est exactement ce à quoi vous vous attendez. La valeur realm ne doit pas contenir d'espace.

Vous pouvez voir la liste des utilisateurs enregistrés dans la base de données en utilisant le programme sasldblistusers2.

Cryptage SASL

Pour activer ou désactiver des niveaux de cryptage, vous pouvez renseigner les deux valeurs suivantes dans le fichier svnserve.conf de votre référentiel :

[sasl]
use-sasl = true
min-encryption = 128
max-encryption = 256

Les options min-encryption et max-encryption controlent le niveau de cryptage requis par le serveur. Pour désactiver complètement ce cryptage, mettez ces deux valeurs à 0. Pour activer un checksum simple (i.e., protéger et garantir l'intégrité des données non cryptées), mettez les deux options à 1. Si vous voulez que le cryptage soit possible (mais pas nécessaire), mettez le minimum à 0, et le maximum à une valeur de quelques bits. Pour obliger sans condition le cryptage, les deux options à des valeurs supérieures à 1. Dans notre exemple précédent, on oblige les clients à faire un cryptage situé entre 128 bits et 256 bits.

Authentification avec svn+ssh

Une autre façon d'authentifier les utilisateurs avec un serveur basé sur svnserve est d'utiliser un shell sécurisé (SSH) pour tunneler les requêtes. Cette méthode n'est pas aussi facile à configurer que SASL, mais peut être utile dans certains cas.

Avec cette approche, svnserve n'est pas exécuté comme un processus démon, le shell sécurisé démarre svnserve pour vous plutôt, l'exécutant comme l'utilisateur SSH authentifié. Pour activer cela, vous avez besoin d'un démon shell sécurisé sur votre serveur.

Une méthode simple pour mettre en place votre serveur est donnée là : Annexe G, Sécuriser Svnserve grâce à SSH. Vous pouvez trouver d'autres informations concernant SSH dans les FAQ en tapant « SSH » comme champ de recherche.

Plus d'informations sur svnserve dans Version Control with Subversion.

Autorisation basée sur le chemin avec svnserve

En démarrant avec Subversion 1.3, svnserve supporte le même arrangement d'autorisation à base de chemin mod_authz_svn qui est disponible avec le serveur Apache. Vous devez éditer le fichier conf/svnserve.conf dans votre répertoire de référentiel et ajouter une ligne se référant à votre fichier d'autorisation.

[general]
authz-db = authz

Ici, authz est un fichier que vous créez pour définir les autorisations d'accès. Vous pouvez utiliser un fichier séparé pour chaque référentiel, ou vous pouvez utiliser le même fichier pour plusieurs référentiels. Lisez la section intitulée « Autorisation basée sur le chemin » pour une description du format du fichier.