lundi 3 septembre 2012

Le Reverse Proxy: Tuto

Installation et configuration d'un Reverse Proxy


Dans ce tutoriel nous allons configurer un Reverse Proxy Apache sur une Debian. Le serveur Debian est installé de base sans interface graphique et avec comme seul paquet installé openssh-server.



Mise en bouche

Avant de commencer ce Tutoriel je voudrai te rappeler le rôle d'un reverse proxy. Il en a en faite 2:

  • Il permet d’accéder à plusieurs services web depuis une seul adresse IP
  • Il permet également de faire du cache et ainsi alléger la charge de ton réseau interne.

Je ne vais pas parler de ce second fonctionnement dans cet article mais plutôt te renvoyer vers l'article de Korben parlant des reverses proxy. Et si tu souhaites que j'en rédige également un, dis le moi dans les commentaires.

Introduction

Ce serveur est à installer sur la DMZ si il en existe une (et il doit en exister une!!). Une DMZ est un réseau séparé du réseau où sont branché tous les PCs et serveurs ne nécessitant pas un accès depuis internet ou depuis un réseau non sécurisé. La DMZ est isolé de tous les autres réseaux par un pare-feu correctement configuré et n'autorisant que les connexions spécifié.

Mise en situation

Ce serveur est donc connecté sur la même DMZ que les serveurs qui doivent être accessible depuis Internet. Le pare-feu est configuré pour rediriger toutes les requêtes HTTP et HTTPS vers ce serveur. C'est donc lui qui assurera la redirection vers les bons serveurs en fonctions du service demandé.

Dans l'exemple la DMZ est le réseau 10.2.2.0/24. Le serveur hébergeant le reverse proxy a l'IP 10.2.2.250 et les serveur web A et B respectivement 10.2.2.2, 10.2.2.3. Le pare-feu a l'IP 10.2.2.1.

Le serveur A contient le site Intranet (Intranet) accessible à l'adresse "http://www.monintranet.org", B un wiki "http://mondomaine.fr/mediawiki" et un gestionnaire d'incident (Jira) "http://mondomaine.fr/jira". Il y a donc 2 services utilisant le même nom de domaine. Afin d’accéder à Jira et au Mediawiki si on ne connais pas l'adresse exact, une page web avec les 2 liens est accessible à l'adresse "http://mondomaine.fr/".

Avant tout il faut bien sur avoir un ou plusieurs nom de domaines qui sont correctement attribué à ton IP Publique. Et des sites web fonctionnels.

Schéma de la maquette


Début du tutoriel

Penses bien a recharger la configuration de Apache avant chaque test ("/etc/init.d/apache2 reload")

Installation des pré-requis

apt-get update && apt-get install apache2

Configuration Reverse Proxy en HTTP

Activation du module proxy de apache
a2enmod proxya2enmod proxy_http
La suite consiste à créer un fichier "sites-available" pour chaque nom de domaine que le proxy inversé doit rediriger. Ces fichiers sont à créer dans le répertoire "/etc/apache2/sites-available/" et doivent contenir:
<VirtualHost 192.168.XX.XX:80> #adresse ip locale du serveur reverse proxy
ProxyRequests Off
ProxyPreservehost on
ServerName site1.org
ServerAlias www.site1.org
ProxyPass / http://192.168.XX.XX/ #adresse ip locale du serveur web
ProxyPassReverse / http://192.168.XX.XX/ #adresse ip locale du serveur web
# ProxyPassReverseCookieDomain 192.168.XX.XX site1.org
## LogLevel debug
</VirtualHost>
Dans le cas exemple les fichiers seront donc:
/etc/apache2/sites-available/Intranet
<VirtualHost 10.2.2.250:80>
ProxyRequests Off
ProxyPreservehost on
ServerName monintranet.org
ProxyPass / http://10.2.2.2
ProxyPassReverse / http://10.2.2.2
# ProxyPassReverseCookieDomain 10.2.2.2 monintranet.org
## LogLevel debug
</VirtualHost>

/etc/apache2/sites-available/mondomaine
<VirtualHost 10.2.2.250:80>
        ProxyRequests Off
        ProxyPreservehost on
        ServerName mondomaine.fr/
        ProxyPass /mediawiki http://10.2.2.3
        ProxyPass /jira http://10.2.2.3
        #Il est important de mettre la page d'index comme la dernière option ProxyPass        ProxyPass / http://10.2.2.3
        ProxyPassReverse / http://10.2.2.3
        # ProxyPassReverseCookieDomain 10.2.2.3 mondomaine.fr/
        ## LogLevel debug
</VirtualHost>
Une fois tous les fichiers sites-available créé il faut activer ces sites:
a2ensite Intranet
a2ensite mondomaine
Puis recharger la configuration de Apache:
/etc/init.d/apache2 reload

Test

Il est maintenant possible de tester le fonctionnement du Reverse Proxy tout en laissant actif l'ancien fonctionnement. Simplement en ajoutant les lignes suivantes dans le fichier hosts du PC depuis lequel le test va être effectué ("/etc/hosts" pour Linux ou "C:\windows\system32\drivers\etc\hosts" pour Windows):
10.2.2.250 mondomaine.fr
10.2.2.250 monintranet.org
En remplaçant bien sur mes valeur par les tiennes.

Tu peux maintenant ouvrir un navigateur et aller aux adresses: http://monintranet.org, http://mondomaine.fr/mediawiki, http://mondomaine.fr/jira et constater que cela fonctionne (ou non).

Pour conclure il faut avoir 1 fichier de configuration par nom de domaine et une ligne ProxyPass par dossier dans ce domaine.

Et le HTTPS??!!!

Et oui cela fonctionne en http seulement, j'imagine que tes services sont uniquement accessible en HTTPS (sinon tu ferais bien de suivre mon blog car un article sur la sécurité sera traité). Si tu ne sais pas ce qu'est le HTTPS il va vraiment falloir te renseigner car c'est indispensable si tu compte héberger tes propres serveurs.

Le plus simple et couramment utilisé pour avoir un Reverse Proxy en HTTPS est de chiffrer la connexion entre le poste client et le Reverse Proxy. La connexion entre le RP (Reverse Proxy tu l'auras compris) et le serveur web étant alors en HTTP sans SSL.

Pour faire cela il faut créer un certificat par nom de domaine sur le RP et correctement configurer le Apache2 du RP.

Activation du module SSL sur le RP:
a2enmod  ssl
Génération du certificat pour monintranet.org.
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/apache2/server_intranet.crt -keyout /etc/apache2/server_intranet.key
Réponds alors aux questions posées :

Country Name (2 letter code) [GB]:
Entres FR si tu es situé en France et valides par la touche « Entrée »

State or Province Name (full name) [Some-State]:
Entres FRANCE et valides par la touche « Entrée »

Locality Name (eg, city) []:
Indiques ici le nom de ta ville. (exemple : TOULOUSE) et validez par la touche « Entrée »

Organization Name (eg, company; recommended) []:
Indiques le nom de ton organisation, de ta société. Et valides par la touche « Entrée ». Si tu n'as pas de société, tu peux mettre un nom fictif, le nom de ton site Web par exemple.

Organizational Unit Name (eg, section) []:
Indiques ici le nom de la section de ton organisation, de ta société. Si tu n'en as pas, mets la même chose que pour la question précédente.

Common Name (eg, YOUR name) []:
Ici, il convient de faire particulièrement attention à ce que tu vas entrer. tu dois indiquer le nom de domaine que tu désires sécuriser. En ce qui nous concerne, il s'agit du domaine : mondomaine.fr et monintranet.org, j'aurais donc 2 certificats.Valides avec "Entrée ».

Email Address []:
Ici, il s'agit d'indiquer l'adresse E-mail de l'administrateur. Et une fois de plus tu peux valider avec la touche « Entrée ».

Ensuite relance la commande suivante afin de créer le second certificat en répondant aux mêmes questions:

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/apache2/server_intranet.crt -keyout /etc/apache2/server_mondomaine.key


Enfin, on empêche les curieux de lire notre clé privée :

sudo chmod 440 /etc/apache2/server_intranet.key
sudo chmod 440 /etc/apache2/server_mondomaine.key 

Ensuite il faut configurer apache, toujours sur le RP en ajoutant cette section à "/etc/apache2/sites-available/Intranet"

<VirtualHost 10.2.2.250:443>
        SSLEngine On
        SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
        SSLCertificateFile /etc/apache2/server_intranet.crt
        SSLCertificateKeyFile /etc/apache2/server_intranet.key
        ProxyRequests Off
        ProxyPreservehost on
        ServerName monintranet.org
        ProxyPass / http://10.2.2.2/
        ProxyPassReverse / http://10.2.2.2/
        # ProxyPassReverseCookieDomain 10.2.2.2 monintranet.org
        ## LogLevel debug
</VirtualHost>

Et la suivante à "/etc/apache2/sites-available/mondomaine"


<VirtualHost 10.2.2.250:443>        SSLEngine On        SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire        SSLCertificateFile /etc/apache2/server_mondomaine.crt        SSLCertificateKeyFile /etc/apache2/server_mondomaine.key        ProxyRequests Off        ProxyPreservehost on        ServerName mondomaine.fr        ProxyPass /mediawiki http://10.2.2.3        ProxyPass /jira http://10.2.2.3        ProxyPass / http://10.2.2.3/        ProxyPassReverse / http://10.2.2.3/        # ProxyPassReverseCookieDomain 10.2.2.3 mondomaine.fr        ## LogLevel debug</VirtualHost>

De cette manière les 3 sites seront accessibles en HTTP et en HTTPS.

HTTPS exclusif

Afin de rediriger les personnes vers une connexion en HTTPS lorsqu'ils essayent d'y accéder en HTTP il faut remplacer dans les sections  "virtualhost 10.2.2.250:80" par:

Pour "/etc/apache2/sites-available/Intranet":

<VirtualHost 10.2.2.250:80>
        Redirect permanent / https://monintranet.org/
</VirtualHost>


Et pour "/etc/apache2/sites-available/mondomaine":

<VirtualHost 10.2.2.250:80>
        Redirect permanent / https://mondomaine.fr/
</VirtualHost>

Pour finir

Une fois tous les test effectué et que tu es sure que toutes tes redirections et tout tes sites fonctionnent il ne te reste plus qu'à mettre ton proxy inversé en ligne.
Il faut donc rediriger les port 80 et 443 de ton pare-feu sur le proxy et non plus sur ton serveur web. Une fois fait, une nouvelle fournée de tests et te voilà opérationnel.

Conclusion

Le Reverse Proxy te permet donc d'avoir plusieurs services web sur des serveurs différents. Il existe une autre façon pour se faire: La redirection de port. C'est a dire que au lieu d'interroger le second site sur le port 80 tu choisis un autre port. Et quand tu te connectes à cet autre port tu es redirigé par ton Firewall sur le bon serveur. Cette technique s'appelle Port Forwarding (ou "redirection de port" en français).
Cette solution a un énorme inconvénient: Depuis certains lieux sécurisé la connexion sur des ports différents est impossible. Tes sites ne seront donc pas accessibles. L'autre inconvénient est l'image renvoyé. En effet si tes sites sont publiques ou professionnel l'utilisation de ports différents renvoi une mauvaise image et peut même limiter l'accès à tes sites (par exemple le visiteur oublie le numéro de port).
Il est tellement simple de mettre en place un reverse proxy qu'il serai dommage de s'en privée. Je n'ai pas abordé le second avantage du reverse proxy (le cache) mais à lui seul il vaut le coup de rajouter un serveur. Alors si en plus ça facilite l'accès à tes services réseau, tu aurais tord de t'en passer.

Voilà pour les Reverse Proxy. N'hésite pas à demander dans les commentaire si tu veux un article sur le second rôle du proxy inversé qui est la mise en cache. Tu peux aussi partager cet article si il te semble utile à certains de tes contacts.

Aucun commentaire: