Crowdsec Traefik Bouncer: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 1: | Zeile 1: | ||
| − | =Traefik + CrowdSec + CAPTCHA absichern= | + | =Traefik + CrowdSec + CAPTCHA (HTTPS) absichern= |
| − | + | ||
| − | |||
| − | |||
| − | |||
| − | |||
==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 | ||
| − | == | + | ==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== | ==Bouncer in CrowdSec registrieren== | ||
| Zeile 19: | Zeile 22: | ||
*cscli bouncers add traefik-bouncer | *cscli bouncers add traefik-bouncer | ||
| − | → Key notieren und in config.yml | + | → 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: | + | 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- | + | ==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 | |
| − | + | 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 | *vi /mnt/docker/traefik/conf/middleware.yaml | ||
| Zeile 57: | Zeile 90: | ||
- X-Crowdsec-Captcha-Result | - X-Crowdsec-Captcha-Result | ||
| − | == | + | ==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`) | ||
| − | |||
entryPoints: | entryPoints: | ||
| − | - | + | - 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 | ||
| − | |||
| − | |||
middlewares: | middlewares: | ||
- crowdsec-captcha | - crowdsec-captcha | ||
| + | tls: | ||
| + | certResolver: myresolver | ||
| + | services: | ||
| + | uptime-kuma: | ||
| + | loadBalancer: | ||
| + | servers: | ||
| + | - url: "http://uptime-kuma:3001" | ||
</pre> | </pre> | ||
| − | == | + | ==System starten== |
| − | * | + | *docker compose up -d |
| − | |||
| − | |||
| − | |||
==Testen== | ==Testen== | ||
| − | *curl -s | + | *curl -s https://uptime-kuma.samogo.de/.env |
(Decision sollte CAPTCHA sein) | (Decision sollte CAPTCHA sein) | ||
| − | *Browser | + | *Browser öffnen → CAPTCHA-Seite wird angezeigt |
==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. | |
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.