• Apache, https et reverse proxy

    Introduction

    Étant pingre toujours à la recherche de bons plans, je profite d’une offre gratuite pour héberger ce site (chez 1and1, société que je ne conseille pas si vous devez payer, pour pleins de raisons qui seraient hors sujets ici).

    Bref, qui dit gratuité, dit souvent service minimum (bon, même si dans mon cas, ce n’est pas tout à fait vrai).
    En faite, ce qu’il me manque vraiment, c’est de pouvoir me connecter à mon site en https.

    Pourquoi ? Simple. J’ai parfois besoin d’accéder à l’espace d’administration depuis des lieux publics (des hotspots par exemple). Et j’avoue que l’idée de taper mon mot de passe en sachant pertinemment que celui-ci va circuler en clair me gène beaucoup (si si, surtout quand il existe un moyen de l‘éviter).

    Une solution

    Possédant déjà un serveur personnel sous OpenBSD à la maison (ou home server, ce terme risque de devenir à la mode d’ici peu…), j’utilise sur celui-ci depuis longtemps le mod_ssl d’apache afin d’avoir un accès https.

    img_right L’idée est donc de se servir du mod_proxy pour utiliser mon home server comme une passerelle permettant d’ouvrir une sorte de tunnel “sécurisé” entre mon ordinateur portable et les pages d’administrations.

    L’exemple qui suit est valable sous OpenBSD. Pour les autres systèmes, les fichiers ne seront pas forcement dans le même répertoire, et les problèmes pourront être différents.

    Il suffit en théorie de modifier le httpd.conf (dans /var/www/conf/ ) en activant le mode proxy (si ce n’est pas déjà fait) et rajoutant quelques lignes à la fin du SSL Virtual Host Context.

                      # caching proxy
    LoadModule proxy_module /usr/lib/apache/modules/libproxy.so
    
    ##
    ## SSL Virtual Host Context
    ##
    <VirtualHost _default_:443>
    #  General setup for the virtual host
    [...]
    
    <IfModule mod_proxy.c>
          ProxyRequests Off
          <Directory proxy:*>
                  Order deny,allow
                  Allow from all
          </Directory>
          ProxyPass /textadmin/ http://nezetic.net:80/textpattern/
          ProxyPassReverse /textadmin/ http://nezetic.net:80/textpattern/
    </IfModule>
    
    </VirtualHost
                    

    Pour utiliser le reverse proxy, on ouvre la page via http://monhomeserver.net/textadmin/ (le slash final est très important). Et voilà.

    Sauf que, sous OpenBSD, ceci ne fonctionne pas.
    En effet, il semble que le fork d’apache de ce merveilleux système soit buggé.
    Et quoi qu’on fasse, le mod_proxy retourne un malheureux host not found.

    Après recherche, j’ai compris le problème, et j’ai trouvé une solution (non sans mal, merci Google).

    Le problème apparait si l’on possède une configuration normale, avec la variable ServerName paramétrée comme il se doit. Si on la commente, le reverse proxy fonctionne.

    Sauf que la commenter, c’est mal.

    D’où une solution, pour le moins étrange (et à la fois logique, quand on sait que l’apache d’OpenBSD tourne dans une cage).

    Il suffit de créer un répertoire etc à la racine de la cage ( /var/www ), puis d’y ajouter un fichier hosts, contenant en première ligne l’IP local correspondant au ServerName, et en 2e ligne, l’IP du serveur distant (ici nezetic.net).

                      192.168.1.2 monhomeserver.net
    82.165.72.200 nezetic.net www.nezetic.net
                    

    Et pouf, tout marche comme par magie (ou presque).

    Conclusion

    On peut améliorer le reverse proxy en utilisant un mode d’apache tel que mod_proxy_html (que je ne conseille pas, il crée une grosse charge et à tendance à modifier un peu trop le code HTML que crache votre serveur), mais dans la plupart des cas, ce que je décris plus haut suffit.

    Et même si l’utilisation via HTTPS est loin d‘être complètement sûre, elle a le mérite d‘être là, rassurante…

    Sources & Lectures
    www.apachetutor.org/admin/reverseproxies
    hsc.fr/ressources/breves/pourquoi-relais-inverse.html
    httpd.apache.org/docs/1.3/mod/mod_proxy.html

    par Cédric TESSIER le 13/04/2007