RousselTMLEARNING

TP · CrowdSec : de la découverte à l'expertise

TP 3 : Protéger Traefik avec le bouncer CrowdSec avec correction

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. 1. Les fichiers

    Pourquoi ? La clé est partagée : CrowdSec la déclare (BOUNCER_KEY_traefik), Traefik l'utilise.

    Dans un nouveau dossier :
    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
    EOF
  2. 2. 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-ip

    L'en-tête X-Real-Ip affiché par whoami est l'adresse vue par Traefik.

  3. 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. 4. Le piège de l'IP réelle

    Simulez un client derrière un proxy avec X-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/   # 403

    En 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

  • ⏱ Durée estimée : ≈ 50 min

Connectez-vous pour suivre votre progression et prendre des notes. Se connecter

💬 Poser une question

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...

Soutenir

♥ SOUTENIR

Soutenez RousselTM Learning

Les formations, articles, TP et attestations restent gratuits et sans publicité intrusive. Une contribution libre, du montant de votre choix, finance l’hébergement, les environnements de TP et l’écriture de nouveaux contenus.

Contribuer avec PayPal Montant libre · carte bancaire ou compte PayPalEn savoir plus
QR code PayPal
Ou scannez ce QR code avec votre téléphone

Merci, chaque contribution compte !