CrowdSec devant HAProxy : le pare-feu applicatif qui apprend

Un load balancer bien configuré recoit le traffic et le redistribue sur les backend. Il ne fait cependant pas le tri entre un vrai visiteur et un robot qui scanne vos URLs à la recherche d'une faille.

Le problème ou le contexte

Dès qu'un frontal web est exposé sur Internet, il est attaqué en continu, dès la première heure. Scans de ports, bruteforce sur les formulaires de connexion, injections SQL, cross-site scripting, exploitation de CVE fraîchement publiées, le plus souvent par des bots automatisés.

HAProxy fait très bien son travail de répartiteur : il route, il équilibre, il fait la terminaison SSL, mais il n'a aucune idée de ce qui est légitime ou malveillant dans une requête. On peut écrire quelques ACL de filtrage à la main, mais personne ne va maintenir des listes d'IP malveillantes ni une règle pour chaque nouvelle technique d'attaque. Il manque une couche protège.

Ce qui change vraiment

C'est le rôle de CrowdSec : un moteur de détection comportemental, open source, qui analyse le trafic, repère les comportements malveillants et applique une remédiation (blocage, page d'attente, captcha). Sa particularité : il est communautaire.
Quand une IP se fait bannir pour comportement agressif chez des milliers d'utilisateurs, elle alimente une liste de réputation partagée.

Devant HAProxy, tout passe par le protocole SPOE (Stream Processing Offload Engine) : HAProxy sous-traite l'analyse de chaque requête à CrowdSec. Pour chaque connexion, il transmet l'IP source, la méthode, le chemin, les en-têtes et le corps de la requête, et CrowdSec répond en quasi temps réel : laisser passer, ou bloquer. Le tout avec des délais serrés pour ne pas pénaliser les visiteurs légitimes.

Et surtout, c'est le point fort : le bouncer SPOA de HAProxy est le seul à embarquer l'AppSec, c'est-à-dire un véritable WAF (Web Application Firewall).
CrowdSec ne se contente donc pas de bannir des IP, il inspecte le contenu applicatif pour bloquer les injections et faiti du virtual patching : neutraliser l'exploitation d'une faille connue avant même que vous ayez patché l'application. On peut y ajouter le Core Rule Set de l'OWASP, le jeu de règles de référence du secteur.

Voici, le trajet d'une requête une fois CrowdSec posé devant HAProxy :

Schéma de flux HAProxy et Crowdsec

Résultat concret : les scans et les IP déjà connues pour être hostiles sont écartés en amont, les tentatives d'exploitation web sont bloquées au niveau applicatif, et ce qui reste, le trafic légitime, atteint vos applications normalement.

Pourquoi les entreprises doivent s'y intéresser

Pour une PME, la logique est simple. Vous avez rendu votre frontal disponible c'est le sujet de notre article sur la haute disponibilité de HAProxy. L'étape suivante, c'est de le rendre sûr !
Un frontal hautement disponible mais non protégé, c'est une porte solide mais grande ouverte.

L'intérêt de CrowdSec, c'est qu'il apporte une protection de niveau grande entreprise (IPS comportemental, WAF, réputation mondiale) sans licence coûteuse ni appliance dédiée. Il tourne sur la machine qui héberge déjà HAProxy, se met à jour tout seul via son hub, et s'inscrit dans une démarche de sécurité continue plutôt que dans un audit ponctuel.

Exemple concret

Sur un déploiement en production, on a posé CrowdSec en frontal d'un cluster HAProxy existant. L'installation du moteur est simple

L'installation et la mise à jour du hub se fait rapidement.

apt install crowdsec -y curl -s https://install.crowdsec.net | sh cscli hub update && cscli hub upgrade systemctl restart crowdsec

On installe ensuite la collection HAProxy, un paquet qui regroupe des scénarios de détection adaptés :

cscli collections install crowdsecurity/haproxy

Puis on déclare l'agent SPOE côté HAProxy (fichier /etc/haproxy/crowdsec.cfg), qui définit les messages envoyés à CrowdSec et pointe vers le backend crowdsec-spoa.

[crowdsec]

spoe-agent crowdsec-agent
    messages crowdsec-tcp
    groups crowdsec-http-body crowdsec-http-no-body

    option var-prefix crowdsec
    option set-on-error error

    timeout hello 200ms
    timeout idle 55s
    timeout processing 500ms

    use-backend crowdsec-spoa
    log global

spoe-message crowdsec-tcp
    args id=unique-id src-ip=src src-port=src_port
    event on-client-session

spoe-message crowdsec-http-body
    args remediation=var(txn.crowdsec.remediation) id=unique-id method=method path=path query=query version=req.ver headers=req.hdrs body=req.body url=url ssl=ssl_fc src-ip=src src-port=src_port

spoe-message crowdsec-http-no-body
    args remediation=var(txn.crowdsec.remediation) id=unique-id method=method path=path query=query version=req.ver headers=req.hdrs url=url ssl=ssl_fc src-ip=src src-port=src_port

spoe-group crowdsec-http-body
    messages crowdsec-http-body

spoe-group crowdsec-http-no-body
    messages crowdsec-http-no-body
Nous définissons ensuite le backend HAProxy dans ( fichier etc/haproxy/haproxy.cfg)

backend crowdsec-spoa mode tcp server crowdsec-spoa 127.0.0.1:9000 check

Nous pouvons dès à présent activer le composant bouncer de CrowdSec : c'est lui qui prend la décision de laisser passer le flux ou non.

systemctl enable --now crowdsec-spoa-bouncer

Nous pouvons vérifier que crowdsec-spoa et crowdsec sont bien démarrés avec la commande :

ss -lntp | grep -E '9000|7422'

Dernière étape, la plus intéressante : activer le WAF (AppSec). On installe les collections AppSec, on configure le moteur (il écoute en local sur 127.0.0.1:7422), on recharge, et on suit l'activité en direct. Comme tout cela produit des logs précieux sur les détections, décisions de blocage, alertes WAF ils sont disponibles au chemin suivant

 /var/log/crowdsec-spoa/crowdsec-spoa-bouncer.log

Nous pouvons faire remonter ces logs sur Graylog pour une meilleure vue et déclencher également des alertes en cas de détection.

Il est possible d'installer un certain nombre de collections selon les règles que l'on souhaite appliquer. Dans notre cas, nous avons installé et appliqué ces deux collections :

cscli collections install crowdsecurity/appsec-generic-rules cscli collections install crowdsecurity/appsec-virtual-patching

Puis éditez le fichier /etc/crowdsec/acquis.d/appsec.yaml :

appsec_configs:  - crowdsecurity/appsec-generic-rules  - crowdsecurity/appsec-virtual-patching labels:  type: appsec listen_addr: 127.0.0.1:7422

Après chaque collection installée et appliquée, redémarrez le service :

systemctl reload crowdsec

Vous pouvez suivre les blocages en direct avec la commande :

cscli metrics show appsec

Et détailler les règles issues des collections appliquées avec la commande :

cscli appsec-rules list | grep enabled

Ce qu'on recommande chez Logexia

Nous recommandons d'activer l'AppSec et le bannissement d'IP par étape. Beaucoup s'arrêtent à la réputation d'IP mais c'est qu'une partie des fonctionnalités de Crowdsec. Le WAF applicatif et le virtual patching sont ce qui protège réellement contre l'exploitation d'une CVE le jour où elle sort. Les trois couches se complètent :

Trois couches de protection CrowdSec : réputation d'IP communautaire, WAF applicatif AppSec, virtual patching et OWASP CRS

Il convient cependant de procéder par étapes : utilisez la préproduction dès que possible, et n'activez CrowdSec que sur certains backends, en vous appuyant sur ce type d'ACL par exemple :

http-request send-spoe-group crowdsec crowdsec-http-no-body if ACL_votresite http-request deny status 403 if ACL_votresite { var(txn.crowdsec.remediation) -m str ban } use_backend back_votresite if ACL_votresite

Surveillez les faux positifs au démarrage : un WAF trop strict peut bloquer des requêtes légitimes. On démarre en observation, puis on durcit progressivement en ajustant les règles activées plutôt que de tout bloquer d'emblée.

Centraliser les logs dès le premier jour, dès qu'un blocage survient paramétrez une alerte par mail ou webhook. Un blocage qu'on ne voit pas est un blocage qu'on ne peut ni comprendre ni corriger.

Conclusion

Rendre un frontal disponible, c'est la première moitié du travail. Le rendre capable de refuser des requêtes malveillante, c'est la seconde. CrowdSec ajoute cette intelligence devant HAProxy, gratuitement, avec la force d'un réseau mondial derrière.