Utiliser mod_rewrite pour le contrôle d'accès - Serveur Apache HTTP Version 2.4

Apache Server 2.4

Serveur Apache HTTP Version 2.4

<-

Utiliser mod_rewrite pour le contrôle d'accès

Ce document est un complément à la documentation de référence de mod_rewrite. Il explique comment utiliser mod_rewrite pour contrôler l'accès à diverses ressources, ainsi que d'autres techniques en rapport. Il contient de nombreux exemples d'utilisation courante de mod_rewrite avec une description détaillée de leur fonctionnement.

Vous devez vous attacher à comprendre le fonctionnement des exemples, car la plupart d'entre eux ne fonctionneront pas sur votre système si vous vous contentez de les copier/coller dans vos fichiers de configuration.
top

Blocage du référencement à chaud (Hotlinking) d'images

Description :

Cette technique vous permet d'interdire à d'autres sites d'inclure directement vos images dans leurs pages. On fait souvent référence à cette pratique sous le nom de référencement à chaud (Hotlinking) qui entraîne l'utilisation de votre bande passante pour servir des contenus faisant partie du site de quelqu'un d'autre.

Solution :

Cette technique repose sur la valeur de la variable optionnelle HTTP_REFERER. Certaines personnes pourront donc contourner cette limitation. Pour la plupart des utilisateurs cependant, la requête échouera, en ce sens que l'image ne sera pas affichée depuis le site tiers.

Il y a plusieurs manières de gérer cette situation.

Dans le premier exemple, nous rejetons tout simplement la requête si elle ne provenait pas d'une page appartenant à notre site. Pour les besoins de cet exemple, nous supposons que le nom de votre site est www.example.com.

RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$"    "-"   [F,NC]

Dans le second exemple, plutôt que de rejeter la requête, nous affichons une autre image à la place.

RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$"    "/images/go-away.png"   [R,NC]

Dans le troisième exemple, nous redirigeons la requête vers une image appartenant à un autre site.

RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$" "http://other.example.com/image.gif"   [R,NC]

De tous ces exemples, les deux derniers semblent les plus efficaces pour faire en sorte que les gens arrêtent de référencer vos images à chaud, car il ne verront pas les images qu'ils s'attendent à voir.

Discussion :

Si vous ne voulez pas rediriger la requête, mais simplement interdire l'accès à la ressource, vous pouvez y parvenir sans utiliser mod_rewrite :

SetEnvIf Referer "example\.com" localreferer
<FilesMatch "\.(jpg|png|gif)$">
    Require env localreferer
</FilesMatch>
top

Blocage des robots

Description :

Dans cet exemple, nous allons discuter d'une méthode permettant de bloquer les requêtes persistentes en provenance d'un robot particulier, ou d'un navigateur.

La méthode classique pour exclure un robot consiste à définir un fichier, /robots.txt qui spécifie les parties de votre site web pour lesquelles vous voulez exclure les robots. Malheureusement, certains robots ne tiennent pas compte de ces fichiers.

Notez qu'il existe des méthodes d'exclusion qui n'utilisent pas mod_rewrite. Notez aussi que toute technique qui repose sur le contenu de la chaîne client USER_AGENT peut être contournée très facilement car cette chaîne peut être modifiée.

Solution :

On utilise un jeu de règles qui spécifie le répertoire à protéger, ainsi que la chaîne client USER_AGENT qui identifie le robot malin ou envahissant.

Dans cet exemple, nous bloquons un robot nommé Vilain_Robot pour le répertoire /secret/fichiers. Si vous voulez bloquer ce client seulement depuis une source particulière, vous pouvez aussi spécifier un intervalle d'adresses IP.

RewriteCond "%{HTTP_USER_AGENT}"   "^NameOfBadRobot"
RewriteCond "%{REMOTE_ADDR}"       "=123\.45\.67\.[8-9]"
RewriteRule "^/secret/files/"   "-"   [F]
Discussion :

Vous pouvez cependant parvenir au même résultat sans utiliser mod_rewrite via la méthode alternative suivante :

SetEnvIfNoCase User-Agent "^NameOfBadRobot" goaway
<Location "/secret/files">
    <RequireAll>
        Require all granted
        Require not env goaway
    </RequireAll>
</Location>

Comme indiqué plus haut, il est aisé de contourner cette technique, simplement en modifiant le contenu de l'en-tête USER_AGENT. Si vous subissez une attaque en règle, vous allez devoir réfléchir à un blocage à un niveau supérieur, par exemple une règle de filtrage de votre pare-feu.

top

Rejet des clients contenus dans une liste noire

Description :

Nous voulons interdire l'accès à notre serveur aux clients contenus dans une liste noire similaire à hosts.deny.

Solution :
RewriteEngine on
RewriteMap    hosts-deny  "txt:/path/to/hosts.deny"
RewriteCond   "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" "!=NOT-FOUND" [OR]
RewriteCond   "${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}" "!=NOT-FOUND"
RewriteRule   "^"  "-"  [F]

##
## hosts.deny
##
## ATTENTION! Ceci est une table de correspondances, non une liste,
## même si elle est traitée comme telle. mod_rewrite
## l'interprète comme une liste de paires clé/valeur, et
## chaque entrée doit au moins posséder une valeur par
## défaut "-".

193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -

Discussion :

La seconde condition RewriteCond présuppose que HostNameLookups est défini à On, de façon à ce que les adresses IP des clients puissent être résolues. Dans le cas contraire, vous devez supprimer la seconde condition, ainsi que le drapeau [OR] de la première.

top

Aiguillage basé sur l'en-tête Referer

Description :

Redirige les requêtes en fonction du Referer de provenance de la requête, avec des cibles différentes pour chaque Referer.

Solution :

Le jeu de règles suivant utilise un fichier de correspondances pour associer chaque Referer à une cible de redirection.

RewriteMap  deflector "txt:/path/to/deflector.map"

RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "${deflector:%{HTTP_REFERER}}" "=-"
RewriteRule "^" "%{HTTP_REFERER}" [R,L]

RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "${deflector:%{HTTP_REFERER}|NOT-FOUND}" "!=NOT-FOUND"
RewriteRule "^" "${deflector:%{HTTP_REFERER}}" [R,L]

Le fichier de correspondances contient les cibles de redirection associées à chaque Referer, ou, si nous voulons simplement rediriger les requêtes vers leur Referer, un "-" est inscrit dans le fichier de correspondances :

##
##  deflector.map
##

http://badguys.example.com/bad/index.html    -
http://badguys.example.com/bad/index2.html   -
http://badguys.example.com/bad/index3.html   http://somewhere.example.com/