Crowdsec Traefik Bouncer: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
=Traefik mit CrowdSec und CAPTCHA absichern (lokaler ForwardAuth-Service)=
+
=Traefik mit CrowdSec und CAPTCHA absichern (lokaler ForwardAuth-Service mit Go-Plugin)=
  
 
==Ziel==
 
==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.
+
HTTP-Angreifer sollen nicht sofort blockiert, sondern auf eine CAPTCHA-Seite umgeleitet werden. Nach dem Bestehen wird der Zugriff freigegeben, und dabei verwenden wir das von dir gebaute Go-Plugin.
  
 
==Voraussetzungen==
 
==Voraussetzungen==
Zeile 9: Zeile 9:
 
* CrowdSec ist direkt auf dem Docker-Host installiert
 
* CrowdSec ist direkt auf dem Docker-Host installiert
 
* Docker-Netzwerk heißt '''traefik-public'''
 
* Docker-Netzwerk heißt '''traefik-public'''
* Docker läuft auf Linux mit aktiviertem '''host-gateway'''
+
* Das Go-Plugin wurde erfolgreich gebaut und ist als .so-Datei vorhanden
* ForwardAuth erfolgt per Middleware
 
  
 
==CrowdSec vorbereiten==
 
==CrowdSec vorbereiten==
Zeile 24: Zeile 23:
 
→ Den API-Key kopieren
 
→ Den API-Key kopieren
  
==Captcha-ForwardAuth einrichten==
+
==Go-Plugin in Traefik integrieren==
  
;Repository klonen
+
;Plugin .so-Datei in den Traefik-Container kopieren:
*cd /mnt/docker/traefik
+
*mkdir -p /mnt/docker/traefik/plugins/crowdsec
*git clone https://github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin.git
+
*cp /mnt/docker/traefik/crowdsec-bouncer-traefik-plugin/plugin.so /mnt/docker/traefik/plugins/crowdsec/
  
;Konfiguration erstellen (außerhalb des Beispielverzeichnisses!)
+
;Traefik konfigurieren:
*vi /mnt/docker/traefik/captcha-config.yml
+
*vi /mnt/docker/traefik/traefik.yaml
  listen_uri: 0.0.0.0:8081
+
  experimental:
crowdsec_lapi_key: '''HIER_DEN_KEY_EINFÜGEN'''
+
  plugins:
crowdsec_lapi_url: http://host.docker.internal:8080/
+
    crowdsec:
log_level: info
+
      moduleName: "/mnt/docker/traefik/plugins/crowdsec/plugin.so"
mode: captcha
+
      version: "v1.4.2"
  
 
==Docker-Compose erweitern==
 
==Docker-Compose erweitern==
  
;Captcha-Service hinzufügen:
+
;Captcha-Service in dein bestehendes Setup einfügen:
 
  captcha-auth:
 
  captcha-auth:
   build:
+
   image: crowdsecurity/cs-traefik-bouncer
    context: ./crowdsec-bouncer-traefik-plugin/examples/captcha
 
 
   container_name: captcha-auth
 
   container_name: captcha-auth
 
   ports:
 
   ports:
Zeile 54: Zeile 52:
 
     - traefik-public
 
     - traefik-public
 
   restart: unless-stopped
 
   restart: unless-stopped
 
→ '''captcha-config.yml''' liegt im Traefik-Stammverzeichnis, nicht im Beispielordner
 
  
 
==Middleware in Traefik definieren==
 
==Middleware in Traefik definieren==
Zeile 69: Zeile 65:
 
           - X-Crowdsec-Captcha-Result
 
           - X-Crowdsec-Captcha-Result
  
==Middleware in Router einbinden (Beispiel uptime-kuma)==
+
==Router beschreiben (Beispiel uptime-kuma)==
  
 
*vi /mnt/docker/uptime-kuma/docker-compose.yaml
 
*vi /mnt/docker/uptime-kuma/docker-compose.yaml
Zeile 80: Zeile 76:
 
==System starten==
 
==System starten==
  
*docker compose up -d --build
+
*docker compose up -d
  
 
==Testen==
 
==Testen==

Version vom 9. April 2025, 11:56 Uhr

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

Ziel

HTTP-Angreifer sollen nicht sofort blockiert, sondern auf eine CAPTCHA-Seite umgeleitet werden. Nach dem Bestehen wird der Zugriff freigegeben, und dabei verwenden wir das von dir gebaute Go-Plugin.

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
  • Das Go-Plugin wurde erfolgreich gebaut und ist als .so-Datei vorhanden

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

Go-Plugin in Traefik integrieren

Plugin .so-Datei in den Traefik-Container kopieren
  • mkdir -p /mnt/docker/traefik/plugins/crowdsec
  • cp /mnt/docker/traefik/crowdsec-bouncer-traefik-plugin/plugin.so /mnt/docker/traefik/plugins/crowdsec/
Traefik konfigurieren
  • vi /mnt/docker/traefik/traefik.yaml
experimental:
  plugins:
    crowdsec:
      moduleName: "/mnt/docker/traefik/plugins/crowdsec/plugin.so"
      version: "v1.4.2"

Docker-Compose erweitern

Captcha-Service in dein bestehendes Setup einfügen
captcha-auth:
  image: crowdsecurity/cs-traefik-bouncer
  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

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

Testen

CAPTCHA-Zwang auslösen
  • cscli decisions add --ip DEINE.IP.ADRESSE --type captcha --duration 10m
Seite im Browser aufrufen

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