La correction est intégrée au TP (Voir les encadrés de couleur vert)
Ce que vous allez apprendre dans ce TP
- Déclarer le plugin
- Brancher le middleware
- Bloquer une adresse
- Faire confiance au bon proxy
Introduction #
Ce que vous allez apprendre dans cette section
- Déclarer le plugin
- Brancher le middleware
- Bloquer une adresse
- Faire confiance au bon proxy
Contexte. Votre site passe par Traefik. Vous voulez renvoyer une erreur 403 aux adresses bannies.
Prérequis : le TP 1, accès Internet pour télécharger le plugin · Durée estimée : 50 min
Mise en place #
Étapes guidées, avec leur correction.
1. Les fichiers
Pourquoi ? La clé est partagée : CrowdSec la déclare (
Dans un nouveau dossier :BOUNCER_KEY_traefik), Traefik l'utilise.Voir la correction
services: traefik: image: traefik:v3.7.17 ports: - "80:80" volumes: - ./traefik.yml:/etc/traefik/traefik.yml:ro - ./dynamic.yml:/etc/traefik/dynamic.yml:ro - ./logs:/var/log/traefik whoami: image: traefik/whoami crowdsec: image: crowdsecurity/crowdsec:v1.8.2 environment: COLLECTIONS: "crowdsecurity/traefik" BOUNCER_KEY_traefik: ${CROWDSEC_BOUNCER_KEY} DISABLE_ONLINE_API: "true" volumes: - ./acquis.d:/etc/crowdsec/acquis.d:ro - ./logs:/var/log/traefik:ro - crowdsec-config:/etc/crowdsec - crowdsec-data:/var/lib/crowdsec/data volumes: crowdsec-config: crowdsec-data:echo "CROWDSEC_BOUNCER_KEY=$(openssl rand -hex 24)" > .env mkdir -p logs acquis.d cat > acquis.d/traefik.yaml <<'EOF' filenames: - /var/log/traefik/access.log labels: type: traefik EOF cat > traefik.yml <<'EOF' entryPoints: web: address: ":80" accessLog: filePath: /var/log/traefik/access.log providers: file: filename: /etc/traefik/dynamic.yml experimental: plugins: bouncer: moduleName: github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin version: v1.8.1 EOF2. Le middleware
Générez la configuration dynamique et démarrez.
Voir la correction
. ./.env cat > dynamic.yml <<EOF http: middlewares: crowdsec: plugin: bouncer: enabled: true crowdsecMode: stream updateIntervalSeconds: 15 crowdsecLapiScheme: http crowdsecLapiHost: crowdsec:8080 crowdsecLapiKey: ${CROWDSEC_BOUNCER_KEY} routers: whoami: rule: "Host(\`whoami.localhost\`)" entryPoints: [web] service: whoami middlewares: [crowdsec] services: whoami: loadBalancer: servers: - url: "http://whoami:80" EOF docker compose up -d curl -s -H 'Host: whoami.localhost' http://localhost/ | grep -i x-real-ipL'en-tête
X-Real-Ipaffiché par whoami est l'adresse vue par Traefik.3. Bloquer
Bannissez votre propre adresse vue par Traefik, puis levez le ban.
Voir la correction
IP=$(curl -s -H 'Host: whoami.localhost' http://localhost/ | awk -F': ' 'tolower($1)=="x-real-ip"{print $2}' | tr -d '\r') docker compose exec crowdsec cscli decisions add --ip "$IP" --duration 10m curl -s -o /dev/null -w "%{http_code}\n" -H 'Host: whoami.localhost' http://localhost/ # 200 : pas encore synchronisé sleep 20 curl -s -o /dev/null -w "%{http_code}\n" -H 'Host: whoami.localhost' http://localhost/ # 403 docker compose exec crowdsec cscli bouncers list docker compose exec crowdsec cscli decisions delete --ip "$IP"En mode
stream, le blocage arrive à la synchronisation suivante (15 s ici).4. Le piège de l'IP réelle
Simulez un client derrière un proxy avecX-Forwarded-For.Voir la correction
# 1. Sans confiance : l'en-tête est écrasé, l'IP bannie passe docker compose exec crowdsec cscli decisions add --ip 203.0.113.80 --duration 10m sleep 20 curl -s -o /dev/null -w "%{http_code}\n" -H 'Host: whoami.localhost' -H 'X-Forwarded-For: 203.0.113.80' http://localhost/ # 200 # 2. Faites confiance au réseau Docker sur l'entrypoint, puis redémarrez Traefik # entryPoints.web.forwardedHeaders.trustedIPs: ["172.16.0.0/12"] # et, dans le plugin : forwardedHeadersTrustedIPs: ["172.16.0.0/12"] docker compose restart traefik sleep 20 curl -s -o /dev/null -w "%{http_code}\n" -H 'Host: whoami.localhost' -H 'X-Forwarded-For: 203.0.113.80' http://localhost/ # 403En production, limitez ces plages à vos vrais proxys : sinon, n'importe qui peut choisir l'adresse vue par le bouncer.
Niveau de difficulté : ●●○○○ (2/5)
Mon suivi
Connectez-vous pour suivre votre progression et prendre des notes. Se connecter
Articles recommandés
Les bouncers CrowdSec : principes et bouncer pare-feu
Comprendre les bouncers CrowdSec : où bloquer, modes live et stream, clés d'API, API des décision...
Protéger Traefik avec CrowdSec : le plugin bouncer
Mettre en place le bouncer CrowdSec dans Traefik : plugin, middleware, modes stream et live, IP r...
Bouncers CrowdSec : Cloudflare, équipements réseau, Kubernetes et bouncer sur mesure
Bloquer au CDN avec Cloudflare Workers, alimenter pfSense ou MikroTik avec Blocklist Mirror, prot...
Les plugins Traefik : l'exemple de CrowdSec pour bloquer les attaques
Étendre Traefik avec des plugins (catalogue officiel, interpréteur Yaegi), puis protéger ses appl...
CrowdSec : comprendre le pare-feu collaboratif
Ce qu'est CrowdSec, comment il détecte et bloque les attaques : Security Engine, parsers, scénari...
Bouncers CrowdSec pour Nginx, Apache et HAProxy
Mettre en place les bouncers CrowdSec pour Nginx, OpenResty, Apache et HAProxy SPOA : configurati...
Installer et configurer CrowdSec : paquets, Docker, acquisition
Installer CrowdSec avec les paquets ou Docker, comprendre ses fichiers, déclarer les logs à lire,...
Observabilité de CrowdSec : IP bannies, attaques bloquées, Prometheus et Grafana
Suivre CrowdSec : cscli metrics, IP bannies, attaques détectées, volume bloqué par les bouncers, ...
Collections, parsers et scénarios CrowdSec
Le Hub, les collections, le pipeline des parsers et les scénarios : installer, comprendre avec cs...