Load Balancer HaProxy sur Debian 9 et SSL Let’s Encrypt

 

Un petit article technique pour cette rentrée et ce début de semaine, nous allons voir comment mettre en place un Load Balancer avec HaProxy, sur une Debian 10 en utilisant des certificats SSL Let's Encrypt.

Cet article permet aussi de faire une grosse mise à jour de la configuration d'HaProxy par rapport à cet ancien article.

Un load balancer ou répartiteur de charge, est un élément technique dans une infrastructure qui permet de répartir la charge de travail entre plusieurs machines. Il est assez classique de trouver des répartiteurs de charge pour le protocole HTTP pour la partie Web, mais il existe aussi des répartiteurs de charge de plus bas niveau dans le modèle OSI, niveau 4 pour la répartition de charge TCP et/ou UDP.

Répartiteur de charge sur Wikipedia

Architecture

L'architecture de maquette est simple, un load balancer HaProxy en frontal installé sous Debian 10 et deux serveurs Web "classiques" Debian 10 + Apache + PHP 7.3 en FPM.

Installation

Pour le moment je fais le choix de prendre la version packagée d'HaProxy sous Debian 10, je verrais plus tard pour des tests avec la nouvelle version 2, donc l'installation est simple

Installation de base

On commence par mettre en place l'infrastructure et paramétrer haproxy sans le SSL. Ce qui nous permet déjà de tester la configuration.

Le fichier de configuration est /etc/haproxy/haproxy.cfg

 

Les parties default et global définissent les configurations par défaut qui vont s'appliquer à l'ensemble de la conf.

La partie fronted stats, défini la configuration pour la partie affichage des stats d'haproxy. Sécurisation par mot de passe, et une bonne idée serait de limiter les accès à cette interface sur un réseau privé.

fronted web, défini les paramètres pour le frontend et défini le bloc de configuration pour le backend.

Enfin la partie bakend permet de définir les serveurs vers lesquels envoyer les charger et dans quelles conditions, ici simplement en roundrobin avec le même poids pour chaque serveur.

Let's Encrypt et HaProxy

Il est temps de rajouter la partie https. Pour cela nous allons mettre en place Let's Encrypt sur le serveur HaProxy et faire la configuration adéquate.

Mise en place de Let's Encrypt

A partir de la Debian 9, les paquets existent dans la distribution, autant en profiter.

Dans la partie frontend web, on va rajouter une requête qui va intercepter les paramètres pour les demandes Let's Encrypt et les renvoyer vers un backend spécifique.

 

Une fois cette configuration activée nous allons pouvoir créer les certificats ssl, de la façon suivante (nb ne pas oublier l'enregistrement DNS avant) :

 

Le certificat est généré pour Let's Encrypt par contre il va falloir faire un peu de concaténation pour HaProxy :

 

 

Configuration HaProxy

On va maintenant configurer HaProxy pour gérer complètement le https et renvoyer correctement les en-têtes aux backends. Voici la conf complète, je détail ensuite.

 

Dans la partie "global", définition des paramètres de base pour le SSL, dont par exemple la désactivation du sslv3.