Zum Inhalt springen

Projekt Phoenyx – Teil 7: Der Bodyguard (Crowdsec Deep Dive)

Kategorie: Core-Stack / Sicherheit | Lesezeit: ca. 15-20 Minuten

Einführung: Das Internet ist ein Schlachtfeld

Sobald du einen Server mit Port 80 oder 443 ins Internet stellst, dauert es keine 5 Minuten, bis die ersten Bots anklopfen. Sie suchen nach veralteten WordPress-Versionen, offenen Admin-Interfaces oder versuchen, Passwörter zu erraten (Brute Force).

Ein normaler Firewall-Schutz reicht hier nicht, denn diese Angriffe kommen über den ganz normalen Web-Traffic rein. Wir brauchen eine intelligente Analyse. Früher nutzte man dafür Fail2Ban. Heute nutzen wir Crowdsec.

Das Crowd-Prinzip (Waze für Server)

Crowdsec funktioniert ähnlich wie die Navigations-App Waze: Wenn ein Nutzer einen Stau (oder hier: einen Angriff) meldet, werden alle anderen gewarnt.

Wenn eine IP-Adresse meinen Server angreift, meldet mein Crowdsec dies an die zentrale Datenbank. Sobald genügend Meldungen vorliegen, landet diese IP auf einer globalen Blocklist. Dein Server profitiert also von den Angriffen auf tausende andere Server und blockiert Bösewichte, bevor sie dich überhaupt das erste Mal scannen.

Die Architektur: Gehirn und Muskel

Crowdsec trennt strikt zwischen Erkennung und Abwehr. Das macht es so flexibel.

1. Der Agent (LAPI) – Das Gehirn

Der Crowdsec-Container ist unser Detektiv. Er liest Logdateien (z.B. von Traefik) und analysiert sie in Echtzeit.

  • Parser: Verstehen das Log-Format („Ah, das ist ein Traefik-Log, hier ist die IP, da der Status-Code“).
  • Szenarien: Erkennen Muster („Diese IP hat 50x in 10 Sekunden eine nicht existierende Seite aufgerufen -> Das ist ein Web-Scanner!“).

Wenn ein Szenario zutrifft, trifft der Agent eine Entscheidung („Decision“): IP 1.2.3.4 wird für 4 Stunden gebannt.

2. Der Bouncer – Der Muskel

Der Agent selbst blockiert nichts. Er sagt nur „Das ist böse“. Für das Blockieren brauchen wir einen Bouncer. In unserem Fall ist das ein Plugin direkt in Traefik. Traefik fragt bei jeder Anfrage kurz beim Agenten nach: „Darf diese IP rein?“


Die Installation (crowdsec-docker-compose.yml)

Schauen wir uns unsere Konfiguration im Detail an:

services:
  crowdsec:
    image: crowdsecurity/crowdsec:v1.7.3
    container_name: crowdsec_lapi
    restart: always
    environment:
      # Wir sagen Crowdsec, welche Regel-Pakete es laden soll
      - COLLECTIONS=crowdsecurity/traefik crowdsecurity/http-cve
    networks:
      - crowdsec 
    volumes:
      # Konfiguration und Datenbank persistent speichern
      - /opt/containers/crowdsec/config:/etc/crowdsec
      - /opt/containers/crowdsec/data:/var/lib/crowdsec/data
      
      # WICHTIG: Zugriff auf die Logs der anderen Container!
      - /var/log/traefik:/var/log/traefik:ro
    healthcheck:
      test: ["CMD", "cscli", "lapi", "status"]

Wichtige Details:

  • COLLECTIONS: Hier laden wir fertige Intelligenz herunter. crowdsecurity/traefik bringt alles mit, um Traefik-Logs zu verstehen. http-cve erkennt Versuche, bekannte Sicherheitslücken auszunutzen.
  • Volumes (Logs): Crowdsec muss die Logs lesen können. Deshalb mounten wir /var/log/traefik in den Container. (Hinweis: Das setzt voraus, dass Traefik so konfiguriert ist, dass es Logs in eine Datei schreibt, nicht nur nach stdout).

Die Konfiguration: Traefik als Log-Schreiber

Damit Crowdsec etwas zu lesen hat, müssen wir Traefik sagen, dass es Logs schreiben soll. Ein Blick zurück in unsere traefik.yml:

accessLog:
  filePath: "/var/log/traefik/access.log"
  format: json
  bufferingSize: 50

Wir nutzen das JSON-Format, weil Crowdsec das extrem schnell und fehlerfrei parsen kann. Die bufferingSize sorgt dafür, dass die Festplatte nicht bei jedem einzelnen Request belastet wird.


Die Konfiguration: Traefik als Bouncer

Jetzt verbinden wir den Muskel. In der traefik-docker-compose.yml haben wir diese Labels gesetzt:

labels:
  - "traefik.http.middlewares.crowdsec.plugin.crowdsec.crowdsecLapiUrl=http://crowdsec_lapi:8080"
  - "traefik.http.middlewares.crowdsec.plugin.crowdsec.crowdsecLapiKey=${CROWDSEC_LAPI_KEY}"
  - "traefik.http.routers.traefik.middlewares=crowdsec"

Hier definieren wir eine Middleware namens crowdsec. Sie verbindet sich mit unserem Crowdsec-Container (LAPI).
Wichtig: Damit das funktioniert, müssen beide Container im selben Docker-Netzwerk (crowdsec) sein!

Den API-Key generieren

Du fragst dich sicher: „Woher bekomme ich den CROWDSEC_LAPI_KEY?“ Den müssen wir einmalig generieren.

1. Starte den Crowdsec-Container: docker compose up -d crowdsec
2. Gehe in den Container: docker exec -it crowdsec_lapi bash
3. Generiere den Key: cscli bouncers add traefik-bouncer

Den Key, den du erhältst, trägst du in deine .env Datei ein.


Crowdsec im Alltag: Wichtige Befehle

Crowdsec läuft im Hintergrund, aber manchmal willst du wissen, was passiert. Hier sind die wichtigsten Befehle für die Konsole (innerhalb des Containers):

1. Wer wurde gebannt?

cscli decisions list

Zeigt dir eine Liste aller aktuell blockierten IPs und den Grund (z.B. „http-crawl-non_statics“).

2. Wie ist die Lage?

cscli metrics

Zeigt dir Statistiken: Wie viele Logs wurden gelesen? Wie viele Angriffe erkannt?

3. Einen Freund entbannen

Du hast dich selbst ausgesperrt? Kein Problem:

cscli decisions delete --ip 1.2.3.4

Fazit & Ausblick

Mit Crowdsec haben wir eine aktive Verteidigungslinie. Unser Server „lernt“ aus Angriffen und schützt sich selbst.

Jetzt ist unsere Infrastruktur sicher und stabil. Im nächsten Teil kümmern wir uns um das Thema „Identität“. Wir installieren Authentik, damit wir uns nicht für jeden Dienst ein neues Passwort merken müssen.

Published inHowToNerdStuffTutorial

Sei der Erste der einen Kommentar abgibt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert