SVN sous Apache

De EjnTricks

Le serveur de source SVN peut être exposé sous Apache. Cet article est inspiré de la documentation officiel de Ubuntu: http://doc.ubuntu-fr.org/subversion#serveur_svn_seul. Exposer les repositories derrière Apache permet de remplacer l'utilisation de svnserve.

Hand-icon.png Votre avis

Current user rating: 99/100 (1 votes)

 You need to enable JavaScript to vote


Dependencies.gif Activation du module libapache2-svn

#sudo apt-get install libapache2-svn
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Paquets suggérés :
  db4.8-util
Les NOUVEAUX paquets suivants seront installés :
  libapache2-svn
0 mis à jour, 1 nouvellement installés, 0 à enlever et 23 non mis à jour.
Il est nécessaire de prendre 163ko dans les archives.
Après cette opération, 377ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://fr.archive.ubuntu.com/ubuntu/ lucid/universe libapache2-svn 1.6.6dfsg-2ubuntu1 [163kB]
163ko réceptionnés en 1s (114ko/s)                      
Sélection du paquet libapache2-svn précédemment désélectionné.
(Lecture de la base de données... 143810 fichiers et répertoires déjà installés.)
Dépaquetage de libapache2-svn (à partir de .../libapache2-svn_1.6.6dfsg-2ubuntu1_i386.deb) ...
Paramétrage de libapache2-svn (1.6.6dfsg-2ubuntu1) ...
Considering dependency dav for dav_svn:
Enabling module dav.
Enabling module dav_svn.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Il est nécessaire de recharger le serveur Apache:

#sudo apache2ctl graceful


Icon-Configuration-Settings.png Déploiement site sécurisé

La procédure décrite ci dessous permet de mettre à disposition l'application avec un accès sécurisé HTTPS avec utilisation d'un certificat fourni par Let's Encrypt et un tutoriel très bien réalisé.

L'application sera rendue disponible depuis un sous domaine du domaine principal en mode HTTP et HTTPS. Une authentification sera demandée pour le protocole HTTPS afin de filtrer les dépôts en fonction des informations de connexion. Pour le protocole HTTP, seul les dépôts public seront présentés et aucune authentification ne sera demandée.

Ce paragraphe présente la mise en place d'un accès sur un dépôt créé dans le répertoire /var/opt/svn/publicrepo, et sera accessible depuis l'URL http://www.svn.dummy.net/publicrepo.

System-Install-icon.png Préparation environnement

Certbot sera utilisé pour demander et renouveler le certificat du site. Dans son fonctionnement, le process essaye d'accéder à un .well-known à la racine du site. De plus, une bonne pratique consiste à fournir un répertoire racine pour les sites déployés sous Apache. Le répertoire /var/www/svn est alors créé, ainsi que le sous répertoire .well-known.

#sudo mkdir -p /var/www/svn/.well-known

Il est recommandé de placer un fichier html, avec un contenu vide, dans le répertoire racine, soit /var/www/svn.

<html>
<head>
</head>
<body>
</body>
</html>

Un fichier robots.txt y est placé avec les directives indiquant aux moteurs de recherche que tout est disponible.

User-agent: *
Disallow:

Les permissions mises en place donnent un accès uniquement aux compte du serveur, soit www-data.

#sudo find /var/www/svn -type f -exec chmod 0600 {} \;
#sudo find /var/www/svn -type d -exec chmod 0700 {} \;
#sudo chown -R www-data:www-data /var/www/svn

Configuration-icon.png Configuration HTTP

Dans un premier temps, une configuration est mise en place pour accéder de façon non sécurisé. Un fichier svn est créé dans le répertoire /etc/apache2/sites-available avec le contenu suivant.

<VirtualHost *:80>
    ServerAdmin contact-email@dummy.net
    ServerName www.svn.dummy.net
    DocumentRoot /var/www/svn
    DirectoryIndex index.html

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/svn_error.log
    CustomLog ${APACHE_LOG_DIR}/svn_access.log combined

    <Directory /var/www/svn>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    <Location /publicrepo>
        DAV svn
        SVNPath /var/opt/svn/publicrepo
        AuthzSVNAccessFile /var/opt/svn/publicrepo/conf/authz
    </Location>
</VirtualHost>

Cette configuration doit être mise à disposition en plaçant un lien dans /etc/apache2/sites-enabled.

#sudo ln -s /etc/apache2/sites-available/svn /etc/apache2/sites-enabled/008-svn.conf

Le nom du lien, à savoir 008-svn.conf, respecte une incrémentation sur la machine utilisée, il peut être remplacé pour tout autre nom valide pour Apache.

Il suffit de relancer la configuration d'Apache pour qu'elle soit prise en compte.

#sudo apache2ctl graceful

Certificate Server icon.png Certificat

L'application est à présent disponible avec l'URL http://www.svn.dummy.net. Un certificat va être demandé à l'aide de Certbot.

#sudo certbot certonly --webroot -w /var/www/svn -d www.svn.dummy.net --email contact-email@dummy.net
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www.svn.dummy.net
Using the webroot path /var/www/svn for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.svn.dummy.net/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.svn.dummy.net/privkey.pem
   Your cert will expire on 2018-05-13. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Le certificat est stocké dans le répertoire /etc/letsencrypt/live/www.svn.dummy.net/.

Lock-icon.png Configuration HTTPS

Le certificat étant disponible, la configuration HTTPS peut être mise en place. Un fichier svn-dummy-ssl est créé dans le répertoire /etc/apache2/sites-available avec le contenu suivant, contenant une configuration sur LDAP avec authentification aux sources stockées dans le répertoire /var/opt/svn/publicrepo.

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin contact-email@dummy.net
    ServerName www.svn.dummy.net
    DocumentRoot /var/www/svn
    DirectoryIndex index.html

    LogLevel warn
    ErrorLog ${APACHE_LOG_DIR}/svn_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/svn_ssl_access.log combined

    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    SSLEngine on
    SSLCertificateFile         /etc/letsencrypt/live/www.svn.dummy.net/cert.pem
    SSLCertificateKeyFile      /etc/letsencrypt/live/www.svn.dummy.net/privkey.pem
    SSLCertificateChainFile    /etc/letsencrypt/live/www.svn.dummy.net/chain.pem
    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder on
    SSLCompression off
    SSLOptions +StrictRequire
    SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

    <Directory /var/www/svn>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    <Location /publicrepo>
        DAV svn
        SVNPath /var/opt/svn/publicrepo
        SVNAutoversioning on
        AuthzSVNAccessFile /var/opt/svn/publicrepo/conf/authz

        AuthType Basic
        AuthName "Public Repository with Authentication"
        AuthBasicProvider ldap
        AuthLDAPURL ldap://localhost:389/ou=people,dc=ejnserver,dc=fr?uid
        require valid-user
    </location>
</VirtualHost>
</IfModule>

A noter que le fichier robots.txt n'est pas modifié pour interdire les accès car une connexion est nécessaire.


Cette configuration doit être mise à disposition en plaçant un lien dans /etc/apache2/sites-enabled.

#sudo ln -s /etc/apache2/sites-available/svn-dummy-ssl /etc/apache2/sites-enabled/009-svn-ssl.conf

Le nom du lien, à savoir 009-svn-ssl.conf, respecte une incrémentation sur la machine utilisée, il peut être remplacé pour tout autre nom valide pour Apache.

La configuration HTTP, sur le port 80, n'est pas modifiée pour laisser un accès aux dépôts publiques.

Il suffit de relancer la configuration d'Apache pour que les modifications soient prises en compte.

#sudo apache2ctl graceful


Warning-icon.png Configuration simple

Modification du fichier dav_svn.conf

Dans cet exemple, la configuration est mise en place pour un repository individuel avec les hypothèses suivantes:

  • Emplacement du repository /var/opt/svn/study
  • Exposition sous l'URL /svn/study

Lors de l'installation, le fichier dav_svn.conf est déployé dans le répertoire /etc/apache2/mods-available et un lien est positionné dans le répertoire /etc/apache2/mods-enabled. Celui ci est modifié ainsi:

# dav_svn.conf - Example Subversion/Apache configuration
#
# For details and further options see the Apache user manual and
# the Subversion book.
#
# NOTE: for a setup with multiple vhosts, you will want to do this
# configuration in /etc/apache2/sites-available/*, not here.

# <Location URL> ... </Location>
# URL controls how the repository appears to the outside world.
# In this example clients access the repository as http://hostname/svn/
# Note, a literal /svn should NOT exist in your document root.
<Location /svn/study>

  # Uncomment this to enable the repository
  DAV svn

  # Set this to the path to your repository
  SVNPath /var/opt/svn/study
  # Alternatively, use SVNParentPath if you have multiple repositories under
  # under a single directory (/var/lib/svn/repo1, /var/lib/svn/repo2, ...).
  # You need either SVNPath and SVNParentPath, but not both.
  #SVNParentPath /var/lib/svn

  # Access control is done at 3 levels: (1) Apache authentication, via
  # any of several methods.  A "Basic Auth" section is commented out
  # below.  (2) Apache <Limit> and <LimitExcept>, also commented out
  # below.  (3) mod_authz_svn is a svn-specific authorization module
  # which offers fine-grained read/write access control for paths
  # within a repository.  (The first two layers are coarse-grained; you
  # can only enable/disable access to an entire repository.)  Note that
  # mod_authz_svn is noticeably slower than the other two layers, so if
  # you don't need the fine-grained control, don't configure it.

  # Basic Authentication is repository-wide.  It is not secure unless
  # you are using https.  See the 'htpasswd' command to create and
  # manage the password file - and the documentation for the
  # 'auth_basic' and 'authn_file' modules, which you will need for this
  # (enable them with 'a2enmod').
  #AuthType Basic
  #AuthName "Subversion Repository"
  #AuthUserFile /etc/apache2/dav_svn.passwd

  # To enable authorization via mod_authz_svn
  #AuthzSVNAccessFile /etc/apache2/dav_svn.authz

  # The following three lines allow anonymous read, but make
  # committers authenticate themselves.  It requires the 'authz_user'
  # module (enable it with 'a2enmod').
  #<LimitExcept GET PROPFIND OPTIONS REPORT>
    #Require valid-user
  #</LimitExcept> 

</Location>

Ainsi:

  • La configuration <Location /svn/study> est responsable de la configuration de l'URL de base.
  • La configuration SVNPath /var/opt/svn/study permet d'indiquer l'emplacement root des sources.

Cependant, le paramétrage étant dans la configuration du module, cela s'applique à tous les sites hébergé sur le serveur Apache. Ainsi si des sous domaines sont mis en place, le serveur SVN sera visible.

Configuration-icon.png Modification configuration site

Afin de présenter les sources sous un site en http sans authentification, et un accès sous https avec authentification (LDAP par exemple), il est préférable de modifier la configuration du site. Dans le cadre de cet article nous prendrons comme exemple:

  • Fichier /etc/apache2/sites-available/default, avec un lien /etc/apache2/sites-enables/000-default pour publier en http.
  • Fichier /etc/apache2/sites-available/default-ssl, avec un lien /etc/apache2/sites-enables/001-default-ssl pour publier en https.

Les configurations à mettre en place sont identiques aux modifications mises en place dans le fichier dav_svn.conf.

Dans le fichier /etc/apache2/sites-available/default, aucune information d'authentification n'est mise en place, donnant ainsi un libre accès aux sources stockées dans le répertoire /var/opt/svn/study

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/default
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/default>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        <Location /svn/study>
                DAV svn
                SVNPath /var/opt/svn/study
                AuthzSVNAccessFile /var/opt/svn/study/conf/authz
        </Location>

</VirtualHost>

Attention, il est important de spécifier le paramètre AuthzSVNAccessFile, indiquant l'emplacement du fichier de définition des droits d'accès. Si cet élément est omis, alors les propriétés par défaut sont accordées aux utilisateurs accédant au dépôt, et donc en anonyme. Sur l'instance installée sous Ubuntu, ces permissions donnent un contrôle total, ce qui n'est pas acceptable.

Dans le fichier /etc/apache2/sites-available/default-ssl, une configuration sur LDAP est mise en place, donnant ainsi un accès avec authentification aux sources stockées dans le répertoire /var/opt/svn/study.

<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/default
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/default>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        <location /svn/study>
                DAV svn
                SVNPath /var/opt/svn/study
                SVNAutoversioning on
                AuthzSVNAccessFile /var/opt/svn/study/conf/authz

                AuthType Basic
                AuthName "Study Repository"
                AuthBasicProvider ldap
                AuthLDAPURL ldap://localhost:389/ou=people,dc=ejnserver,dc=fr?uid
                require valid-user
        </location>

</VirtualHost>

Une fois mis en place, les sources sont disponibles sur les deux protocoles. Le lien sur /etc/apache2/mods-available/dav_svn.conf n'a plus lieu d'exister car les configurations sont mises en place sur chacun des sites déclarés:

#sudo rm /etc/apache2/mods-enabled/dav_svn.conf