La plus flexible de toutes les installations serveur possibles pour Subversion est basée sur Apache. Bien qu'un peu plus compliquée à mettre en place, elle offre des avantages que d'autres serveurs n'ont pas :
.Le serveur Subversion basé sur Apache utilise le protocole WebDAV qui est aussi supporté par beaucoup d'autres programmes. Vous pourriez par exemple monter un tel référentiel comme un « Répertoire Web » dans l'explorateur Windows et y accéder ensuite comme n'importe quel autre dossier.
Vous pouvez diriger votre navigateur à l'URL de votre référentiel et naviguer dans son contenu sans avoir de client Subversion installé. Cela donne accès à vos données à un cercle beaucoup plus large d'utilisateurs.
Vous pouvez utiliser n'importe quel mécanisme d'identification que supporte Apache, y compris SSPI et LDAP.
Puisqu'Apache est très stable et sécurisé, vous obtenez automatiquement la même sécurité pour votre référentiel. Cela inclut le cryptage SSL.
La première chose dont vous avez besoin avant d'installer Apache est d'un ordinateur avec Windows2000, WinXP+SP1, Windows 2003, Vista ou Windows Server 2008.
Veuiller noter que Windows XP sans le service pack 1 entrainera des problèmes de données réseau et pourrait donc corrompre votre référentiel !
Téléchargez la dernière version du serveur web Apache à partir de http://httpd.apache.org/download.cgi. Assurez-vous que vous téléchargez la version 2.2.x - la version 1.3.xx ne marchera pas !
Le programme d'installation d'Apache est disponible en cliquant sur le lien autres fichiers, allez ensuite dans le répertoire binaries/win32. Vous pouvez utiliser le fichier msi apache-2.2.x-win32-x86-openssl-0.9.x.msi (celui incluant le support OpenSSL).
Une fois que vous avez l'installeur Apache2, vous pouvez double-cliquer dessus et il vous guidera dans le processus d'installation. Assurez-vous que vous entrez l'URL du serveur correctement (si vous n'avez pas de nom de DNS pour votre serveur entrez seulement l'adresse IP). Je recommande d'installer Apache pour Tous les Utilisateurs, sur le Port 80, en tant que Service . Note : si vous avez déjà IIS ou un autre programme lancé qui écoute sur le port 80 l'installation pourrait échouer. Si cela arrive, allez au répertoire de programmes, \Apache Group\Apache2\conf et repérer le fichier httpd.conf. Éditez ce fichier pour que Listen 80 soit changé pour un port libre, par exemple Listen 81. Redémarrez alors l'installation - elle devrait cette fois se terminer sans problème.
Maintenant testez si le serveur web Apache fonctionne correctement en allant avec votre navigateur internet à http://localhost/ - un site web préconfiguré devrait s'afficher.
Si vous décidez d'installer Apache en tant que service, soyez averti que par défaut il fonctionnera en tant que compte du système local. Une pratique plus sécurisée pour vous serait de créer un compte séparé pour exécuter Apache.
Assurez-vous que le compte sur le serveur sur lequel Apache fonctionne possède une entrée explicite dans la liste de contrôle d'accès du répertoire du référentiel (clic-droit sur le répertoire | propriétés | sécurité), avec contrôle total. Autrement, les utilisateurs ne seront pas capables de livrer leurs changements.
Même si Apache fonctionne en tant que système local, vous avez toujours besoin d'une telle entrée (qui sera le compte SYSTEM dans ce cas).
Si cette permission n'est pas activé dans la configuration de vote serveur Apache, vos utilisateurs auront des messages d'erreur « Accès refusé », qui s'afficheront dans le journal des erreurs Apache comme erreur 500.
Téléchargez la dernière version des fichiers binaires Win32 de Subversion pour Apache. Soyez sûr de prendre la version correspondant à la version d'Apache que vous avez installé, dans le cas contraire vous aurez un message imcompréhensible quand vous redémarrerez. Si votre version d'Apache est la 2.2.x allez à cette adresse : http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100.
Exécutez l'installeur de Subversion et suivez les instructions. Si l'installeur de Subversion a reconnu que vous avez installé Apache, donc vous êtes presque au bout. S'il n'a pas pu trouver un serveur Apache alors vous devez faire quelques étapes complémentaires.
En utilisant l'explorateur Windows, allez au répertoire d'installation de Subversion (d'habitude c:\program files\Subversion) et trouvez les fichiers /httpd/mod_dav_svn.so et mod_authz_svn.so. Copiez ces fichiers au répertoire de modules Apache (d'habitude c:\program files\apache group\apache2\modules ).
Copiez les fichiers /bin/libdb*.dll et /bin/intl3_svn.dll du répertoire d'installation de Subversion au répertoire bin d'Apache.
Éditez le fichier de configuration d'Apache (d'habitude C:\Program Files\Apache Group\Apache2\conf\httpd.conf) avec un éditeur de texte comme le Bloc-notes et faites les changements suivants :
Décommentez (supprimez la marque '#') les lignes suivantes :
#LoadModule dav_fs_module modules/mod_dav_fs.so #LoadModule dav_module modules/mod_dav.so
Ajoutez les deux lignes suivantes à la fin de la section LoadModule.
LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so
Vous avez maintenant mis en place Apache et Subversion, mais Apache ne sait pas encore comment gérer les clients Subversion comme TortoiseSVN. Pour qu'Apache sache quelle URL sera utilisée pour les référentiels Subversion vous devez éditer le fichier de configuration d'Apache (d'habitude placé dans c:\program files\apache group\apache2\conf\httpd.conf) avec votre éditeur de texte préféré (par exemple le Bloc-notes) :
À la fin du fichier de configuration, ajoutez les lignes suivantes :
<Location /svn> DAV svn SVNListParentPath on SVNParentPath D:\SVN #SVNIndexXSLT "/svnindex.xsl" AuthType Basic AuthName "Subversion repositories" AuthUserFile passwd #AuthzSVNAccessFile svnaccessfile Require valid-user </Location>
Elle correspondent à une configuration d'Apache pour prendre en compte des référentiels Subversion situés physiquement dans le répertoire D:\SVN. Les référentiels sont disponibles pour le monde extérieur à partir de l'URL : http://MonServeur/svn/ . L'accès est limité aux utilisateurs/mots de passe listés dans le fichier passwd.
Pour créer le fichier passwd, ouvrez l'invite de commande (la boîte DOS) une nouvelle fois, allez dans le dossier apache2 (habituellement c:\program files\apache group\apache2) et créez le fichier en tapant
bin\htpasswd -c passwd <nom de l'utilisateur>
Cela créera un fichier avec le nom passwd qui est utilisé pour l'authentification. Des utilisateurs supplémentaires peuvent être ajoutés avec
bin\htpasswd passwd <nom de l'utilisateur>
Redémarrer le service Apache une nouvelle fois.
Allez avec votre navigateur sur http://MonServeur/svn/MonNouveauRéférentiel (où MonNouveauRéférentiel est le nom du référentiel Subversion que vous avez créé auparavant). Si tout s'est bien passé, un nom d'utilisateur et un mot de passe vous seront demandés, puis vous pouvez voir le contenu de votre référentiel.
Une courte explication sur ce que vous venez juste de saisir :
Tableau 3.1. Réglages du httpd.conf d'Apache
| Réglage | Explication |
|---|---|
| <Location /svn> | veut dire que les référentiels Subversion sont disponibles à partir de l'URL http://MonServeur/svn/ |
| DAV svn | indique à Apache quel module sera responsable pour servir cette URL - dans ce cas le module de Subversion. |
| SVNListParentPath on | Pour la version 1.3 de Subversion et supérieure, cette directive permet de lister tous les référentiels disponibles sous SVNParentPath. |
| SVNParentPath D:\SVN | indique à Subversion de chercher des référentiel sous D:\SVN |
| SVNIndexXSLT "/svnindex.xsl" | Utilisé pour parcourir Internet avec un plus joli navigateur. |
| AuthType Basic | active l'authentification de base, c'est-à-dire Nom de l'utilisateur/mot de passe |
| AuthName "Subversion repositories" | est utilisé comme information chaque fois qu'un dialogue d'identification apparaît pour dire à l'utilisateur pour quoi l'authentification est demandée. |
| AuthUserFile passwd | spécifie quel fichier de mots de passe est utilisé pour l'authentification |
| AuthzSVNAccessFile | Emplacement du fichier d'accès pour les chemins à l'intérieur d'un référentiel Subversion |
| Require valid-user | spécifie que seuls ls utilisateurs qui ont entré un nom d'utilisateur/mot de passe correct peuvent accéder à l'URL |
Mais ce n'est qu'un exemple. Il y a beaucoup, beaucoup plus de possibilités que vous pouvez faire avec le serveur web Apache.
Si vous voulez que votre référentiel ait l'accès en lecture pour tout le monde mais l'accès en écriture seulement pour des utilisateurs spécifiques vous pouvez changer la ligne
Require valid-user
en
<LimitExcept GET PROPFIND OPTIONS REPORT> Require valid-user </LimitExcept>
Utiliser un fichier passwd limite et autorise l'accès à tous vos référentiels comme une unité. Si vous voulez plus de contrôle sur les utilisateurs par dossier à l'intérieur d'un référentiel vous pouvez décommenter la ligne
#AuthzSVNAccessFile svnaccessfile
et créer un fichier d'accès de Subversion. Apache s'assurera que seuls les utilisateurs valides sont capables d'avoir accès votre emplacement /svn et passera alors le nom d'utilisateur au module AuthzSVNAccessFile de Subversion pour qu'il puisse mettre en application un accès plus granulaire basé sur les règles inscrites dans le fichier d'accès de Subversion. Notez que les chemins sont spécifiés comme référentiel:chemin ou simplement chemin. Si vous ne spécifiez pas de référentiel particulier, cette règle d'accès s'appliquera à tous les référentiels sous SVNParentPath. Le format du fichier de stratégie d'autorisation utilisé par mod_authz_svn est décrit dans la section intitulée « Autorisation basée sur le chemin »
Pour parcourir le référentiel avec un navigateur Internet plus agréable, décommentez la ligne
#SVNIndexXSLT "/svnindex.xsl"
et mettez les fichiers svnindex.xsl, svnindex.css et menucheckout.ico dans le dossier racine (la plupart du temps C:/Program Files/Apache Group/Apache2/htdocs). Le nom de ce répertoire est fixé par la directive DocumentRoot dans votre fichier de configuration Apache.
Vous pouvez récupérer ces trois fichiers depuis notre référentiel : http://tortoisesvn.googlecode.com/svn/trunk/contrib/svnindex. (la section intitulée « TortoiseSVN est gratuit ! » explique comment accéder au référentiel des sources de TortoiseSVN).
Le fichier XSL du référentiel TortoiseSVN a une fonctionnalité pratique : Si vous parcourez le référentiel grâce à un navigateur Internet, chaque répertoire aura une icone sur sa droite. Si vous cliquez sur cette icone, la fenêtre de livraison de TortoiseSVN sera ouverte depuis cette URL.
Si vous avez utilisé la directive SVNParentPath alors vous n'avez pas à changer le fichier de configuration d'Apache chaque fois que vous ajoutez un nouveau référentiel Subversion. Créez simplement le nouveau référentiel au même emplacement que le premier référentiel et vous avez fini ! Dans ma société, j'ai un accès direct à ce dossier spécifique sur le serveur via SMB (accès Windows normal aux fichiers). Donc je crée juste un nouveau dossier là, j'exécute la commande de TortoiseSVN → et un nouveau projet a un foyer...
Si vous utilisez Subversion 1.3 ou supérieur, vous pouvez utiliser la directive SVNListParentPath on pour permettre à Apache de produire une liste de tous les projets disponibles si vous allez avec votre navigateur sur le chemin parent plutôt qu'à un référentiel spécifique.
Le module mod_authz_svn permet un contrôle précis des autorisations d'accès basé sur les noms des utilisateurs et les chemins de référentiel. C'est possible avec le serveur Apache et, à partir de Subversion 1.3, c'est aussi disponible avec svnserve.
Un fichier d'exemple ressemblerait à ceci :
[groups] admin = john, kate devteam1 = john, rachel, sally devteam2 = kate, peter, mark docs = bob, jane, mike training = zak # Accès par défaut à TOUS les référentiels # Tout le monde peut lire, les admins peuvent écrire, Dan German est exclus. [/] * = r @admin = rw dangerman = # Permet aux développeurs un accès total aux référentiels de leurs projets [proj1:/] @devteam1 = rw [proj2:/] @devteam2 = rw [bigproj:/] @devteam1 = rw @devteam2 = rw trevor = rw # Donne aux personnes en charge de la documentation un accès en écrite sur tous les répertoires de la documentation [/trunk/doc] @docs = rw # Donne aux débutants un accès en écriture uniquement au référentiel d'entraînement [TrainingRepos:/] @training = rw
Notez que la vérification de chaque chemin peut être une opération couteuse, particulièrement dans le cas du journal de révision. Le serveur vérifie chaque chemin changé dans chaque révision et le vérifie pour la lisibilité, qui peut être consommatrice de temps sur les révisions qui affectent de grands nombres de fichiers.
L'authentification et l'autorisation sont des processus séparés. Si un utilisateur veut obtenir l'accès à un chemin de référentiel, il doit satisfaire tant les pré-requis habituels d'authentification que les pré-requis d'autorisation du fichier d'accès.
Comme vous l'avez peut-être remarqué vous devez faire une entrée nom d'utilisateur/mot de passe dans le fichier passwd pour chaque utilisateur séparément. Et si (pour des raisons de sécurité) vous voulez que vos utilisateurs changent périodiquement leurs mots de passe vous devez faire le changement manuellement.
Mais il y a une solution pour ce problème - du moins si vous avez accès au référentiel de l'intérieur d'un réseau local avec un contrôleur de domaine Windows : mod_auth_sspi !
Le module SSPI original a été offert par Syneapps en incluant le code source. Mais son développement a été arrêté. Mais ne désespérez pas, la communauté l'a récupéré et l'a amélioré. Il a un nouveau foyer sur SourceForge.
Téléchargez le module qui correspond à votre version d'Apache, copiez alors le fichier mod_auth_sspi.so dans le dossier contenant les modules Apache.
Éditez le fichier de configuration d'Apache : ajoutez la ligne
LoadModule sspi_auth_module modules/mod_auth_sspi.so
à la section LoadModule. Assurez-vous d'insérer cette ligne avant la ligne
LoadModule auth_module modules/mod_auth.so
Pour faire que les emplacements de Subversion utilisent ce type d'authentification, vous devez changer la ligne
AuthType Basic
en
AuthType SSPI
vous devez ajouter aussi
SSPIAuth On SSPIAuthoritative On SSPIDomain <domaincontroller> SSPIOmitDomain on SSPIUsernameCase lower SSPIPerRequestAuth on SSPIOfferBasic On
dans le bloc <Location /svn>. Si vous n'avez pas de contrôleur de domaine, laissez le nom du contrôle de domaine comme <domaincontroller>.
Notez que si vous vous authentifiez en utilisant SSPI, alors vous n'avez plus besoin de la ligne AuthUserFile pour définir un fichier de mot de passe. Apache authentifie votre nom d'utilisateur et votre mot de passe avec votre domaine Windows à la place. Vous devrez mettre à jour la liste d'utilisateurs dans votre svnaccessfile pour faire aussi référence au DOMAINE\nom d'utilisateur.
L'authentification SSPI n'est disponible que pour les connexions sécurisées de type SSL (https). Si vous vous connectez à votre serveur en utilisant une connexion http simple, cela ne fonctionnera pas.
Pour activer SSL sur votre serveur, voir le chapitre : la section intitulée « Sécuriser le serveur avec SSL »
Les fichiers AuthzSVNAccessFile de Subversion sont sensibles à la casse en ce qui concerne les noms d'utilisateur ("JUtilisateur" diffère "jutilisateur").
Dans le monde de Microsoft, les domaines Windows et les mots de passe ne sont pas sensibles à la casse. Cependant, certains administrateurs réseau aiment créer des comptes utilisateur en CamelCase (par exemple "JUtilisateur").
Cette différence peut vous mordre quand vous utilisez l'authentification SSPI lorsque le domaine Windows et les noms d'utilisateur sont passés à Subversion comme lorsque l'utilisateur les tape à l'invite. Internet Explorer passe souvent le nom de l'utilisateur à Apache en utilisant automatiquement la casse avec laquelle le compte a été créé.
Le résultat final est que vous pouvez avoir besoin d'au moins deux entrées dans votre AuthzSVNAccessFile pour chaque utilisateur - une entrée minuscule et une entrée dans la même casse que celle qu'Internet Explorer passe à Apache. Vous devrez aussi apprendre à vos utilisateurs à aussi taper leurs accréditations en utilisant les minuscules quand ils accèdent aux référentiels via TortoiseSVN.
Les journaux d'Erreurs et d'Accès d'Apache sont vos meilleurs amis dans le déchiffrement de problèmes comme ceux-ci puisqu'ils vous aideront à déterminer la chaîne du nom d'utilisateur passée par le module AuthzSVNAccessFile de Subversion. Vous pouvez avoir besoin d'expérimenter avec le format exact de la chaîne de l'utilisateur dans le svnaccessfile (par exemple DOMAINE\utilisateur contre DOMAINE//utilisateur) pour que tout fonctionne.
Il est aussi possible d'avoir plus d'une source d'authentification pour votre référentiel Subversion. Pour ce faire, vous devez rendre chaque type d'authentification non définitive, pour qu'Apache vérifie plusieurs sources pour la correspondance nom utilisateur/mot de passe.
Un scénario fréquent consiste à utiliser l'authentification par le domaine Windows et par fichier passwd, pour que vous puissiez fournir un accès SVN aux utilisateurs qui ne possèdent pas de login dans le domaine Windows.
Pour activer l'authentification via le domaine Windows et par un ficher d'authentification passwd, ajoutez les lignes suivantes dans le bloc <Location> de votre fichier de configuration Apache :
AuthBasicAuthoritative Off SSPIAuthoritative Off
Voici un exemple de configuration complète d'Apache pour une authentification combinant le domaine Windows et le fichier d'authentification passwd :
<Location /svn> DAV svn SVNListParentPath on SVNParentPath D:\SVN AuthName "Subversion repositories" AuthzSVNAccessFile svnaccessfile.txt # NT Domain Logins. AuthType SSPI SSPIAuth On SSPIAuthoritative Off SSPIDomain <domaincontroller> SSPIOfferBasic On # Htpasswd Logins. AuthType Basic AuthBasicAuthoritative Off AuthUserFile passwd Require valid-user </Location>
Même si Apache 2.2.x permet le support OpenSSL, ce n'est pas activé par défatu. Vous devez l'activer manuellement.
Dans le fichier de configuraton apache, décommentez les lignes:
#LoadModule ssl_module modules/mod_ssl.so
et en bas
#Include conf/extra/httpd-ssl.conf
changez alors la ligne (sur une seule ligne)
SSLMutex "file:C:/Program Files/Apache Software Foundation/\ Apache2.2/logs/ssl_mutex"
en
SSLMutex default
Ensuite vous devez créer un certificat SSL. Pour faire cela ouvrez une invite de commande (la boîte DOS) et allez au dossier d'Apache (par exemple C:\program files\apache group\apache2) et tapez la commande suivante :
bin\openssl req -config conf\openssl.cnf -new -out mon-serveur.csr
On vous demandera une phrase de mot de passe. N'utilisez pas s'il vous plaît de mots simples, mais des phrases entières, par exemple une partie d'une poésie. Plus la phrase est longue, mieux c'est. Vous devez aussi entrer l'URL de votre serveur. Toutes les autres questions sont facultatives mais nous vous recommandons de remplir celles-ci aussi.
Normalement le fichier privkey.pem est créé automatiquement, mais si ce n'est pas le cas vous devez exécuter cette commande pour le générer:
bin\openssl genrsa -out conf\privkey.pem 2048
Ensuite, tapez les commandes
bin\openssl rsa -in conf\privkey.pem -out conf\server.key
et (sur une seule ligne)
bin\openssl req -new -key conf\server.key -out conf\server.csr \ -config conf\openssl.cnf
puis (sur une seule ligne)
bin\openssl x509 -in conf\server.csr -out conf\server.cert
-req -signkey conf\server.key -days 4000
Cela créera un certificat qui expirera dans 4000 jours. Et enfin écrivez (sur une seule ligne) :
bin\openssl x509 -in conf\server.cert -out conf\server.der.crt
-outform DER
Ces commandes ont créé quelques fichiers dans le répertoire conf de Apache (server.der.crt, server.csr, server.key, .rnd, privkey.pem, server.cert).
Redémarrez le service Apache.
Allez avec votre navigateur à https://servername/svn/project ...
Si vous sécurisez votre serveur avec SSL et utilisez l'authentification avec un domaine Windows vous vous apercevrez que la navigation dans le référentiel avec Internet Explorer ne marche plus. Ne vous inquiétez pas - c'est seulement qu'Internet Explorer n'est pas capable d'authentifier. Les autres navigateurs n'ont pas ce problème et TortoiseSVN et les autres clients Subversion sont toujours capable d'authentifier.
Si vous voulez toujours utiliser IE pour parcourir le référentiel vous pouvez soit :
définissez une directive <Location /path> dans le fichier de configuration d'Apache et ajoutez SSPIBasicPreferred On. Cela permettra à IE d'authentifier à nouveau, mais les autres navigateurs et Subversion ne seront pas capables d'authentifier pour cet emplacement.
Offrir de naviguer avec une authentification non cryptée (sans SSL) aussi. Étrangement IE n'a pas de problèmes avec l'authentification si la connexion n'est pas sécurisée avec SSL.
Dans l'installation "standard" de ssl, il y a souvent la déclaration suivante dans l'hôte SSL virtuel d'Apache :
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
Il y a (avait ?) de bonnes raisons pour cette configuration, regardez http://www.modssl.org/docs/2.8/ssl_faq.html#ToC49 Mais si vous voulez l'authentification NTML vous devez utiliser keepalive. Si vous décommentez entièrement SetEnvIf vous devriez être capables d'authentifier IE avec l'authentification windows avec SSL et Apache sur Win32 avec mod_auth_sspi inclus.
Une fois que vous avez mis en place SSL pour rendre votre référentiel plus sécurisé, vous pourriez vouloir désactiver l'accès normal non-SSL (http) et permettre seulement l'accès https. Pour ce faire, vous devez ajouter une autre directive au bloc <Location> de Subversion : SSLRequireSSL.
Voici un exemple de bloc <Location> :
<Location /svn> DAV svn SVNParentPath D:\SVN SSLRequireSSL AuthType Basic AuthName "Subversion repositories" AuthUserFile passwd #AuthzSVNAccessFile svnaccessfile Require valid-user </Location>
Envoyé à la liste de diffusion TortoiseSVN par Nigel Green. Merci !
Avec certaines configurations de serveur, vous pouvez avoir à mettre en place un seul serveur avec 2 hôtes SSL virtuels: Le premier pour les accès internet publics, ne nécessitant aucun certificat côté client. Et un second, sécurisé avec certificat côté client, où tourne le serveur Subversion.
Dans le fichier de configuration de Apache, ajouter une directive SSLVerifyClient Optional à la section per-server (i.e. en dehors de balises VirtualHost et Directory) force Apache à demander un certificat au client au moment d'établir la connexion SSL. A cause d'un bug dans le module mod_ssl il est crucial de demander le certificat à ce moment car sinon il ne fonctionnera plus en cas de tentative de re-connexion SSL.
La solution est d'ajouter la directive suivante dans le répertoire du virtual host que vous voulez réserver à Subversion:
SSLRequire %{SSL_CLIENT_VERIFY} eq "SUCCESS"
Cette directive autorise l'accès au répertoire seulement si le certificat du client a été reçu et validé.
Pour résumer; les lignes utiles du fichier de configuration Apache sont:
SSLVerifyClient Optional
### Configuration du virtual host public
### (ne nécessitant pas de certificat)
<VirtualHost 127.0.0.1:443>
<Directory "chemin du repertoire racine public">
</Directory>
</VirtualHost>
### Configuration du virtual host pour SUBVERSION
### (nécessitant une certificat)
<VirtualHost 127.0.0.1:443>
<Directory "chemin du repertoire racine de subversion">
SSLRequire %{SSL_CLIENT_VERIFY} eq "SUCCESS"
</Directory>
<Location /svn>
DAV svn
SVNParentPath /chemin du referentiel
</Location>
</VirtualHost>