Haproxy : anti DDOS

HAPROXY est, entre autres choses, un load-balancer très souple qui peut apporter en outre un gain en sécurité par une gestion spécifique des connexions. Il "protège" les serveurs Web en limitant le nombre des connexions simultanées afin d'empêcher la saturation du serveur. De nombreux tests montrent que si Haproxy est bien réglé on peut garder un accès (pas exemple ssh) sur un serveur surchargé de demandes d'accès HTTP (qui a dit malicieuses ?), cela semble notamment efficace contre les attaques de style «Killer2 / Slowloris» voir les sites : Securityvibes et Phrack  à ce sujet. 
Tous les exemples fournis dans cet article sont fondés sur le protocole HTTP, mais Haproxy permet aussi de gérer d'autres protocoles, en fait pratiquement tous les protocoles TCP. 
Son empreinte mémoire et sa consommation CPU réduite ne chargent que peu les serveurs, c'est donc un investissement d'un très bon rapport qualité/coût.

  •     nombre de requêtes, d'octets «in», d'octets «out» par «frontend»
  •     nombre de requêtes, d'octets «in», d'octets «out» par «backend»

Le paramétrage relativement simple et compréhensible, est divisé en «blocs» délimités par des mots clefs:

  •     global
  •     defaults
  •     frontend nom_du_frontend
  •     backend nom_du_backend
  •     listen nom_du_listen

Section «global». 
Ici sont définis principalement les paramètres communs à tous les «frontend» et «backend». 
log, nombre total de connexions gérées : 
log 127.0.0.1 local0 
maxconn 512 
Lancement en «démon» (arrière plan) cette option est obligatoire pour que le processus se «détache» de la console, l'utilisateur et le groupe sous lequel le programme doit tourner, l'option «chroot» qui permet de mieux protéger le système en isolant le processus dans une cage : 
chroot nom_du_répertoire_cage 
user haproxy 
group haproxy 
daemon 
L'option "chroot" est fortement conseillée, le répertoire indiqué peut être «vide» puisque, une fois lancé le processus ne gère que des accès réseau. 
On peut par ailleurs utiliser les options «debug» ou «quiet» pour augmenter ou diminuer le niveau de log. 
Section «defaults». 
Ici sont définis divers paramètres permettant de limiter la durée des connexions afin de protéger le serveur et les services WEB. Sont définis aussi les protocoles suivis (pas uniquement du http). En utilisant «http» il est possible d'utiliser des outils d'analyse des requêtes, par exemple pour rediriger des domaines différents sur des serveurs (ou ports) différents et «éliminer» les demandes de sites non gérés. 
Voici un exemple des valeurs adoptées : 
timeout client 15s 
timeout server 15s 
timeout queue 15s 
timeout connect 8s 
timeout http-request 8s 
Ces valeurs, bien sûr, sont à adapter selon les services demandés et une option spécifique http: 
option forwardfor 
Section «frontend». 
C'est ici que l'on peut «repérer» les motifs qui nous intéressent dans les flux HTTP, par exemple le nom du site demandé pour effectuer les bonnes redirections. 
Choisir adresse/port : 
bind 0.0.0.0:80 
La distribution vers différents «backend» s'effectue avec l'aide de directives «ACL», exemple: 
acl PRA hdr_beg(host) siteA 
acl PRB hdr_beg(host) siteB 
il existe un très grand nombre de fonctions de détection, celle utilisée ici (hdr_beg) teste le début du nom de site. Il suffit ensuite de diriger la requête en fonction de l'acl vers le bon «backend» par une directive telle que celle ci dessous : 
use_backend BACKA if PRA 
use_backend BACKB if PRB 
et prévoir une sortie spécifique aux requêtes non sélectionnées : 
default_backend POUBEL 
dans lequel sont traitées les demandes «résiduelles». 
Il est parfaitement possible de créer plusieurs «Frontend» écoutant sur plusieurs couples adresse/port différents. Il est ainsi possible de différencier des accès à la même application par le couple adresse/port pour, par exemple, avoir des statistiques différenciées pour chaque partie de l'application en utilisant un couple adresse/port différent pour les accès «administratifs». Les statistiques du site ne seront ainsi pas «polluées» par des accès liés à l'administration et l'on pourra aussi avoir des statistiques sur les accès administratifs. On peut faire de même pour des accès intranet/extranet afin de disposer de statistiques plus précises. 
Section «backend». 
C'est ici qu'est fait le lien vers le service sélectionné, celui-ci peut alors être envoyé sur un ou des serveurs spécifiques avec une fonction de répartition de charge : 
option httpchk 
balance roundrobin 
cookie SERVERID rewrite 
server local 127.0.0.1:84 maxconn 127 
option httpclose 
option abortonclose 
retries 2 
La directive «server» peut être répétée pour décrire les différents serveurs entre lesquels doivent être réparties les requêtes exemple: 
server srv1 192.168.1.201:81 cookie srv1 weight 2 check 
server srv2 192.168.1.201:81 cookie srv2 weight 1 check 
Ce groupe de directives permet de répartir sur srv1 et srv2 en considérant que srv1 doit recevoir deux fois plus de requêtes que srv2.

Ce logiciel est facile à employer et bourré de fonctionnalités intéressantes. 
Un petit exemple des statistiques disponibles :