Crowdsec Traefik Bouncer: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
=Traefik mit CrowdSec + CAPTCHA über HTTPS (Label-basiert)=
+
=Traefik mit CrowdSec und CAPTCHA absichern (lokaler ForwardAuth-Service)=
  
 
==Ziel==
 
==Ziel==
HTTP-Angreifer sollen nicht sofort geblockt, sondern auf eine CAPTCHA-Seite umgeleitet werden. Nach erfolgreicher Bestätigung wird der Zugriff automatisch freigegeben – ausschließlich über HTTPS. Die Konfiguration erfolgt vollständig über Docker-Labels unter Verwendung des offiziellen CrowdSec-Plugins für Traefik.
+
HTTP-Angreifer sollen nicht direkt blockiert, sondern auf eine CAPTCHA-Seite umgeleitet werden. Nach dem Bestehen wird der Zugriff freigegeben. Es wird kein Plugin und kein Image aus einer Registry verwendet.
  
 
==Voraussetzungen==
 
==Voraussetzungen==
* Traefik läuft als Container (z. B. mit weyon/traefik-bindtools)
+
* Traefik läuft als Container
* HTTPS ist aktiv (Wildcard-Zertifikat oder Let's Encrypt)
+
* HTTPS ist aktiv (Wildcard oder certresolver)
 
* CrowdSec ist direkt auf dem Docker-Host installiert
 
* CrowdSec ist direkt auf dem Docker-Host installiert
* Externes Docker-Netzwerk heißt ''traefik-public''
+
* Docker-Netzwerk heißt '''traefik-public'''
* Die Dienste wie ''uptime-kuma'' sind über Traefik erreichbar
+
* Docker läuft auf Linux mit aktiviertem '''host-gateway'''
* Das CrowdSec-Traefik-Plugin wird verwendet (kein Bouncer-Container nötig)
+
* ForwardAuth erfolgt per Middleware
  
 
==CrowdSec vorbereiten==
 
==CrowdSec vorbereiten==
  
 +
;API auf allen Interfaces verfügbar machen
 
*vi /etc/crowdsec/config.yaml
 
*vi /etc/crowdsec/config.yaml
 
  listen_uri: 0.0.0.0:8080
 
  listen_uri: 0.0.0.0:8080
 +
*systemctl restart crowdsec
 +
 +
;API-Schlüssel für den Bouncer erstellen
 +
*cscli bouncers add traefik-captcha
 +
 +
→ Den API-Key kopieren
 +
 +
==Captcha-ForwardAuth einrichten==
  
*systemctl restart crowdsec
+
;Repo klonen und Beispiel verwenden
 +
*cd /usr/local/src
 +
*git clone https://github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin.git
 +
*cd crowdsec-bouncer-traefik-plugin/examples/captcha
  
*cscli bouncers add traefik-plugin
+
;Konfiguration anpassen
 +
*vi config.yml
 +
listen_uri: 0.0.0.0:8081
 +
crowdsec_lapi_key: '''HIER_DEN_KEY_EINFÜGEN'''
 +
crowdsec_lapi_url: http://host.docker.internal:8080/
 +
log_level: info
 +
mode: captcha
  
→ Den Key kopieren
+
==Docker-Compose erweitern==
  
==Traefik-Plugin aktivieren==
+
;Captcha-Service in dein bestehendes Setup einfügen:
 +
captcha-auth:
 +
  build: ./crowdsec-bouncer-traefik-plugin/examples/captcha
 +
  container_name: captcha-auth
 +
  ports:
 +
    - "8081:8081"
 +
  volumes:
 +
    - ./captcha-config.yml:/config.yml:ro
 +
  extra_hosts:
 +
    - "host.docker.internal:host-gateway"
 +
  networks:
 +
    - traefik-public
 +
  restart: unless-stopped
  
*vi /mnt/docker/traefik/traefik.yaml
+
→ '''captcha-config.yml''' enthält den Inhalt von ''config.yml'' aus dem Beispiel
experimental:
 
  plugins:
 
    crowdsec:
 
      moduleName: "github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin"
 
      version: "v1.4.2"
 
  
==Middleware definieren==
+
==Middleware in Traefik definieren==
  
 
*vi /mnt/docker/traefik/conf/middleware.yaml
 
*vi /mnt/docker/traefik/conf/middleware.yaml
Zeile 38: Zeile 63:
 
   middlewares:
 
   middlewares:
 
     crowdsec-captcha:
 
     crowdsec-captcha:
       plugin:
+
       forwardAuth:
         crowdsec:
+
         address: http://captcha-auth:8081/api/v1/forwardAuth
          crowdsec_mode: captcha
+
        trustForwardHeader: true
          crowdsec_lapi_url: http://host.docker.internal:8080/
+
        authResponseHeaders:
          crowdsec_lapi_key: HIER_DEN_KEY_EINFÜGEN
+
          - X-Crowdsec-Captcha-Result
 
 
==Middleware aktivieren für uptime-kuma==
 
  
In der ''docker-compose.yaml'' von ''uptime-kuma'' ergänzen:
+
==Router beschreiben (Beispiel uptime-kuma)==
  
  - "traefik.http.routers.uptime-kuma.middlewares=crowdsec-captcha@file"
+
*vi /mnt/docker/uptime-kuma/docker-compose.yaml
 +
- "traefik.http.routers.uptime-kuma.rule=Host(`uptime-kuma.samogo.de`)"
 +
- "traefik.http.routers.uptime-kuma.entrypoints=websecure"
 +
- "traefik.http.routers.uptime-kuma.tls=true"
 +
- "traefik.http.routers.uptime-kuma.service=uptime-kuma"
 +
- "traefik.http.routers.uptime-kuma.middlewares=crowdsec-captcha@file"
  
 
==System starten==
 
==System starten==
  
*docker compose up -d
+
*docker compose up -d --build
  
 
==Testen==
 
==Testen==
  
*cscli decisions add --ip DEINE_IP --type captcha --duration 10m
+
;Captchazwang auslösen
 +
*cscli decisions add --ip '''DEINE.IP.ADRESSE''' --type captcha --duration 10m
  
*Browser öffnen → https://uptime-kuma.samogo.de
+
;Aufruf im Browser
 +
*https://uptime-kuma.samogo.de
  
→ CAPTCHA-Seite erscheint
+
Die CAPTCHA-Seite erscheint
  
 
==Fazit==
 
==Fazit==
Diese Konfiguration integriert das CrowdSec CAPTCHA direkt in Traefik über das offizielle Plugin. Sie kommt ohne zusätzlichen Container aus und ermöglicht eine saubere und wartbare Absicherung von Diensten über HTTPS – dynamisch, intelligent und benutzerfreundlich.
+
Mit dem Beispiel aus ''examples/captcha'' wird ein eigenständiger ForwardAuth-Dienst genutzt, um CAPTCHA mit Traefik und CrowdSec zu kombinieren – ohne Plugin oder Container aus der Registry. Das Setup ist portabel, nachvollziehbar und funktioniert unabhängig vom Plugin-Hub.

Version vom 9. April 2025, 11:13 Uhr

Traefik mit CrowdSec und CAPTCHA absichern (lokaler ForwardAuth-Service)

Ziel

HTTP-Angreifer sollen nicht direkt blockiert, sondern auf eine CAPTCHA-Seite umgeleitet werden. Nach dem Bestehen wird der Zugriff freigegeben. Es wird kein Plugin und kein Image aus einer Registry verwendet.

Voraussetzungen

  • Traefik läuft als Container
  • HTTPS ist aktiv (Wildcard oder certresolver)
  • CrowdSec ist direkt auf dem Docker-Host installiert
  • Docker-Netzwerk heißt traefik-public
  • Docker läuft auf Linux mit aktiviertem host-gateway
  • ForwardAuth erfolgt per Middleware

CrowdSec vorbereiten

API auf allen Interfaces verfügbar machen
  • vi /etc/crowdsec/config.yaml
listen_uri: 0.0.0.0:8080
  • systemctl restart crowdsec
API-Schlüssel für den Bouncer erstellen
  • cscli bouncers add traefik-captcha

→ Den API-Key kopieren

Captcha-ForwardAuth einrichten

Repo klonen und Beispiel verwenden
Konfiguration anpassen
  • vi config.yml
listen_uri: 0.0.0.0:8081
crowdsec_lapi_key: HIER_DEN_KEY_EINFÜGEN
crowdsec_lapi_url: http://host.docker.internal:8080/
log_level: info
mode: captcha

Docker-Compose erweitern

Captcha-Service in dein bestehendes Setup einfügen
captcha-auth:
  build: ./crowdsec-bouncer-traefik-plugin/examples/captcha
  container_name: captcha-auth
  ports:
    - "8081:8081"
  volumes:
    - ./captcha-config.yml:/config.yml:ro
  extra_hosts:
    - "host.docker.internal:host-gateway"
  networks:
    - traefik-public
  restart: unless-stopped

captcha-config.yml enthält den Inhalt von config.yml aus dem Beispiel

Middleware in Traefik definieren

  • vi /mnt/docker/traefik/conf/middleware.yaml
http:
  middlewares:
    crowdsec-captcha:
      forwardAuth:
        address: http://captcha-auth:8081/api/v1/forwardAuth
        trustForwardHeader: true
        authResponseHeaders:
          - X-Crowdsec-Captcha-Result

Router beschreiben (Beispiel uptime-kuma)

  • vi /mnt/docker/uptime-kuma/docker-compose.yaml
- "traefik.http.routers.uptime-kuma.rule=Host(`uptime-kuma.samogo.de`)"
- "traefik.http.routers.uptime-kuma.entrypoints=websecure"
- "traefik.http.routers.uptime-kuma.tls=true"
- "traefik.http.routers.uptime-kuma.service=uptime-kuma"
- "traefik.http.routers.uptime-kuma.middlewares=crowdsec-captcha@file"

System starten

  • docker compose up -d --build

Testen

Captchazwang auslösen
  • cscli decisions add --ip DEINE.IP.ADRESSE --type captcha --duration 10m
Aufruf im Browser

→ Die CAPTCHA-Seite erscheint

Fazit

Mit dem Beispiel aus examples/captcha wird ein eigenständiger ForwardAuth-Dienst genutzt, um CAPTCHA mit Traefik und CrowdSec zu kombinieren – ohne Plugin oder Container aus der Registry. Das Setup ist portabel, nachvollziehbar und funktioniert unabhängig vom Plugin-Hub.