La Lanterne Rouge

Warning: Geek Inside

Reverse proxy HTTPS/SVN avec Apache

- Posted in Sans catégorie by

Reverse proxy HTTPS/SVN avec Apache

Si jamais vous avez un jour besoin de monter un reverse-proxy avec Apache devant un serveur SubVersioN accessible via HTTPS (par Apache/DAV par exemple), voici un petit exemple de configuration fonctionnelle.

Note : j'utiliserai "RP" pour Reverse-Proxy et "SVN" pour... SubVersioN évidemment.

Le serveur Apache RP doit au préalable avoir les modules suivants installés et fonctionnels :

  • mod_ssl
  • mod_proxy
  • mod_proxy_http
  • mod_proxy_connect

Attention : l'activation du module de proxy peut potentiellement transformer votre Apache en proxy ouvert, accessible et utilisable par tout le monde. Fort heureusement, la directive ProxyRequests est par défaut à Off, mais vérifiez bien qu'aucun fichier de configuration ne l'active sur votre serveur.

Reverse proxy HTTPS/SVN avec Apache

L'URL du serveur SVN sera la suivante : https://svn.domaine.local/projet1/

L'URL du serveur en RP sera la suivante : https://svn.domaine.fr/projet1/

Le but ici sera de mapper l'une à l'autre, de manière à ce qu'un utilisateur se connectant depuis Internet à l'adresse (publique) https://svn.domaine.fr/projet1/ accède au dépôt SVN à l'adresse (interne) https://svn.domaine.local/projet1/.

Voici le fichier de configuration du VirtualHost à utiliser sur le serveur Apache tournant sur la machine svn.domaine.fr :

<VirtualHost *:443>
        ServerName svn.domaine.fr
        DocumentRoot /srv/http
        ErrorLog /var/log/apache2/svn-proxy.error.log

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

        ProxyPass /projet1/ https://svn.domaine.local/projet1/

        SSLProxyEngine On
        <Proxy *>
                Order allow,deny
                Allow from all
        </Proxy>

        <Location /projet1/ >
                ProxyPassReverse https://svn.domaine.local/projet1/
                <Limit OPTIONS PROPFIND GET REPORT MKACTIVITY PROPPATCH PUT CHECKOUT MKCOL MOVE COPY DELETE LOCK UNLOCK MERGE>
                        Order Deny,Allow
                        Allow from all
                        Satisfy Any
                </Limit>
        </Location>
</VirtualHost>

Les points importants ici sont :

  • La nécessité de préciser explicitement dans le bloc <Limit> les méthodes correspondant aux actions SVN autorisées à s'exécuter (je n'ai trouvé aucun document le confirmant mais il semblerait que seules quelques méthodes classiques comme GET, POST, OPTIONS et autres soient autorisées par défaut)
  • Faire parfaitement correspondre les chemins du bloc <Location> et de la directive ProxyPassReverse : le chemin du serveur RP doit être celui du dépôt SVN (ici "/projet1/" très exactement). J'avais initialement placé cette directive après ProxyPass avec le chemin complet (autre syntaxe possible normalement) mais les tentatives de connexion me renvoyaient une erreur 405 "Method not allowed" sur l'action PROPFIND jusqu'à ce que je la déplace. Cette contrainte viendrait d'un problème de réécriture de headers et pourrait être contournée d'une manière plus élégante mais je n'ai pas cherché plus loin. Je ne trouve malheureusement plus l'URL de la page qui m'a donné la solution :(
  • Inutile de préciser mais au cas où, hein, il faut que le RP puisse accéder au dépôt via l'URL interne https://svn.domaine.local/projet1/. Ben oui, c'est un proxy, pas un magicien :)

Une fois le vhost enregistré, un petit

# apachectl restart

et - à condition que les DNS soient à jour évidemment - il devrait être désormais possible d'utiliser l'URL https://svn.domaine.fr/projet1/ pour accéder en fait au dépôt situé à l'adresse https://svn.domaine.local/projet1/.