Crowdsec Traefik Bouncer: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
=Traefik + CrowdSec + CAPTCHA absichern=
+
=Traefik + CrowdSec + CAPTCHA (HTTPS) absichern=
==Vorarbeiten==
+
 
;Ändern so das der Bouncer Container darauf zugreifen kann
 
*vi /etc/crowdsec/config.yaml
 
    listen_uri: 0.0.0.0:8080
 
*systemctl restart crowdsec
 
 
==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.
+
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.
 +
 
 +
==Voraussetzungen==
 +
 
 +
* Traefik läuft im Docker-Container mit aktiviertem HTTPS (Let's Encrypt)
 +
* CrowdSec ist auf dem Docker-Host installiert
 +
* Der cs-traefik-bouncer wird als Container betrieben
  
==Komponenten==
+
==Vorbereitungen auf dem Host==
  
* Traefik als Reverse Proxy
+
;CrowdSec-API für den Container erreichbar machen:
* CrowdSec mit aktiver Erkennung
+
*vi /etc/crowdsec/config.yaml
* cs-traefik-bouncer (als Docker-Container)
+
listen_uri: 0.0.0.0:8080
* Eine statische CAPTCHA-Webseite
+
 
 +
*systemctl restart crowdsec
  
 
==Bouncer in CrowdSec registrieren==
 
==Bouncer in CrowdSec registrieren==
Zeile 19: Zeile 22:
 
*cscli bouncers add traefik-bouncer
 
*cscli bouncers add traefik-bouncer
  
→ Key notieren und in config.yml bei crowdsec_lapi_key eintragen.
+
API-Key notieren und später in config.yml eintragen
  
==Konfiguration erstellen==
+
==Bouncer-Konfiguration erstellen==
  
 
*mkdir /mnt/docker/traefik/bouncer
 
*mkdir /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_DEN_API_KEY_EINFÜGEN
+
  crowdsec_lapi_key: HIER_API_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-Traefik erweitern==
+
==Docker-Setup==
  
 
*vi /mnt/docker/traefik/docker-compose.yaml
 
*vi /mnt/docker/traefik/docker-compose.yaml
 +
version: '3.8'
 +
 +
services:
 +
  traefik:
 +
    image: traefik
 +
    container_name: traefik
 +
    ports:
 +
      - "80:80"
 +
      - "443:443"
 +
    volumes:
 +
      - /var/run/docker.sock:/var/run/docker.sock
 +
      - ./conf:/conf
 +
      - ./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:
 
   traefik-bouncer:
    image: crowdsecurity/cs-traefik-bouncer
+
    image: crowdsecurity/cs-traefik-bouncer
    container_name: traefik-bouncer
+
    container_name: traefik-bouncer
    volumes:
+
    volumes:
      - ./bouncer/config.yml:/config.yml:ro
+
      - ./bouncer/config.yml:/config.yml:ro
    ports:
+
    ports:
      - "8081:8081"
+
      - "8081:8081"
    extra_hosts:
+
    extra_hosts:
      - "host.docker.internal:host-gateway"
+
      - "host.docker.internal:host-gateway"
    restart: unless-stopped
+
    networks:
 +
      - traefik
 +
 
 +
networks:
 +
  traefik:
  
==Traefik Middleware konfigurieren==
+
==Middleware für CAPTCHA==
  
 
*vi /mnt/docker/traefik/conf/middleware.yaml
 
*vi /mnt/docker/traefik/conf/middleware.yaml
Zeile 57: Zeile 90:
 
           - X-Crowdsec-Captcha-Result
 
           - X-Crowdsec-Captcha-Result
  
==Middleware verwenden==
+
==Router und Services definieren==
  
 
*vi /mnt/docker/traefik/conf/router.yaml
 
*vi /mnt/docker/traefik/conf/router.yaml
 
<pre>
 
<pre>
http:  
+
http:
 
   routers:
 
   routers:
     traefik:
+
     traefik-ui:
 
       rule: Host(`traefik.samogo.de`)
 
       rule: Host(`traefik.samogo.de`)
      service: traefik-ui
 
 
       entryPoints:
 
       entryPoints:
         - web
+
         - websecure
 +
      service: api@internal
 
       middlewares:
 
       middlewares:
 
         - crowdsec-captcha
 
         - crowdsec-captcha
 +
      tls:
 +
        certResolver: myresolver
  
 
     uptime-kuma:
 
     uptime-kuma:
 
       rule: Host(`uptime-kuma.samogo.de`)
 
       rule: Host(`uptime-kuma.samogo.de`)
 +
      entryPoints:
 +
        - websecure
 
       service: uptime-kuma
 
       service: uptime-kuma
      entryPoints:
 
        - web
 
 
       middlewares:
 
       middlewares:
 
         - crowdsec-captcha
 
         - crowdsec-captcha
 +
      tls:
 +
        certResolver: myresolver
  
 +
  services:
 +
    uptime-kuma:
 +
      loadBalancer:
 +
        servers:
 +
          - url: "http://uptime-kuma:3001"
 
</pre>
 
</pre>
  
==Funktion==
+
==System starten==
  
* CrowdSec erkennt Angreifer anhand der HTTP-Zugriffe
+
*docker compose up -d
* Statt sofort zu blockieren, wird eine CAPTCHA-Entscheidung gesetzt
 
* Der Traefik-Bouncer prüft dies und leitet auf die CAPTCHA-Seite um
 
* Nach erfolgreichem Aufruf wird die IP automatisch freigegeben
 
  
 
==Testen==
 
==Testen==
  
*curl -s http://example.com/.env
+
*curl -s https://uptime-kuma.samogo.de/.env
 
  (Decision sollte CAPTCHA sein)
 
  (Decision sollte CAPTCHA sein)
  
*Browser aufrufen → CAPTCHA-Seite wird angezeigt
+
*Browser öffnen → CAPTCHA-Seite wird angezeigt
  
 
==Fazit==
 
==Fazit==
Mit dem cs-traefik-bouncer lässt sich CrowdSec um ein intelligentes CAPTCHA-System erweitern. Angreifer können automatisiert ausgebremst werden, ohne legitime Nutzer dauerhaft zu sperren.
+
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.

Version vom 9. April 2025, 09:48 Uhr

Traefik + CrowdSec + CAPTCHA (HTTPS) absichern

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.

Voraussetzungen

  • Traefik läuft im Docker-Container mit aktiviertem HTTPS (Let's Encrypt)
  • 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
listen_uri: 0.0.0.0:8080
  • systemctl restart crowdsec

Bouncer in CrowdSec registrieren

  • cscli bouncers add traefik-bouncer

→ API-Key notieren und später in config.yml eintragen

Bouncer-Konfiguration erstellen

  • mkdir /mnt/docker/traefik/bouncer
  • vi /mnt/docker/traefik/bouncer/config.yml
listen_uri: 0.0.0.0:8081
crowdsec_lapi_key: HIER_API_KEY_EINFÜGEN
crowdsec_lapi_url: http://host.docker.internal:8080/
log_level: info
mode: captcha

Docker-Setup

  • vi /mnt/docker/traefik/docker-compose.yaml
version: '3.8'
services:
  traefik:
    image: traefik
    container_name: traefik
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./conf:/conf
      - ./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:

Middleware für CAPTCHA

  • 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

Router und Services definieren

  • vi /mnt/docker/traefik/conf/router.yaml
http:
  routers:
    traefik-ui:
      rule: Host(`traefik.samogo.de`)
      entryPoints:
        - websecure
      service: api@internal
      middlewares:
        - crowdsec-captcha
      tls:
        certResolver: myresolver

    uptime-kuma:
      rule: Host(`uptime-kuma.samogo.de`)
      entryPoints:
        - websecure
      service: uptime-kuma
      middlewares:
        - crowdsec-captcha
      tls:
        certResolver: myresolver

  services:
    uptime-kuma:
      loadBalancer:
        servers:
          - url: "http://uptime-kuma:3001"

System starten

  • docker compose up -d

Testen

(Decision sollte CAPTCHA sein)
  • Browser öffnen → CAPTCHA-Seite wird angezeigt

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.