Apache 2 : SetEnvIf et variables d'environnement, e.g. n'autoriser que certaines IP ou UserAgent à se connecter
By Pierre-Alain B on Friday, December 18 2015, 06:53 - Permalink
Le serveur web Apache est extrêmement modulable quand il s'agit de filtrer des requêtes. Si tout le monde connaît les habituelles commandes Require all denied, Require all granted, Require Host example.org, nous allons voir ici comment utiliser une variable interne d'environnement et l'utiliser comme contrôle d'accès à un hôte virtuel.
Imaginons par exemple le cas suivant : nous souhaitons n'autoriser que certaines IP à se connecter, sauf pour les navigateurs dotés d'un User-Agent très spécifique.
Avant toute chose, il est nécessaire d'activer le module SetEnvIf (https://httpd.apache.org/docs/2.4/mod/mod_setenvif.html) qui permet de paramétrer une variable d'environnement d'Apache. Sous Debian (ou dérivé), cela se fera par :
a2enmod setenvif
Commençons par placer une condition sur l'IP :
SetEnvIf Remote_Addr 1.2.3.4 variable
ou alors si le serveur se trouve derrière un proxy qui fournit l'adresse d'origine dans le champ X-Forwarded-For :
SetEnvIf X-Forwarded-For 1.2.3.4 variable
La valeur fixe 1.2.3.4 peut-être remplacée par toute expression régulière de son choix.
Puis filtrons sur le User-Agent :
SetEnvIf User-Agent ^MaValeurPerso variable
Et finalement, expliquons à Apache qu'il faut interdire l'accès si aucune des conditions n'a été atteinte :
Require env variable
Dès lors, une fois la configuration rechargée, Apache n'autorisera l'accès qu'aux requêtes provenant de 1.2.3.4 ou émises par un navigateur au User-Agent correspondant à l'expression régulière ^MaValeurPerso. Ces éléments de configuration offrent beaucoup de richesse !