Crowdsec Traefik Bouncer: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
=Traefik + CrowdSec + CAPTCHA (HTTPS) absichern=
+
=Traefik mit CrowdSec + CAPTCHA über HTTPS (Label-basiert)=
  
 
==Ziel==
 
==Ziel==
Angreifer sollen bei HTTP-Angriffen nicht direkt blockiert, sondern auf eine CAPTCHA-Seite umgeleitet werden. Nach Bestehen des CAPTCHAs wird der Zugriff wieder freigegeben – ausschließlich über HTTPS.
+
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.
  
 
==Voraussetzungen==
 
==Voraussetzungen==
 +
* Traefik läuft als Container (z. B. mit weyon/traefik-bindtools)
 +
* HTTPS ist aktiv (Let's Encrypt mit certresolver=letsencrypt)
 +
* CrowdSec ist direkt auf dem Docker-Host installiert
 +
* Externes Docker-Netzwerk heißt ''traefik-public''
 +
* Die Dienste wie ''uptime-kuma'' sind über Traefik erreichbar
  
* Traefik läuft im Docker-Container mit aktiviertem HTTPS (Let's Encrypt)
+
==CrowdSec vorbereiten==
* CrowdSec ist auf dem Docker-Host installiert
 
* Der cs-traefik-bouncer wird als Container betrieben
 
  
==Vorbereitungen auf dem Host==
 
 
;CrowdSec-API für den Container erreichbar 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
 
*systemctl restart crowdsec
 
==Bouncer in CrowdSec registrieren==
 
  
 
*cscli bouncers add traefik-bouncer
 
*cscli bouncers add traefik-bouncer
  
API-Key notieren und später in config.yml eintragen
+
Den Key kopieren
  
==Bouncer-Konfiguration erstellen==
+
==Bouncer-Konfiguration==
  
*mkdir /mnt/docker/traefik/bouncer
+
*mkdir -p /mnt/docker/traefik/bouncer
 
*vi /mnt/docker/traefik/bouncer/config.yml
 
*vi /mnt/docker/traefik/bouncer/config.yml
 
  listen_uri: 0.0.0.0:8081
 
  listen_uri: 0.0.0.0:8081
  crowdsec_lapi_key: HIER_API_KEY_EINFÜGEN
+
  crowdsec_lapi_key: HIER_DEN_KEY_EINFÜGEN
 
  crowdsec_lapi_url: http://host.docker.internal:8080/
 
  crowdsec_lapi_url: http://host.docker.internal:8080/
 
  log_level: info
 
  log_level: info
 
  mode: captcha
 
  mode: captcha
  
==Docker-Setup==
+
==Docker-Compose ergänzen==
 +
 
 +
Nur den neuen Dienst einfügen:
  
*vi /mnt/docker/traefik/docker-compose.yaml
+
  traefik-bouncer:
version: '3.8'
+
  image: crowdsecurity/cs-traefik-bouncer
  services:
+
  container_name: traefik-bouncer
  traefik:
+
  volumes:
    image: traefik
+
    - ./bouncer/config.yml:/config.yml:ro
    container_name: traefik
+
  ports:
    ports:
+
    - "8081:8081"
      - "80:80"
+
  extra_hosts:
      - "443:443"
+
    - "host.docker.internal:host-gateway"
    volumes:
+
  restart: unless-stopped
      - /var/run/docker.sock:/var/run/docker.sock
+
  networks:
      - ./conf:/conf
+
    - traefik-public
      - ./letsencrypt:/letsencrypt
 
    command:
 
      - "--entrypoints.web.address=:80"
 
      - "--entrypoints.websecure.address=:443"
 
      - "--providers.docker=true"
 
      - "--providers.file.directory=/conf"
 
      - "--providers.file.watch=true"
 
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
 
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
 
      - "--certificatesresolvers.myresolver.acme.email=technik@samogo.de"
 
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
 
    networks:
 
      - traefik
 
  traefik-bouncer:
 
    image: crowdsecurity/cs-traefik-bouncer
 
    container_name: traefik-bouncer
 
    volumes:
 
      - ./bouncer/config.yml:/config.yml:ro
 
    ports:
 
      - "8081:8081"
 
    extra_hosts:
 
      - "host.docker.internal:host-gateway"
 
    networks:
 
      - traefik
 
  
networks:
+
→ ''traefik'' bleibt unangetastet.
  traefik:
 
  
==Middleware für CAPTCHA==
+
==Middleware definieren==
  
 
*vi /mnt/docker/traefik/conf/middleware.yaml
 
*vi /mnt/docker/traefik/conf/middleware.yaml
Zeile 88: Zeile 63:
 
           - X-Crowdsec-Captcha-Result
 
           - X-Crowdsec-Captcha-Result
  
==Router und Services definieren==
+
==Middleware aktivieren für uptime-kuma==
  
*vi /mnt/docker/traefik/conf/router.yaml
+
In der ''docker-compose.yaml'' von ''uptime-kuma'' ergänzen:
<pre>
 
http:
 
  routers:
 
    traefik-ui:
 
      rule: Host(`traefik.samogo.de`)
 
      entryPoints:
 
        - websecure
 
      service: api@internal
 
      middlewares:
 
        - crowdsec-captcha
 
      tls:
 
        certResolver: myresolver
 
  
    uptime-kuma:
+
labels:
      rule: Host(`uptime-kuma.samogo.de`)
+
  - "traefik.enable=true"
      entryPoints:
+
  - "traefik.http.routers.uptime-kuma.rule=Host(`uptime-kuma.samogo.de`)"
        - websecure
+
  - "traefik.http.routers.uptime-kuma.entrypoints=websecure"
      service: uptime-kuma
+
  - "traefik.http.routers.uptime-kuma.tls.certresolver=letsencrypt"
      middlewares:
+
  - "traefik.http.routers.uptime-kuma.service=uptime-kuma"
        - crowdsec-captcha
+
  - "traefik.http.services.uptime-kuma.loadbalancer.server.port=3001"
      tls:
+
  - "traefik.http.routers.uptime-kuma.middlewares=crowdsec-captcha@file"
        certResolver: myresolver
 
  
  services:
+
→ Port 3001 ggf. anpassen
    uptime-kuma:
 
      loadBalancer:
 
        servers:
 
          - url: "http://uptime-kuma:3001"
 
</pre>
 
  
 
==System starten==
 
==System starten==
Zeile 127: Zeile 84:
 
==Testen==
 
==Testen==
  
*curl -s https://uptime-kuma.samogo.de/.env
+
*cscli decisions add --ip DEINE_IP --type captcha --duration 10m
(Decision sollte CAPTCHA sein)
+
 
 +
*Browser öffnen → https://uptime-kuma.samogo.de
  
*Browser öffnen → CAPTCHA-Seite wird angezeigt
+
→ CAPTCHA-Seite erscheint
  
 
==Fazit==
 
==Fazit==
Diese Konfiguration schützt Traefik-Dienste per HTTPS mit CrowdSec und CAPTCHA. Angreifer werden automatisch erkannt und gezielt mit einer Bestätigungsseite aufgehalten – ohne legitime Nutzer dauerhaft zu blockieren.
+
Diese Konfiguration ergänzt dein vorhandenes Setup um eine sichere, dynamische CAPTCHA-Funktion mit CrowdSec. Angreifer werden zuverlässig erkannt und gebremst – ohne legitime Nutzer dauerhaft auszuschließen.

Version vom 9. April 2025, 09:56 Uhr

Traefik mit CrowdSec + CAPTCHA über HTTPS (Label-basiert)

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.

Voraussetzungen

  • Traefik läuft als Container (z. B. mit weyon/traefik-bindtools)
  • HTTPS ist aktiv (Let's Encrypt mit certresolver=letsencrypt)
  • CrowdSec ist direkt auf dem Docker-Host installiert
  • Externes Docker-Netzwerk heißt traefik-public
  • Die Dienste wie uptime-kuma sind über Traefik erreichbar

CrowdSec vorbereiten

  • vi /etc/crowdsec/config.yaml
listen_uri: 0.0.0.0:8080
  • systemctl restart crowdsec
  • cscli bouncers add traefik-bouncer

→ Den Key kopieren

Bouncer-Konfiguration

  • mkdir -p /mnt/docker/traefik/bouncer
  • vi /mnt/docker/traefik/bouncer/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 ergänzen

Nur den neuen Dienst einfügen:

traefik-bouncer:
  image: crowdsecurity/cs-traefik-bouncer
  container_name: traefik-bouncer
  volumes:
    - ./bouncer/config.yml:/config.yml:ro
  ports:
    - "8081:8081"
  extra_hosts:
    - "host.docker.internal:host-gateway"
  restart: unless-stopped
  networks:
    - traefik-public

traefik bleibt unangetastet.

Middleware definieren

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

Middleware aktivieren für uptime-kuma

In der docker-compose.yaml von uptime-kuma ergänzen:

labels:
  - "traefik.enable=true"
  - "traefik.http.routers.uptime-kuma.rule=Host(`uptime-kuma.samogo.de`)"
  - "traefik.http.routers.uptime-kuma.entrypoints=websecure"
  - "traefik.http.routers.uptime-kuma.tls.certresolver=letsencrypt"
  - "traefik.http.routers.uptime-kuma.service=uptime-kuma"
  - "traefik.http.services.uptime-kuma.loadbalancer.server.port=3001"
  - "traefik.http.routers.uptime-kuma.middlewares=crowdsec-captcha@file"

→ Port 3001 ggf. anpassen

System starten

  • docker compose up -d

Testen

  • cscli decisions add --ip DEINE_IP --type captcha --duration 10m

→ CAPTCHA-Seite erscheint

Fazit

Diese Konfiguration ergänzt dein vorhandenes Setup um eine sichere, dynamische CAPTCHA-Funktion mit CrowdSec. Angreifer werden zuverlässig erkannt und gebremst – ohne legitime Nutzer dauerhaft auszuschließen.