Inhaltsverzeichnis
Snort – Promtail – Loki – Grafana: IDS/Log-Monitoring-Dokumentation
Ăśbersicht
Dieses Dokument beschreibt die Einrichtung und Funktionsweise einer containerisierten IDS-Umgebung bestehend aus: - Snort (Intrusion Detection System) - Promtail (Log Collector) - Loki (Log Storage & Query) - Grafana (Visualisierung) mit besonderem Fokus auf die Filterung legitimer Verbindungen (z. B. SSH) aus der IDS-Ausgabe und der korrekten Übergabe an Loki.
1. Snort – Intrusion Detection
Container-Konfiguration:
- snippet.yaml
snort: build: context: ./snort dockerfile: Dockerfile container_name: snort network_mode: host volumes: - ./snort/snort.conf:/etc/snort/snort.conf:ro - ./snort/rules:/etc/snort/rules - ./snort/logs:/var/log/snort restart: unless-stopped environment: - INTERFACE=enp0s31f6
Regeldatei (local.rules) mit Ausschluss vertrauenswĂĽrdiger Quellen und Ports:
- snippet.snort
ipvar TRUSTED_SRC [127.0.0.1, 192.168.178.0/24, 172.18.0.0/16] portvar TRUSTED_PORTS [22, 80, 443, 3000, 3100, 389] alert tcp !$TRUSTED_SRC any -> $HOME_NET !TRUSTED_PORTS (flags:S; msg:"[NMAP] TCP SYN Scan detected"; sid:1000002; rev:2;) ...
Diese Regeln erlauben es, Angriffe nur dann zu melden, wenn sie von nicht vertrauenswĂĽrdigen IPs oder zu nicht legitimierten Ports erfolgen.
2. Promtail – Log Collector
Container-Konfiguration:
- snippet.yaml
promtail: image: grafana/promtail:2.9.4 container_name: promtail volumes: - ./loki/config/promtail-config.yaml:/etc/promtail/config.yaml - ./snort/logs:/var/log/snort command: -config.file=/etc/promtail/config.yaml restart: unless-stopped networks: - docker_backend
Konfigurationsdatei promtail-config.yaml:
- snippet.yaml
server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: snort static_configs: - targets: - localhost labels: job: snort __path__: /var/log/snort/alert
3. Loki – Log Aggregator
Container-Konfiguration:
- snippet.yaml
loki: image: grafana/loki:2.9.4 container_name: loki ports: - "3100:3100" volumes: - ./loki/config/loki-config.yaml:/etc/loki/config.yaml - ./loki/data:/loki command: -config.file=/etc/loki/config.yaml restart: unless-stopped networks: - docker_backend
4. Grafana – Visualisierung
Container-Konfiguration:
- snippet.yaml
grafana: image: grafana/grafana container_name: grafana ports: - "3000:3000" volumes: - grafana-storage:/var/lib/grafana networks: - docker_backend - ldap-net labels: - "traefik.enable=true" - "traefik.http.routers.grafana.rule=Host(`grafana.example.local`)" - "traefik.http.routers.grafana.entrypoints=websecure" - "traefik.http.routers.grafana.tls.certresolver=le" - "traefik.http.services.grafana.loadbalancer.server.port=3000"
Beispiel-Query fĂĽr Zeitreihendiagramm (Panel 1):
- snippet.logql
count_over_time({filename="/var/log/snort/alert"} |= "ALERT" [1m])
Beispiel-Query fĂĽr Live Log Stream (Panel 2):
- snippet.logql
{filename="/var/log/snort/alert"}
5. Besonderheiten
- Filterung legitimer Verbindungen (z. B. SSH auf Port 22, HTTPS auf 443, interne Quellen) erfolgt direkt in den Regeln.
- Promtail & Loki ĂĽbernehmen den Rest der Verarbeitung ohne Inhalt zu interpretieren.
- Grafana nutzt Panel-Spezifische Queries für z. B. Live-Ansicht und Heatmaps.
- Alle Regeln sollten in einer dedizierten Datei wie
local.rulesgepflegt werden, damit Systemupdates keine Einträge überschreiben.
Lars WeiĂź 28.05.2025 13:43