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.
Prérequis
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 :
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
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