Florent Peterschmitt

Apache mod_proxy

mod_proxy pour les nuls

J'utilise le module mod_proxy d'Apache pour « proxyfier » une application web standalone et qui écoute sur un port donné par défaut et ne dispose pas du ssl.

Comme je souhaite que l'application ne soit pas directement accessible ainsi qu'un accès ssl, je passe donc par un proxy Apache :

ProxyRequests On
ProxyPreserveHost Off
ProxyPass /truc http://127.0.0.1:1234
ProxyPassReverse /truc http://127.0.0.1:1234

Oui mais

Oui mais voilà, si on ne prend pas garde à ce qu'on fait (comme moi) on se retrouve très vite avec des logs du genre :

216.244.93.124 - - [09/Mar/2013:00:24:34 +0100] "GET http://ib.adnxs.com/tt?id=1074619&size=300x250 HTTP/1.0" 200 251 "http://freddyo.com/photos-rihanna-vacations-in-itty-bitty-tiny-bikini/photos/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Alexa Toolbar)"

Que se passe-t-il ici ?

Eh bien on essaye tout simplement de se connecter à un autre site en se faisant passer pour le serveur ayant reçu la requête, c'est à dire nous-même. Outre le fait que Rihanna en bikini, je m'en tamponne l'oreille avec une babouche, c'est parfaitement dangereux pour vous et très mauvais pour Internet.

Comment savoir ?

Comment pouvez-vous savoir si votre serveur est un « open relay » ?

$ telnet monserveur.fr 80
$ GET http://www.google.fr/ HTTP/1.1
$ Host: www.google.fr

Si la totalité du site vous revient, c'est que vous avez un joli serveur docile à toutes les demandes. Dans le cas contraire, je ne vois pas pourquoi vous lisez cet article ;-)

Solution

Elle est toute simple. Il suffit de ne pas autoriser tout le monde à utiliser votre proxy :

<Proxy *>
    Order deny,allow
    Deny from all
</Proxy>

On peut bien entendu affiner avec une authentification ou une liste d'IP, un sous-réseau…

<Proxy http://127.0.0.1:1234>
    Order deny,allow
    Require ip 1.2.3.4
</Proxy>

Dans ces deux cas, un client non autorisé aura une réponse 403

Mieux encore, si vous n'utilisez mod_proxy qu'en interne, c'est à dire que seul le serveur fera des requêtes et pas les clients, légitimes ou pas :

ProxyRequests Off

Et là c'est un 404 qui sera répondu.

À bon entendeur, salut !

Source : doc apache