Crowdsec-Einrichtung
Folgendes docker-compose file wurde zur Einrichtung des Crowdsec-Containers genutzt:
version: "3.8"
services:
crowdsec:
image: crowdsecurity/crowdsec:latest
container_name: crowdsec
restart: unless-stopped
networks:
traefik_proxy:
ipv4_address: 192.168.101.3
environment:
COLLECTIONS: >
crowdsecurity/traefik
crowdsecurity/appsec-virtual-patching
crowdsecurity/appsec-generic-rules
GID: "${GID-1000}"
TZ: Europe/Berlin
volumes:
- /opt/crowdsec/config:/etc/crowdsec
- /opt/crowdsec/data:/var/lib/crowdsec/data
- /opt/crowdsec/logs:/logs:ro
- /opt/traefik/logs:/var/log/traefik:ro
ports:
- 8080:8080 # API für Bouncer/Plugin
- 7422:7422 # API für AppSec
networks:
traefik_proxy:
external: true
Einrichtung Crowdsec-Bouncer in Traefik
Das folgende Docker-compose-file wurde für traefik genutzt:
version: '3.8'
services:
traefik:
image: traefik:latest
container_name: traefik
restart: always
command:
- --experimental.plugins.crowdsec-bouncer.moduleName=github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin
- --experimental.plugins.crowdsec-bouncer.version=v1.4.2
- --api.dashboard=true
- --api.insecure=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --providers.file.filename=/etc/traefik/dynamic.yml
- --providers.file.watch=true
- --log.level=DEBUG
- --log.filePath=/var/log/traefik/traefik.log
- --accesslog=true
- --accesslog.filePath=/var/log/traefik/access.log
- --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
- --certificatesresolvers.le.acme.email=service@petersen-it-services.de
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --entrypoints.web.http.redirections.entryPoint.to=websecure
- --entrypoints.web.http.redirections.entryPoint.scheme=https
- --entrypoints.web.http.redirections.entryPoint.permanent=true
ports:
- "80:80"
- "443:443"
networks:
traefik_proxy:
ipv4_address: 192.168.101.2
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /opt/letsencrypt:/letsencrypt
- /opt/traefik/dynamic.yml:/etc/traefik/dynamic.yml:ro
- /opt/traefik/logs:/var/log/traefik
environment:
- TZ=Europe/Berlin
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.rule=Host(`node01.immich.tpnxt.hostsysteme.de`)"
- "traefik.http.routers.traefik.entrypoints=websecure"
- "traefik.http.routers.traefik.service=api@internal"
- "traefik.http.routers.traefik.tls.certresolver=le"
- "traefik.http.routers.traefik.middlewares=crowdsec@file"
networks:
traefik_proxy:
external: true
volumes:
traefik_letsencrypt:
Der Traefik-Container nutzt das externe Plugin crowdsec-bouncer-traefik-plugin
, definiert in den Zeilen 9 bis 10. Des Weiteren wird in Zeile 50 die Crowdsec-Middleware definiert. Konfiguriert wird die Middleware über das dedizierte config-file /opt/traefik/dynamic.yml
. Eingestellt wird unter anderem die Verbindung zur lokalen Crowdsec-API, der Caching-Mode (crowdsecMode
), das Verhalten, falls der Appsec-Endpunkt des Crowdsec-Containers nicht erreichbar ist, sowie eine Whitelist erlaubter Reverse-Proxies.
http:
middlewares:
crowdsec:
plugin:
crowdsec-bouncer:
enabled: true
defaultDecisionSeconds: 60
crowdsecMode: stream
crowdsecAppsecEnabled: true
crowdsecAppsecHost: 192.168.101.3:7422
crowdsecAppsecFailureBlock: true
crowdsecAppsecUnreachableBlock: true
crowdsecLapiKey: <REDACTED>
crowdsecLapiHost: 192.168.101.3:8080
crowdsecLapiScheme: http
crowdsecLapiTLSInsecureVerify: false
TrustUpstream: true
forwardedHeadersTrustedIPs:
- 192.168.101.0/24
- 172.0.0.0/8
Auswertung der Traefik-Logs durch Crowdsec
In Zeilen 21 bis22 der Docker-Traefik-Konfiguration, wurde das Verzeichnis, wurde die Erstellung von Access-Logs unter dem Pfad /var/log/traefik/access.log
eingestellt. In Zeile 41 wird das Log-Verzeichnis /var/log/traefik
persistent unter /opt/traefik/logs
auf dem Docker-Host gespeichert.
Dieses persistente Verzeichnis wird in Zeile 22 der Docker-Crowdsec-Konfiguration als read-only unter /var/log/traefik
innerhalb des Cowdsec-Containers gemountet.
Zu konsumierende logs werden in /opt/crowdsec/config/acquis.yaml
definiert.
poll_without_inotify: false
filenames:
- /var/log/traefik/access.log
labels:
type: traefik