(modifié le 28 novembre 2017 à 10:05)

Vous utilisez peut-être le module proxy d'Apache (mod_proxy) comme reverse proxy. Il permet de rendre accessible des pages web situées sur des machines sans les exposer directement.

Voyons comment transposer les directives Apache 2.2 vers 2.4 au travers d'exemples pratiques.

Pourquoi migrer ?

Suite au passage de la version d'Apache 2.2 vers 2.4 les directives ont changé. Certes elles sont rétrocompatibles, mais autant passer sur la nouvelle syntaxe, radicalement différente.

Apache 2.4 est nativement proposé dans les dépôts de Debian 8.x, ainsi que dans de nombreuses distributions. La branche Apache 2.2 continue d'être maintenue jusqu'en Juin 2017 et les patchs de sécurité jusqu'en décembre 2017. En clair, il est temps de passer sur Apache 2.4, sorti en 2012 (2.2 sortait en 2005!).

Pour la migration sous Debian un "simple" apt-get dist-upgrade vous fera passer de 2.2 à 2.4. Avant pensez aux backup (snapshot) et travaillez plutôt sur un clone que sur la prod', n'est-ce pas...

Ce qui change

Avant de vous lancer prenez connaissance de ce document résumant les évolutions et changements.

Avec Apache 2.4 de nouveaux mécanismes de contrôle d'accès impactent l'ordre dans lequel les directives d'autorisations sont appliquées. Le module mod_access_compat assure la rétrocompatibilité avec les anciennes configurations, mais Apache déconseille vivement de mélanger d'anciennes directives et de nouvelles. Ce module est là pour assurer la transition et évitez la prise de tête en cas de mise à jour de Apache 2.2 vers 2.4 pour assurer la continuité de service.

Exemple de configuration Apache 2.2

Pour faciliter la compréhension je vous donne un exemple de configuration que j'ai utilisé avec Apache 2.2. Ce fichier est stocké sur une distribution Debian dans /etc/apache2/mods-available/proxy.conf

ProxyPass               /usvn/          http://srvapp.masociete.lan/usvn/
ProxyPassReverse        /usvn/          http://srvapp.masociete.lan/usvn/

<Proxy http://srvapp.masociete.lan/usvn/>
    ErrorDocument 403 "Ce serveur n'est pas accessible en interne, plus d'infos: it@masociete.fr"
    Order allow,deny
    Allow from all
    deny from  172.16.0.0/12 192.168.0.0/16 10.0.0.0/8
</Proxy>

Cet exemple autorise toutes les connexions sauf les plages internes définies dans la RFC1918. Ceci pour éviter du trafic interzone DMZ inutile. En effet si les machines sont situées sur le même réseau que la machine cible il est inutile de faire transiter ces flux via le pare-feu.

Exemple de configuration Apache 2.4

Voici l'équivalent pour Apache 2.4 :

ProxyPass /usvn/ http://srvapp.masociete.lan/usvn/
ProxyPassReverse /usvn/ http://srvapp.masociete.lan/usvn/

<Proxy http://srvapp.masociete.lan/usvn/>
          <RequireAll>
                Require all granted
                Require not ip 172.16.0.0/12 192.168.0.0/16 10.0.0.0/8
          </RequireAll>
          ErrorDocument 403 "Ce serveur n'est pas accessible en interne, plus d'infos: it@masociete.fr"
</Proxy>

Si j'ai besoin d'autoriser une machine dans la plage à accéder à la proxification c'est assez simple :

ProxyPass /usvn/ http://srvapp.masociete.lan/usvn/
ProxyPassReverse /usvn/ http://srvapp.masociete.lan/usvn/

<Proxy http://srvapp.masociete.lan/usvn/>
          <RequireAll>
                Require all granted
                Require not ip 172.16.0.0/12 192.168.0.0/16 10.0.0.0/8
                  <RequireNone>
                        Require ip 172.16.1.123
                  </RequireNone>
          </RequireAll>
          ErrorDocument 403 "Ce serveur n'est pas accessible en interne, plus d'infos: it@masociete.fr"
</Proxy>

Les directives sont bien plus explicites dans les "allow, deny" et l'ordre interprétation que j'ai toujours trouvé imbuvable.

Ah oui vous pouvez aussi afficher le contenu d'une page pour l'erreur 403 plutôt qu'un message :

ErrorDocument 403 /erreur_403.html

Ceci fonctionne en 2.2 et 2.4. Vous devrez stocker la page à la racine de votre répertoire www (/var/www/html par défaut).

Quelques correspondances

D'une manière générale :

Order allow,deny
Allow from all

Devient :

Require all granted

Et :

Order allow,deny
Deny from all

Devient :

Require all denied

Astuce : 2 alias

Petit bonus pour Debian, j'utilise deux alias pour éditer rapidement le contenu du proxy.conf, à placer dans ~/.bashrc :

alias proxyedit='nano /etc/apache2/mods-available/proxy.conf'
alias proxyrestart='systemctl restart apache2.service && echo -e "\n\t... restart OK :)\n" || systemctl status apache2.service'

Et n'oubliez pas de tester votre configuration avant de un fâcheux restart :

apachectl configtest

A vos MàJ, partez !

Doc Apache : authentification et autorisation, authentification et autorisation

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter