Skip to main content

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 bis 22 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