Le serveur reverse-proxy : Eléments principaux

Le fonctionnement sécurisé des serveurs Web représente un problème et un challenge pour les administrateurs réseaux. En effet les services en ligne comme l’utilisation d’Internet ou les Emails doivent passer par le réseau public. Cependant une simple connexion directe à Internet peut rendre les systèmes vulnérables aux logiciels malveillants. C’est pourquoi on utilise généralement pour se prémunir de ce risque, un composant réseau : le reverse-proxy ou proxy inverse en français.

Qu’est-ce qu’un reverse-proxy ?

Pour résumer, un serveur proxy est un intermédiaire de communication sur le réseau qui reçoit les requêtes pour les transmettre ensuite à l’ordinateur cible. Dans les réseaux des entreprises, ce système est particulièrement utilisé pour fournir un accès à Internet plus sécurisé et davantage contrôlable pour les utilisateurs. Un serveur configuré comme proxy représente dans ce cas l’unique connexion au réseau public. Il est parfois aussi nommé en anglais Forward-proxy.

Un serveur proxy canalise donc toutes les requêtes du réseau interne puis va les transmettre à l’adresse de l’expéditeur sur le serveur cible sur Internet. Les réponses du serveur sont envoyées au proxy avant d’être distribuées aux différents appareils client. De plus, cela reste anonyme, sauf si le proxy en utilisation est un proxy transparent. Pour économiser la bande passante et accélérer la récupération de la page Web, les serveurs proxy sont généralement programmés pour qu’ils puissent mettre en cache (garder en mémoire) des contenus fréquemment demandés sans avoir besoin d’une nouvelle requête pour les afficher.

Tandis qu’un Forward-proxy protège les appareils clients des mauvaises influences du réseau public, un reverse-proxy lui opère exactement dans le sens inverse, d’où son nom. Ce système sert ainsi de sécurité supplémentaire et protège les serveurs Web. Les requêtes sont reçues par le proxy qui vérifie si elles sont conformes aux règles de sécurité de configuration. En cas de doute, ces dernières sont transmises au serveur en arrière-plan.

L‘interface de communication du réseau d’un reverse-proxy peut effectuer diverses fonctions qui permettent ainsi d’améliorer la sécurité du serveur d’arrière-plan et d’optimiser le trafic des données.

Application et fonctionnement d’un reverse-proxy

Les serveurs reverse-proxy sont en général protégés par un pare-feu dans un réseau interne ou une zone démilitarisée (DMZ). Le proxy inverse, similaire au proxy-forward, est la seule connexion entre Internet et le réseau privé. Toutes les requêtes du serveur d’arrière-plan au réseau local passent par la même interface de communication avant d’être transférées aux systèmes ciblés. Cette mise en commun permet ainsi de contrôler les données du trafic entrant et autorise divers serveurs sous le même URL pour distribuer les requêtes de manière uniforme sur différents serveurs et ainsi d’accélérer la récupération des données par l’utilisation de la mémoire cache ou caching. Ci-dessous les différentes applications d’un serveur reverse-proxy :

  • Anonymisation : Etant le seul accès au réseau interne, le reverse-proxy intercepte ainsi toutes les requêtes vers le serveur d’arrière-plan et agit de telle sorte que les programmes clients pensent qu’ils sont directement en lien avec le système ciblé actuel. Pour cela, le proxy transfère les requêtes aux systèmes ciblés correspondants dans le réseau local, acceptant leurs réponses puis les transférant aux clients. Le serveur d’arrière-plan reste donc anonyme.
  • Encodage et protection : En amont, un reverse-proxy offre la possibilité d’installer des systèmes de contrôle comme les scanners de virus ou les filtres de paquets, ce qui renforce la protection des serveurs qui sont en arrière-plan. Le serveur proxy représente ainsi un autre lien de la chaine sécuritaire entre Internet et le réseau local. Un serveur reverse-proxy peut aussi être utilisé pour l’encodage. L’externalisation des certificats SSL du proxy allège les serveurs Web en arrière-plan.
  • Répartition de charge : Grâce à l’utilisation en amont d‘un proxy inverse, il est possible de lier une URL de différents serveurs sur le réseau privé. Ceci permet de distribuer les requêtes entrantes à de multiples serveurs. La répartition de charge, de l’anglais load-balancing empêche la surcharge d’un système et fonctionne en cas de défaillance d’un serveur. Si un serveur n’est pas accessible à cause d’une erreur de matériel ou d’un logiciel, le répartiteur de charge du proxy distribue alors les requêtes entrantes aux serveurs disponibles. Cela assure le bon fonctionnement en continu du service même lorsqu’un problème survient.
  • Caching : Afin d’accélérer la vitesse du service, le reverse-proxy apporte une fonction de cache, qui autorise à cacher des réponses du serveur. Cette mise en cache permet ainsi au serveur proxy de répondre aux requêtes répétitives, de manière partielle ou complète. Du contenu statique comme des images ou des pages Web fréquemment consultées par les utilisateurs du réseau local sont gardés en mémoire (en « cache ») par le proxy. Cela permet ainsi d’une part de réduire l’utilisation de la bande passante vers le Web et de réduire le temps d’accès aux documents pour les utilisateurs. Toutefois comme les contenus changent rapidement il est nécessaire que le proxy compare régulièrement les données qu’il stocke en mémoire cache avec les données distantes pour s’assurer que les données ne sont pas périmées.
  • Compression : équipé du logiciel approprié, un serveur reverse-proxy peut être aussi usité pour compresser des données entrantes et sortantes. Un programme renommé pour compresser les sites Web est Gzip, ce logiciel est souvent utilisé en combinaison avec Apache ou nginx.

Configurer Apache comme Reverse-Proxy

Le serveur Apache http peut être utilisé pour installer un reverse-proxy. En effet, le serveur Web le plus mondialement connu comporte des modules d’extensions pour la fonction de proxy et peut simplement être configuré avec quelques lignes de code. Le guide suivant décrit étape par étape comment développer une installation d’Apache sur le système d’exploitation Ubuntu en ajoutant un module nécessaire et créant un fichier de configuration pour le transfert.

Le serveur open source Apache HTTP est disponible gratuitement sur le site de l’Apache Software Foundation. Une introduction à ce logiciel se trouve sous notre guide.

1. Installation du module proxy d’Apache

Pour utiliser un serveur Apache HTTP comme reverse-proxy, vous avez besoin du module mod_proxy. Ceci améliore les fonctionnalités de base et cela peut encore être accentué par divers modules supplémentaires : 

  • mod_proxy_http contient toutes les fonctions proxy pour les requêtes HTTP et HTTPS. Ce module add-on supporte les versions de protocole HTTP/0.9, HTTP/1.0 et HTTP/1.1
  • mod_proxy_ftp est nécessaire pour avoir les fonctionnalités de proxy pour les requêtes FTP
  • mod_proxy_connect apporte les fonctionnalités proxy pour le tunneling SSL
  • mod_proxy_ajp implémente l’Apache-JServ-Protocol (AJP). Ceci est utilisé dans le cadre de la répartition de charge afin de transférer les requêtes vers les serveurs d’applications en arrière-plan
  • mod_cache, mod_disk_cache et mod_mem_cache implémentent la fonction de cache, ce qui permettra à certains contenus d’être stockés sur la mémoire cache du serveur Apache
  • mod_proxy_html active la réécriture de liens HTML
  • mod_headers permet la modification des données des en-têtes HTTP
  • mod_deflate met en place une fonction de compression

Afin d’installer le module mod_proxy avec tous les modules complémentaires, la ligne de commande suivante est requise :

 sudo apt-get install libapache2-mod-proxy-html

Ce tutorial est spécialisé sur les fonctions de base du module Apache mod_proxy. Vous pouvez trouver une description détaillée des modules add-on avec toutes les commandes nécessaires sur le site officiel comportant les documents du projet Apache.

2. Activation des modules requis.

Afin d’activer les modules individuels de la fonction proxy Apache, la commande a2enmod est utilisée. Les modules qui sont déjà activés peuvent être désactivés par la commande a2dismod. Pour créer un simple reverse-proxy pour un serveur Web en amont, il suffit simplement de charger les modules mod_proxy et mod_proxy_http.

sudo a2enmod proxy 
sudo a2enmod proxy_http

Après l’activation des modules, le serveur Apache HTTP doit être redémarré :

sudo apache2 reload

3. Création du fichier de configuration

Pour que le reverse-proxy accepte les requêtes d’Internet et les transmettent aux serveurs appropriés sur le réseau local, vous avez besoin de désactiver le fichier de configuration 000-default.conf dans le répertoire /etc/apache2/sites-enabled et de la remplacer par un fichier hôte virtuel comme example.conf. Il est conseillé de créer un fichier hôte virtuel séparé pour chaque serveur cible avec sa propre adresse IP :

<VirtualHost *:80>
 ServerName domain.tld
 ServerAlias www.domain.tld
 ProxyRequests Off
 ProxyPass / http://123.456.7.89/
 ProxyPassReverse / http://123.456.7.89/
</VirtualHost>

Les instructions pour la fonction proxy sont définies dans la commande <VirtualHost>. La balise Start contient également l’adresse IP et le numéro de port ou Apache, configuré comme un serveur reverse-proxy doit recevoir les requêtes. Si toutes les adresses IP sont incluses, le métacaractère * est utilisé comme le montre l’exemple. Les informations de la balise VirtualHost sont donc affichées sous la forme de commande. Contrairement À la balise VirtualHost, ces arguments définissent comment traiter les requêtes entrantes et les paquets de réponse. Les commandes ServerName, ProxyPass et ReversePass sont particulièrement importantes.

  • ServerName : la commande ServerName définit le nom premier d’un serveur sur internet. Il doit être réglable soit via DNS ou via /etc/hosts. Dans cet exemple, le serveur Apache est programmé pour accepter toutes les requêtes de domain.tld.
  • ProxyPass : la commande ProxyPass définit l’adresse cible pour une redirection. Toutes les requêtes qui sont destinées à une adresse publique sont transférer par le reverse-proxy à l’adresse interne spécifiée dans le ProxyPass. Dans l’exemple, cela serait l’adresse IP fictive 123.456.7.89.
  • ProxyPassReverse : un serveur proxy ne reçoit pas seulement des requêtes, il peut aussi transférer des paquets de réponse des serveurs d’arrière-plan aux clients. Pour éviter que ces réponses (à savoir ceux du serveur en arrière-plan) contiennent un en-tête d’information incorrect, la commande ProxyPassReverse réécrit l’en-tête des réponses du serveur pour qu’elles puissent être en accord avec le serveur proxy. Le serveur d’arrière-plan reste donc anonyme.

De plus, il existe aussi deux commandes supplémentaires : ServerAlias et ProxyRequests. Ces commandes ne représentent pas des fonctions de base pour le serveur proxy et sont donc plutôt facultatives.

  • ServerAlias : la commande ServerAlias autorise à définir un nom différent pour le serveur cible en complément du nom premier du serveur.
  • ProxyRequest : la commande ProxyRequests avec l’argument Off empêche le serveur Apache HTTTP d’être utilisé comme un proxy-forward afin d’éviter d’éventuels abus.

Si les règles de la fonction proxy sont bien définies, la configuration doit donc être active via le terminal :

sudo a2ensite beispiel.conf

Le serveur Apache HTTP accepte désormais toutes les requêtes de domain.tld ou de www.domain.tld et les transmettent au serveur d’arrière-plan avec l’IP 123.456.7.89