Aller au contenu

Crowdsec + HAProxy : sécurisez vos applications Web

CrowdSec est un moteur de détection de comportement gratuit, moderne et collaboratif, couplé à un réseau mondial de réputation IP. Il s'appuie sur la philosophie de fail2ban mais est compatible IPV6 et 60x plus rapide (Go vs Python), il utilise des patterns Grok pour analyser les logs et des scénarios YAML pour identifier les comportements. CrowdSec est conçu pour les infrastructures modernes basées sur le Cloud / Conteneurs / VM (en découplant la détection et la remédiation). Une fois détectée, vous pouvez remédier aux menaces avec divers bouncers (blocage du pare-feu, nginx http 403, Captchas, etc.) tandis que l'IP agressive peut être envoyée à CrowdSec pour la curation avant d'être partagée entre tous les utilisateurs pour améliorer encore la sécurité de tous. Voir la FAQ ou lire ci-dessous pour plus d'informations.

crowdsec logo

Prérequis

Architecture

architecture

Le moteur de sécurité CrowdSec est un logiciel libre et léger qui détecte et empêche les acteurs malveillants d'accéder à vos systèmes à différents niveaux, en utilisant l'analyse des journaux et des modèles de menaces appelés scénarios.

CrowdSec est un cadre modulaire, offrant une variété de scénarios populaires. Les utilisateurs peuvent choisir leurs scénarios de protection et déployer des composants de remédiation pour bloquer les accès malveillants.

L'aspect « crowd-sourced » permet de partager des informations sur les attaques entre les utilisateurs, ce qui améliore la détection des attaques en temps réel et le blocage préventif des mauvais acteurs connus de votre système.

Notre architecture est la suivante :

architecure

Notre objectif est de protéger le trafic avant qu'il n'atteigne les serveurs Web derrière le load balancer.

Installation

On considère que HAPROXY est configuré, que les routages vers les différents serveurs web sont fonctionnels et que la délivrance de certificats HTTPS est effective.

Installation serveur HAPROXY

Ajout du dépôt officiel :

curl -s https://install.crowdsec.net | sudo sh

Installation du paquet :

apt install crowdsec

Le moteur de sécurité fonctionne maintenant ! Vous pouvez aller de l'avant et installer un composant de remédiation, ou faire une visite guidée du logiciel avant !

Répertoires :

  • L'application se trouve dans le dossier /etc/crowdsec.
  • Les données sont stockées dans le dossier /var/lib/crowdsec/data.

Ajouter votre instance à la console crowdsec

Créer un compte sur crowdsec, puis cliquer sur le lien suivant : https://app.crowdsec.net/security-engines?enroll-engine=true

sudo cscli console enroll -e context TOKEN_SUPER_SECRET

Installation de notre bouncer

Le bouncer sert à appliquer les décisions.

sudo apt install crowdsec-haproxy-bouncer

Le fichier de configuration /etc/crowdsec/bouncers/crowdsec-haproxy-bouncer.conf, on y reviendra pour entrer les secrets pour utiliser le captcha de CloudFlare.

Configuration haproxy.cf

Editer le fichier : /etc/haproxy/haproxy.cfg

Il faudra essayer de se rapprocher de cette configuration actuelle.

global

    # Crowdsec bouncer >>>
    lua-prepend-path /usr/lib/crowdsec/lua/haproxy/?.lua
    lua-load /usr/lib/crowdsec/lua/haproxy/crowdsec.lua # path to crowdsec.lua
    setenv CROWDSEC_CONFIG /etc/crowdsec/bouncers/crowdsec-haproxy-bouncer.conf # path to crowdsec bouncer configuration file
    # Crowdsec bouncer <<<


frontend http-front
    bind *:80

    # Redirection HTTP vers HTTPS
    redirect scheme https code 301 if !{ ssl_fc }

frontend https-front
    bind *:443 ssl crt /etc/haproxy/ssl/kaze-cloud.fr.pem crt /etc/haproxy/ssl/dokploy.kaze-cloud.fr.pem

    mode http
    option httplog

    # Crowdsec bouncer >>>
    stick-table type ip size 10k expire 30m # declare a stick table to cache captcha verifications
    http-request lua.crowdsec_allow # action to identify crowdsec remediation
    http-request track-sc0 src if { var(req.remediation) -m str "captcha-allow" } # cache captcha allow decision 
    http-request redirect location %[var(req.redirect_uri)] if { var(req.remediation) -m str "captcha-allow" } # redirect to initial url
    http-request use-service lua.reply_captcha if { var(req.remediation) -m str "captcha" } # serve captcha template if remediation is captcha
    http-request use-service lua.reply_ban if { var(req.remediation) -m str "ban" } # serve ban template if remediation is ban
    # Crowdsec bouncer <<<

    # Domaine Name
    acl ACL_web00 hdr(host) -i web00.domain.tld
    use_backend web00-backend if ACL_web00

backend web00-backend
    mode http
    option httpchk
    option forwardfor except 127.0.0.1
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
    compression algo gzip
    server web00.domain.tld    1X.X.X.X:80 check


# Crowdsec bouncer >>>
# define a backend for the captcha provider to allow DNS resolution
backend captcha_verifier
    # server captcha_verifier www.recaptcha.net:443 check
    #server hcaptcha_verifier hcaptcha.com:443 check
    server turnstile_verifier challenges.cloudflare.com:443 check
    # this is a little bit magic the server name is used to inform which captcha service you are using

# define a backend for crowdsec to allow DNS resolution
# replace 127.0.0.1:8080 by the listen URI of the crowdsec local API
backend crowdsec
    server crowdsec 127.0.0.1:8080 check
# Crowdsec bouncer <<<

Trouver et ajouter nos secrets pour le captchat CloudFlare

Le service "Captchat" s'appelle Turnstile

turnistile

cle

Les clés ne sont plus valables :)

Editer le fichier : /etc/crowdsec/bouncers/crowdsec-haproxy-bouncer.conf

# Captcha Secret Key
SECRET_KEY=
# captcha Site key
SITE_KEY=

Remplir les champs.

Mes listes

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 Name                               📦 Status                     Version  Local Path                                         
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 crowdsecurity/base-http-scenarios  ⚠️  enabled,update-available  1.0      /etc/crowdsec/collections/base-http-scenarios.yaml 
 crowdsecurity/freebsd              ⚠️  enabled,update-available  0.3      /etc/crowdsec/collections/freebsd.yaml             
 crowdsecurity/haproxy              ✔️  enabled                   0.1      /etc/crowdsec/collections/haproxy.yaml             
 crowdsecurity/http-cve             ⚠️  enabled,update-available  2.6      /etc/crowdsec/collections/http-cve.yaml            
 crowdsecurity/http-dos             ✔️  enabled                   0.2      /etc/crowdsec/collections/http-dos.yaml            
 crowdsecurity/linux                ⚠️  enabled,update-available  0.2      /etc/crowdsec/collections/linux.yaml               
 crowdsecurity/nextcloud            ⚠️  enabled,update-available  0.3      /etc/crowdsec/collections/nextcloud.yaml           
 crowdsecurity/nginx                ✔️  enabled                   0.2      /etc/crowdsec/collections/nginx.yaml               
 crowdsecurity/opnsense             ✔️  enabled                   0.4      /etc/crowdsec/collections/opnsense.yaml            
 crowdsecurity/opnsense-gui         ✔️  enabled                   0.1      /etc/crowdsec/collections/opnsense-gui.yaml        
 crowdsecurity/pfsense              ✔️  enabled                   0.2      /etc/crowdsec/collections/pfsense.yaml             
 crowdsecurity/pfsense-gui          ✔️  enabled                   0.1      /etc/crowdsec/collections/pfsense-gui.yaml         
 crowdsecurity/sshd                 ⚠️  enabled,update-available  0.5      /etc/crowdsec/collections/sshd.yaml                
 crowdsecurity/teleport             ✔️  enabled                   0.1      /etc/crowdsec/collections/teleport.yaml            
 firewallservices/pf                ✔️  enabled                   0.2      /etc/crowdsec/collections/pf.yaml                  
 LePresidente/authelia              ✔️  enabled                   0.2      /etc/crowdsec/collections/authelia.yml             
 LePresidente/gitea                 ✔️  enabled                   0.2      /etc/crowdsec/collections/gitea.yml                
 timokoessler/gitlab                ✔️  enabled                   0.1      /etc/crowdsec/collections/gitlab.yaml              

Pour aller plus loin...

Une bonne documentation par ici... ici