CTO Brief — MSP Edition

Diagnostik die weiß,
worauf sie sich verlässt

TicketFlow gibt deinen Junior-Technikern den Blick eines erfahrenen Senior. Sentinel stellt sicher, dass das Bild, das TicketFlow zeigt, nicht auf veralteten oder verfälschten Daten basiert. Zusammen schließen sie die Lücke zwischen “wir haben ein Ticket” und “wir kennen den Sachverhalt wirklich”.

TicketFlow Python / FastAPI / Reaktiv Sentinel Node.js / CloudEvents 1.0 / SQLite WAL Protokoll CloudEvents 1.0 über HTTPS Datenschutz end_customer_id als Korrektheitsscooping

Das Problem jedes wachsenden MSP

Techniker öffnen ein Ticket. Sie sehen Symptom, nicht Ursache. Die relevante Information liegt verteilt in RMM, PSA, CMDB, Monitoring — und keiner hat Zeit, alles zusammenzusuchen.

🔍

Informationslücke

Ein Junior-Techniker sieht im RMM was der Senior auch sieht — aber er weiß nicht, was er priorisieren soll. Das Wissen sitzt bei wenigen Personen, nicht im System.

📊

Datenprovenienz-Blindheit

Keine KI-gestützte Diagnose benennt, ob die Daten im CMDB noch stimmen. Eine Netzwerkkarte taucht als „online" auf, obwohl seit zwei Stunden VLAN-Drift vorliegt.

Anchoring-Effekt

KI-Werkzeuge, die eine Antwort “hinknallen”, erzeugen Anchoring: Der Techniker prüft die erste Hypothese — nicht die trennschärfste. Fehlerdiagnosen werden schneller, nicht besser.

🏢

Cross-Tenant-Kontamination

Ohne explizites Mandanten-Scoping korreliert das System Ereignisse zweier Kunden miteinander. Kausal falsch — und ein Datenschutzrisiko, das regulatorisch relevant wird.

Zwei Schichten, die sich ergänzen

TicketFlow ist der Diagnose-Assistent. Sentinel ist die Daten-Integritätsschicht. Keines der beiden Systeme ist ohne das andere vollständig.

Quellsysteme
RMM · CMDB · IPAM
NinjaOne · Firewall
Sentinel
Drift · Integrität
Cluster · Provenienz
Kontinuierliches Monitoring
der Quelldaten-Qualität
TicketFlow
ACH · Hypothesen
Beobachtungen
Reaktive Diagnose
je Ticket-Eingang
Techniker
Vollbild · Urteil
Entscheid
Mensch entscheidet
immer

Sentinel überwacht kontinuierlich — TicketFlow arbeitet reaktiv auf Ticket-Eingang. Sentinel-Observations fließen als stark typisierte Provenienz-Objekte in TicketFlow ein.

Was jedes System allein kann

Dimension TicketFlow Sentinel
Primärfunktion Reaktive Diagnose-Unterstützung auf Ticket-Eingang — zeigt Junior-Technikern das vollständige Bild, das ein Senior in der verfügbaren Zeit zusammensuchen würde. Kontinuierliche Überwachung der Quelldaten-Integrität — erkennt, wenn CMDB, RMM oder IPAM in den Minuten/Stunden eines offenen Tickets von der Realität abweichen.
Entscheidungsmodell Kein Urteil, kein Ranking. ACH-Matrix zeigt Trennschärfe — der Mensch entscheidet. Anti-Anchoring (Schutz vor kognitiver Fixierung auf die erste Hypothese) ist architekturell, nicht kosmetisch. Binäre Verdikt-Klassen: CLEAN · DRIFT_MINOR · DRIFT_CRITICAL · CONTAMINATION · INTEGRITY_VIOLATION · INCONCLUSIVE. Maschine bewertet Datenqualität, kein Geschäftsprozess.
Zeitmodell Einmalig beim Ticket-Eingang, optional volatile Daten-Refresh beim Öffnen. Snapshot-getrieben. Kontinuierliches Background-Snapshotting (alle 5 min, asset-unabhängig von Jobs). Beim Ticket-Eingang: Rückblick in die Asset-Timeline bis ticket_opened_at — Sentinel sieht den Drift, der den Vorfall verursacht haben könnte, bevor TicketFlow die Analyse angefordert hat. Zusätzlich: Drift-Watch (30s-Polling) während laufender Analyse.
Mandanten-Scoping end_customer_id als Korrektheitsgrenze: Korrelation ausschließlich innerhalb eines Kunden (kausal, nicht nur als Datenschutz-Maßnahme). end_customer_id auf jedem emittierten CloudEvent — Drift-Events, Cluster-Events und Verdikten tragen immer den Kunden-Scope.
Provenienz-Modell Jede Observation trägt source_system, source_strength (strong / medium / weak), observed_at, fetched_at. Herkunft (Provenienz) beim ACH-Scoren maskiert — verhindert Anchoring. Jede Quelldaten-Differenz trägt Quelle, Schwere (CRITICAL/MINOR), Zeitstempel. source_strength: CMDB/RMM/IPAM/NinjaOne = strong, Firewall = medium.
Was das System ohne das andere nicht kann Kann nicht erkennen, ob die Daten aus dem CMDB, die eine Hypothese “stützen”, noch aktuell sind. Würde mit veralteten Daten volle Konfidenz signalisieren. Kann nicht erkennen, ob ein Drift kausal zu einem offenen Ticket gehört. Gibt keine Hypothesen, kein ACH, keinen Kontext aus Alttickets oder Dokumentation.

Was die Kombination ermöglicht — Leistungen, die kein System allein erbringt

Synergie

Konfidenz-kalibrierte Diagnose

Sentinel meldet: „CMDB-Daten für Kunde X haben seit 47 Minuten VLAN-Drift." TicketFlow vergewichtet die entsprechenden Observations als MEDIUM statt STRONG — die ACH-Matrix spiegelt die echte Evidenzlage.

Synergie

Cluster-Eskalation

Driften gleichzeitig 3 Assets desselben Kunden auf demselben VLAN, erkennt Sentinel ein Netzwerksegment-Cluster. TicketFlow sieht dieses Signal als eigenständige Hypothesen-Quelle — „Infrastruktur-Incident, nicht Endgerät".

Synergie

Kontaminations-Erkennung

Sentinel erkennt, wenn ein Feldwert im Analyse-Lineage (Herkunftspfad aller Diagnosedaten von der Quelle bis zur Hypothese) zu einem anderen Asset gehört (cross_asset_contamination). TicketFlow-Hypothesen, die auf diesem Wert basieren, werden als kausal verdächtig markiert.

Synergie

Strukturelle Datenpflicht

Das System erzwingt, dass keine Diagnose ohne Provenienz-Angabe möglich ist. Nicht als UI-Hinweis, sondern als Pflichtfeld im Datenmodell. Schlechte Quelldaten führen zu INCONCLUSIVE — nicht zu falscher Konfidenz.

Synergie

Auditierbarkeit

Jede Diagnose-Entscheidung ist auf Feldebene rückverfolgbar: Welche Quelldaten, von welchem System, zu welchem Zeitpunkt, mit welcher Integrität — für Compliance, Post-Mortems und Kundennachweise.

Synergie

Zeitfenster-Überwindung: Pre-Ticket-Drift

TicketFlow analysiert einen Vorfall, der in der Vergangenheit lag. Der relevante Drift — „seit zwei Stunden VLAN-Drift" — passierte vor dem Ticket, nicht während der Analyse. Sentinels kontinuierliche Asset-Timeline ermöglicht den Rückblick: Beim Eingang von tf.analysis.started mit ticket_opened_at liefert Sentinel sofort den pre_ticket_drift — das vollständige Bild dessen, was sich seit Ticketöffnung in der Infrastruktur verändert hat. Das ist nur möglich, weil Sentinel außerhalb von TicketFlow kontinuierlich beobachtet, ohne auf einen Job-Trigger zu warten.

Synergie

Fingerprint-basiertes Pattern-Matching

Sentinel speichert vendor/product/role/version per Job als Fingerprint. TicketFlow nutzt diese Signatur für Pattern-Matching: Ähnliche Incidents auf identischen Stacks werden trennscharf gekennzeichnet — ohne false Confidence durch Softwareversion-Abweichung.

Warum die externe Instanz entscheidend ist Sentinel überwacht TicketFlow — es ist bewusst außerhalb des Systems positioniert, das es prüft. Ein interner Check würde dieselben Quelldaten nutzen, denselben kognitiven Verzerrungen unterliegen und im Fehlerfall gemeinsam mit dem überwachten System ausfallen. Sentinel hat keine Meinung über Hypothesen, kein Interesse am Analyseergebnis und keinen Zugriff auf die ACH-Matrix. Es beobachtet nur Quelldaten — kontinuierlich, unabhängig, asynchron. Das ist die einzige Architektur, die Anti-Anchoring nicht nur für den Techniker, sondern auch für die Datengrundlage selbst gewährleistet: Ein System, das seine eigenen Daten validiert, ist keine Prüfinstanz.

Sentinel-Verdikt-Klassen und ihre Bedeutung für TicketFlow

CLEAN DRIFT_MINOR DRIFT_CRITICAL CONTAMINATION INTEGRITY_VIOLATION DRIFT + INTEGRITY INCONCLUSIVE
Sentinel-Verdikt Bedeutung TicketFlow-Konsequenz
CLEAN Alle Quellen stabil, keine Abweichung seit Ticket-Eingang. Observations mit voller source_strength → hohe ACH-Konfidenz möglich.
DRIFT_MINOR Nicht-kritische Felder geändert (z. B. owner, location). Betroffene Observations mit MEDIUM source_strength. Ursachenhypothesen bleiben möglich.
DRIFT_CRITICAL Kritische Felder geändert (ip, vlan, firewall_zone, subnet). Netzwerk-Observations als WEAK eingestuft. Techniker wird auf Stale-Data-Risiko hingewiesen.
CONTAMINATION Feldwert gehört kausal zu einem anderen Asset. Betroffene Lineage-Einträge werden als Hypothesen-Generator degradiert, nicht als Evidenz.
INTEGRITY_VIOLATION Wert existiert in keinem bekannten Asset-Snapshot (Phantom-Wert). Betroffene Lineage wird aus ACH-Evidenzmasse entfernt. Offene Frage im „Was würde es klären"-Block.
INCONCLUSIVE Quelldaten-Qualität nicht bewertbar (Circuit Breaker, keine Daten). TicketFlow markiert Observations aus dieser Quelle explizit als unverified. Techniker muss manuell prüfen.

Architektur-Optionen für maximale Datensouveränität

Beide Systeme sind von Grund auf für MSP-Betrieb ausgelegt: kein Cloud-Vendor-Lock-in, keine Daten in fremde Hände. Die folgenden vier Deployment-Topologien decken alle Compliance- und Risikoklassen ab.

Prinzip Mandanten-Scoping in TicketFlow/Sentinel ist eine Korrektheitsentscheidung, keine primäre Sicherheitsmaßnahme. Der MSP hat ohnehin Zugriff auf alle Kundendaten. Die Grenze verhindert, dass Ereignisse von Kunde A fälschlicherweise mit Tickets von Kunde B korreliert werden — was kausal schlicht falsch wäre. Datenschutz ist eine willkommene Konsequenz, nicht das Designziel.
1

Full On-Premise — MSP-eigenes Rechenzentrum

Alle Daten, alle Komponenten im eigenen Haus. Keine Cloud-Abhängigkeit.

Empfehlung: Einstieg

Sentinel und TicketFlow laufen auf MSP-eigener Hardware oder im selbst verwalteten Hypervisor (Proxmox, ESXi). Quellsysteme (NinjaOne, ConnectWise, IT-Glue) sind SaaS — ihre Daten verlassen das MSP-Netz nur über interne API-Calls und werden lokal in SQLite (Sentinel) und PostgreSQL/TimescaleDB (TicketFlow) gespeichert. Kein Kundendatenstrom geht an Dritte.

LLM-Inference für TicketFlow: entweder lokal (Ollama + Llama 3.1 / Qwen 2.5 auf dedizierter Hardware) oder über API mit explizitem Daten-Verarbeitungsvertrag (DPA) mit dem LLM-Anbieter. Anonymisierungs-Gateway (§12 TicketFlow-Konzept) filtert PII und Kundenkennzeichen vor Weiterleitung.

  • Maximale Datensouveränität
  • Volle Kontrolle über Retention & Löschung
  • DSGVO-Artikel 28/32 mit einem einzigen DPA (eigenes Haus)
  • Keine monatlichen Cloud-Kosten
  • Funktioniert air-gapped (ohne Internet-LLM)
  • Hardware-Investition für LLM-Inference
  • Update-Management liegt beim MSP
  • Backup/HA in eigener Verantwortung

Datenfluss: NinjaOne/CMDB/PSA → Sentinel API (Port 3009, intern) → CloudEvents → TicketFlow API (intern) → PostgreSQL (intern). LLM-Calls: internes Ollama oder externe API über Anonymisierungs-Gateway.

2

Private Cloud mit Mandanten-Namespace-Isolation

MSP-managed Kubernetes, ein Namespace pro End-Kunde. Skalierbar.

Empfehlung: Wachstum

Der MSP betreibt einen Kubernetes-Cluster (Hetzner Dedicated, OVH, eigene Bare-Metal-Nodes — kein US-Hyperscaler ohne EU-DPA). Für jeden End-Kunden wird ein eigener Namespace mit dedizierter Sentinel-Instanz und eigenem Datenbankschema angelegt.

TicketFlow-Core läuft mandantenübergreifend (Pattern-Store ist bewusst de-identifiziert). Connector-Instanzen sind pro End-Kunde konfiguriert, Secrets in HashiCorp Vault (MSP-betrieben). Network Policies verhindern Namespace-Cross-Traffic auf Netzwerkebene.

  • Strikte Datenisolation auf Namespace-Ebene
  • Ein Sentinel pro Kunde — Drift-Detection isoliert
  • Horizontale Skalierung ohne Architektur-Änderung
  • Zentrale Observability (Prometheus/Grafana über alle Namespaces)
  • Daten verlassen nie EU-Region
  • Kubernetes-Betriebskompetenz erforderlich
  • Initialer Setup-Aufwand pro Mandant (~2h)
  • Vault-Betrieb als eigene Aufgabe

Datenisolation: DB_PATH=/var/sentinel/<customer_id>/sentinel.db pro Instanz. end_customer_id auf jedem CloudEvent als Routing-Key. Kubernetes NetworkPolicy blockiert Namespace-Cross-Traffic.

3

Hybrid — MSP-Cloud mit Kunden-Datenresidenz

Für Kunden mit Compliance-Vorgaben (DSGVO, ISO 27001, BSI C5).

Für regulierte Kunden

Kunden mit strikten Datenresidenz-Anforderungen (z. B. Behörden, Kliniken, Finanzdienstleister) erhalten eine dedizierte Sentinel-Instanz in ihrer eigenen Region oder sogar On-Premise beim Kunden. TicketFlow-Analyselogik läuft im MSP-Rechenzentrum — nur aggregierte, de-identifizierte Observations werden übertragen.

Sentinel läuft als systemd-Service beim Kunden (oder in dessen privater Cloud). Eingehende Quell-Daten verlassen die Kunden-Infrastruktur nicht. Sentinel sendet ausschließlich normalisierte Observations (keine Rohdaten) via verschlüsseltem CloudEvent-Webhook an TicketFlow.

  • Rohdaten verlassen Kunden-Infrastruktur nie
  • Geeignet für BSI-C5, ISO 27001, DSGVO Art. 46
  • TicketFlow-LLM-Calls können vollständig anonymisiert sein
  • Sentinel-Betrieb beim Kunden als MSP-Service verrechenbar
  • Netzwerk-Konnektivität Kunde ↔ MSP erforderlich (VPN/mTLS)
  • Update-Rollout auf Kunden-Systeme
  • Höhere Latenz für Drift-Events (tolerierbar bei 30s-Polling)

Datenfluss: Quellsysteme → Sentinel@Kunde (nur Observations emittiert) → VPN/mTLS → TicketFlow@MSP. Rohdaten: niemals außerhalb Kunden-Infrastruktur.

4

Air-Gapped / Hochsicherheitsumgebung

Für kritische Infrastruktur ohne Außenverbindung.

Höchste Sicherheit

Vollständig offline: Sentinel läuft lokal, TicketFlow-Core lokal. Kein Webhook nach außen. Diagnose-Reports werden manuell oder über einen Daten-Dioden-Transfer in die MSP-Plattform überführt. LLM-Inference ausschließlich lokal (Ollama).

Sentinel-Verdikt und Observations werden in lokale SQLite-DB geschrieben und über einen signierten Export-Job (täglich/auf Abruf) an das MSP-Ticket-System übermittelt. Keine Echtzeitverbindung.

  • Zero Trust — keine Netzverbindung zur Außenwelt
  • Für KRITIS-Betreiber, Behörden, Verteidigung geeignet
  • Alle Sentinel-Verdikts- und Observations-Daten lokal
  • Kein Echtzeit-Cluster-Alert (nur batch)
  • Lokale LLM-Inference: leistungsstarke Hardware nötig
  • Manueller Update-Prozess
DSGVO-Compliance-Kurzüberblick Beide Systeme speichern keine personenbezogenen Daten, die über das hinausgehen, was in den Quellsystemen (RMM/PSA) ohnehin vorhanden ist. end_customer_id ist ein internes Scoping-Attribut, kein personenbezogenes Datum im DSGVO-Sinne. Authentifizierung über Bearer-Token (SENTINEL_AUTH_TOKEN). Rate Limiting eingebaut. Keine Telemetrie an Dritte. TLS für alle Webhooks obligatorisch.

Deployment-Guide

Voraussetzungen: Linux-Server (Debian 12 / Ubuntu 22.04), Node.js 20+, Python 3.11+. Sentinel läuft als systemd-Service, TicketFlow als separater Service oder Container.

Phase 1 — Sentinel aufsetzen

1

Repository klonen und Abhängigkeiten installieren

Sentinel läuft als eigenständiger Node.js-Dienst. Kein Build-Schritt notwendig — reines ESM.

git clone https://forgejo.kurvenschule.cloud/andre/ticketflow-sentinel cd ticketflow-sentinel npm install --production
2

Konfiguration: .env anlegen

Kopiere die Vorlage und fülle alle Pflichtfelder. MOCK_SOURCES=true darf in Produktion niemals gesetzt sein.

cp .env.example .env # Pflichtfelder: SENTINEL_AUTH_TOKEN=<sicheres-token-min-32-zeichen> DB_PATH=/var/sentinel/sentinel.db TICKETFLOW_VERDICT_URL=https://<ticketflow-host>/api/sentinel/verdict TICKETFLOW_EVENTS_URL=https://<ticketflow-host>/api/sentinel/events # Quellsysteme: CMDB_URL=https://cmdb.intern.msp.de CMDB_TOKEN=<readonly-token> RMM_URL=https://rmm.intern.msp.de RMM_TOKEN=<readonly-token> IPAM_URL=https://ipam.intern.msp.de IPAM_TOKEN=<readonly-token> # Optional NinjaOne OAuth2: NINJARMM_URL=https://eu.ninjarmm.com NINJARMM_CLIENT_ID=<client-id> NINJARMM_CLIENT_SECRET=<client-secret>
3

Systemd-Unit anlegen und starten

Erstelle /etc/systemd/system/sentinel.service — Service läuft unter eigenem User ohne root-Rechte.

[Unit] Description=ticketflow-sentinel After=network.target [Service] Type=simple User=sentinel WorkingDirectory=/opt/ticketflow-sentinel EnvironmentFile=/opt/ticketflow-sentinel/.env ExecStart=/usr/bin/node src/server.js Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target useradd -r -s /bin/false sentinel chown -R sentinel:sentinel /opt/ticketflow-sentinel systemctl daemon-reload systemctl enable --now sentinel systemctl status sentinel
4

Health-Check verifizieren

Sentinel exponiert GET /health (offen, kein Auth) und GET /metrics für Prometheus.

curl https://sentinel.intern.msp.de/health # Erwartet: # {"status":"ok","active_jobs":0,"circuit_breakers":{},"uptime_s":12}

Phase 2 — TicketFlow aufsetzen

5

TicketFlow installieren und konfigurieren

Python 3.11+, FastAPI, PostgreSQL/TimescaleDB als Event-Store. Detaillierte Anleitung im TicketFlow-Repo.

cd /opt/ticketflow python3 -m venv .venv && source .venv/bin/activate pip install -r requirements.txt # Sentinel-Integration in TicketFlow-Config: SENTINEL_WEBHOOK_SECRET=<selber-token-wie-SENTINEL_AUTH_TOKEN> SENTINEL_EVENTS_URL=https://sentinel.intern.msp.de/events
6

CloudEvent-Handshake testen

Schicke ein Test-Analyse-Event an Sentinel und prüfe, ob das Verdikt bei TicketFlow ankommt.

curl -X POST https://sentinel.intern.msp.de/events \ -H "Authorization: Bearer <SENTINEL_AUTH_TOKEN>" \ -H "Content-Type: application/cloudevents+json" \ -d '{ "specversion": "1.0", "type": "tf.analysis.started", "id": "test-job-001", "data": { "asset_id": "PC-TESTGERÄT", "end_customer_id": "kunde-001", "snapshot": {"ip": "10.10.1.50", "vlan": "VLAN-10"} } }' # Erwartet: {"accepted":true,"jobId":"test-job-001"}

Phase 3 — Monitoring & Betrieb

7

Prometheus-Metriken anbinden

Sentinel exponiert GET /metrics im Prometheus-Format. Empfohlene Alert-Rules:

# prometheus.yml scrape config: - job_name: sentinel static_configs: - targets: ['sentinel.intern.msp.de:3009'] # Empfohlene Alert-Rules: # - sentinel_circuit_breaker_state{source="CMDB"} == 1 → CMDB Circuit OPEN # - sentinel_active_jobs_tracked > 100 → Zu viele offene Jobs # - rate(sentinel_drift_events_total[5m]) > 10 → Drift-Sturmrate erhöht
8

Retention-Cron einrichten

Sentinel bereinigt Snapshots alter abgeschlossener Jobs automatisch. Empfehlung: täglicher Cron-Job.

# /etc/cron.d/sentinel-prune 0 3 * * * sentinel curl -s -X POST \ https://sentinel.intern.msp.de/admin/prune \ -H "Authorization: Bearer <SENTINEL_AUTH_TOKEN>" \ -d '{"days_old":30}'

Connector-Matrix: RMM, PSA, CMDB & Co.

Sentinel kommuniziert ausschließlich lesend mit Quellsystemen. TicketFlow liest und kann optional über den PSA-Write-Back-Connector Kommentare schreiben — keine automatische Remediation.

System Typ Sentinel-Integration TicketFlow-Integration Richtung
NinjaOne RMM OAuth2 Client Credentials (NINJARMM_URL / CLIENT_ID / CLIENT_SECRET). Normalisierung auf Asset-Schema inkl. vendor/product/role/os. Pull-Inventory (Assets, Dependencies), Pull-Events (Alerts, IPS-Updates), Query (Live-Ist-Daten). Read
ConnectWise Manage PSA Webhook-Trigger bei Ticket-Eingang. Pull-Ticket inkl. Verlauf. Write-Back als Kommentar (Diagnose-Zusammenfassung). Webhook Read Write
Autotask / HaloPSA PSA Analog ConnectWise. PSA-Connector ist austauschbares Plug-in (Interface-basiert, kein Kern-Code-Änderung). Webhook Read Write
ServiceNow PSA / CMDB CMDB: REST-API, Asset-Daten (ip, vlan, location). Token-Auth. PSA: vollständige bi-direktionale Integration (Port aus Keep ServiceNow-Provider). CMDB: Asset-Graph-Quelle. Read Write
IT-Glue Doku Search + Fetch pro End-Kunde (strikt isoliert). Netzpläne, Kunden-Runbooks als Kontext-Quelle. Read
Notion (MSP-intern) Doku MSP-eigene Prozess-Runbooks. Mandantenübergreifend lesbar (geistiges Eigentum des MSP). Read
Sophos Central / M365 Monitoring Events + Live-Query (Threat-Events, Token-Refresh, Conditional-Access-Logs). source_strength: strong. Read
Generisches CMDB CMDB REST-Endpoint /api/asset/{id} mit Bearer-Token (CMDB_URL + CMDB_TOKEN). Retry-Backoff, Circuit Breaker. Asset-Graph-Quelle (Inventar, Abhängigkeitskanten). Read
Generisches IPAM IPAM REST-Endpoint inkl. Subnet-Nachbarn (/api/ipam/neighbors/). Für Kontaminations-Erkennung. Topologie-Daten für Netz-Hypothesen. Read

Schritt-für-Schritt: NinjaOne verbinden

1

OAuth2-App in NinjaOne anlegen

Administration → Apps → Client App anlegen. Grant Type: Client Credentials. Scope: monitoring. Notiere Client ID und Secret.

2

ENVs in Sentinel setzen

NINJARMM_URL=https://eu.ninjarmm.com NINJARMM_CLIENT_ID=<deine-client-id> NINJARMM_CLIENT_SECRET=<dein-client-secret>

Sentinel holt automatisch einen Token (OAuth2 Client Credentials), cached ihn mit Refresh vor Ablauf und fährt bei 401 sofort neu auf. Circuit Breaker bei 3 Fehlern → 60s cooldown.

3

Verbindung testen

curl https://sentinel.intern.msp.de/health # circuit_breakers.NINJARMM.state sollte "CLOSED" sein nach erstem Job

Schritt-für-Schritt: PSA-Webhook konfigurieren (ConnectWise als Beispiel)

1

TicketFlow-Webhook-Endpoint freigeben

TicketFlow exponiert POST /api/webhooks/psa. Der Endpoint validiert die PSA-Signatur und emittiert intern ein tf.analysis.started-CloudEvent.

2

In ConnectWise: Webhook-Callback eintragen

System → Callbacks → New. Event: Ticket Created. URL: https://ticketflow.intern.msp.de/api/webhooks/psa. Secret: in TicketFlow-Config hinterlegen.

3

Mandanten-Zuordnung konfigurieren

TicketFlow löst den PSA-Company-Record auf die interne end_customer_id auf. Das Mapping liegt in der Connector-Config (JSON oder DB-Tabelle). Ohne Mapping: Job ohne Kunden-Scope — Korrelation wird mandantenübergreifend und damit fehlerhaft.

{ "connectwise_company_id": "KUNDE-ABC-42", "end_customer_id": "eci-msp-kunde-abc", "sentinel_instance": "https://sentinel-abc.intern.msp.de" }
4

Write-Back-Berechtigung vergeben (optional)

Für automatischen Diagnose-Kommentar im Ticket: PSA-API-Key mit Schreibrecht auf Tickets anlegen. TicketFlow schreibt nur Kommentare — keine Ticket-Status-Änderungen, keine automatische Zuweisung. Das Urteil trifft der Techniker.

End-to-End-Flow: Ticket kommt an

T+0s PSA-Webhook → TicketFlow: Ticket-Eingang, Entitätsauflösung (Asset-ID, End-Kunden-ID) T+0s TicketFlow sendet tf.analysis.started an Sentinel mit asset_id, end_customer_id, ticket_opened_at T+1s Sentinel: Pre-Ticket-Drift-LookupgetTimelineStateAt(asset, ticket_opened_at) vs. jetzt. Drift, der vor dem Ticket entstand, ist sofort sichtbar. T+1s Sentinel: Pre-Flight-Snapshot von CMDB / RMM / IPAM / NinjaOne. Aktueller Basis-Zustand gesichert. T+1s Sentinel: Drift-Watch startet (30s-Polling). Nachbar-Assets für Kontaminations-Referenz geladen. T+1—N TicketFlow: ACH-Matrix aufgebaut. Hypothesen aus Asset-Graph, Alttickets, Doku, Monitoring. Beobachtungen gesammelt. T+30s+ Sentinel: bei Drift → tf.sentinel.drift.detected an TicketFlow. Betroffene Observations werden source_strength-degradiert. Cluster Bei ≥2 Assets gleicher VLAN/Subnet-Drift in 5min → tf.sentinel.cluster.detected. TicketFlow ergänzt Infrastruktur-Incident-Hypothese. Schluss TicketFlow sendet tf.analysis.concluded → Sentinel liefert finales Verdikt. Drift-Watch stoppt. Output Techniker sieht: ACH-Matrix mit Trennschärfe, Drift-Chronologie, Verdikt-Badge, offene Fragen — kein Urteil, nur vollständiges Bild.
Wichtiger Betriebshinweis Sentinel benötigt für jeden End-Kunden eine eigene Instanz oder zumindest separate DB_PATH. Mandantenübergreifend gemeinsam genutzte Sentinel-Instanzen mit nur einem DB-Pfad sind möglich, aber end_customer_id-Isolation liegt dann ausschließlich in der Anwendungslogik — keine Daten-Layer-Isolation. Für regulierte Kunden: eigene Instanz (Deployment-Option 2 oder 3).

Audit Store — sichere, menschenlesbare Diagnose-Protokolle

Jede abgeschlossene Sentinel-Analyse erzeugt automatisch ein Markdown-Dokument: das vollständige Diagnose-Protokoll des Tickets — Verdikt, Drift-Chronologie, Integritätsbefunde, Asset-Fingerprint. Gespeichert in einem Git-Repository beim MSP. Manipulationssicher durch die kryptographische Hash-Kette von Git.

Bereits implementiert in Sentinel Das Audit Store-Modul (src/audit-store.js) ist ab Commit 1871c27 Teil von Sentinel. Zwei ENV-Variablen genügen zur Aktivierung — kein separater Dienst, keine Datenbank.

Warum Markdown + Git?

📖

Menschenlesbar ohne Werkzeug

Kein proprietäres Format, kein Viewer nötig. Jeder Editor, jede IDE, jeder Browser öffnet die Datei. Für Post-Mortems, Kundennachweise und Behördenanfragen sofort nutzbar.

🔐

Manipulationssicher durch Hash-Kette

Jeder Git-Commit enthält den SHA-256-Hash des Vorgängers. Eine nachträgliche Änderung an einem Diagnose-Protokoll bricht die gesamte Hash-Kette ab diesem Punkt — ohne spezielle Software erkennbar.

🏠

Daten bleiben beim MSP

Das Audit-Git-Repo liegt auf MSP-eigener Infrastruktur. Kein Cloud-Dienst, kein Dritter. Das Repo kann auf Kunden-Namespaces aufgeteilt werden — ein Repo pro End-Kunde für maximale Isolation.

🔍

Git als Audit-Log

Git-History ist ein nativer, unveränderlicher Zeitstempel-Log mit Autor, Zeitpunkt und Inhalt. git log --author sentinel liefert die vollständige Diagnose-Chronologie eines Kunden.

Verzeichnisstruktur

audit-store/ ← git init hier kunde-abc/ 2026-06/ tf-job-001.md ← CLEAN · 2026-06-10 tf-job-002.md ← DRIFT_CRITICAL · 2026-06-10 kunde-xyz/ 2026-06/ tf-job-003.md ← INCONCLUSIVE · 2026-06-10 unknown/ 2026-06/ tf-job-004.md ← ohne end_customer_id

Beispiel: Diagnose-Protokoll (Markdown-Ausgabe)

# Sentinel Audit Report **Job-ID:** `tf-job-001` **Asset:** `SRV-PROD-07` **Kunde:** `kunde-abc` **Analyse gestartet:** 2026-06-10 10:00:15 UTC **Bericht erstellt:** 2026-06-10 10:01:03 UTC **Analyse-Latenz:** 47.8 s --- ## Verdikt: DRIFT_CRITICAL | Eigenschaft | Wert | |----------------|------------------| | Aktion | `REANALYZE` | | Drift-Status | `DRIFT_CRITICAL` | | Analyse-Modus | `manifest` | | Konfidenz | `HIGH` | | Schwere-Score | 8 | --- ## Drift-Ereignisse | Zeitpunkt | Quelle | Feld | Alt | Neu | Schwere | |----------------------|--------|--------|-----------|-----------|----------| | 2026-06-10 10:00:52 UTC | CMDB | `vlan` | `VLAN-10` | `VLAN-20` | **CRITICAL** | --- ## Asset-Fingerprint | Eigenschaft | Wert | |-------------|---------------| | `vendor` | `cisco` | | `product` | `catalyst` | | `role` | `core-switch` | | `version` | `16.12.4` |

Einrichtung in 3 Schritten

1

Audit-Git-Repo anlegen

Ein leeres Git-Repository an einem gesicherten Ort (eigener Server, NAS, verschlüsseltes Volume). Pro End-Kunde ein eigenes Repo für maximale Isolation — oder ein gemeinsames Repo mit Kunden-Unterordnern.

mkdir /var/sentinel/audit-store && cd /var/sentinel/audit-store git init git config user.name "sentinel" git config user.email "sentinel@local"
2

ENVs in Sentinel setzen

AUDIT_STORE_GIT_AUTO=true aktiviert den automatischen Commit nach jedem abgeschlossenen Job. Ohne diesen Flag werden die Markdown-Dateien geschrieben, aber nicht committed — nützlich wenn ein externer Cron-Job die Commits übernimmt.

AUDIT_STORE_PATH=/var/sentinel/audit-store AUDIT_STORE_GIT_AUTO=true
3

Verifikation

Nach dem ersten abgeschlossenen Job liegt ein Markdown-Report im Repo. Git-Log zeigt den automatisch erstellten Commit.

git -C /var/sentinel/audit-store log --oneline # → a3f91bc audit(kunde-abc): CLEAN tf-job-001 # → 7d2e104 audit(kunde-abc): DRIFT_CRITICAL tf-job-002 cat /var/sentinel/audit-store/kunde-abc/2026-06/tf-job-001.md
Ausblick: Option C — rechtssichere Langzeitarchivierung Für Kunden mit gesetzlicher Aufbewahrungspflicht (z. B. 10 Jahre gemäß GoBD, ISO 27001 A.8.15) ist eine PDF/A-Konvertierung mit digitaler Signatur nach BSI TR-03125 (TRESOR) als zukünftige Option vorgesehen. Das Markdown-Dokument dient dabei als Quelldokument. Der Prozess: Markdown → PDF/A-Renderer → qualifizierte elektronische Signatur (QES) → Langzeitarchiv. Realisierbar als optionaler Post-Processing-Schritt auf demselben Server, ohne Änderung am Sentinel-Kern.

Pre-Ticket-Drift: Sentinel sieht in die Vergangenheit

Ein Vorfall entsteht in der Vergangenheit. TicketFlow öffnet das Ticket erst danach. Die Frage ist: Was hat sich zwischen Vorfall-Beginn und Analyse-Start in der Infrastruktur verändert? Ohne externe, kontinuierlich messende Instanz ist diese Frage nicht beantwortbar.

Das Zeitfenster-Problem Forward-Polling — ein Snapshot beim Analyse-Start, dann alle 30s — sieht nur Veränderungen nach dem Ticket. Der wertvolle Drift ist der davor: „Das VLAN hat sich zwei Stunden vor dem Ticket geändert. Genau das ist die Ursache." Ein reaktiv gestarteter Monitor kommt zu spät.

Wie Sentinel das löst

Kontinuierliches Snapshotting

Sentinel pollt alle Assets in seinem Watch-Set alle 5 Minuten — unabhängig davon, ob gerade ein Job läuft. Jede Feldänderung landet mit Zeitstempel in der asset_timeline-Tabelle. Delta-Modell: nur Änderungen werden geschrieben.

🔍

Point-in-Time-Lookup

TicketFlow übergibt ticket_opened_at im tf.analysis.started-Event. Sentinel fragt: „Wie sah dieses Asset zum Zeitpunkt der Ticketöffnung aus?" — und vergleicht mit dem Jetzt.

📋

pre_ticket_drift im Verdikt

Das finale Verdikt enthält einen separaten Block pre_ticket_drift mit Status, Zeitfenster und Feld-Events. TicketFlow kann diesen Block als eigenständige Hypothesen-Quelle verwenden: „VLAN-Drift zwei Stunden vor Ticket" ist eine starke Kausal-Hypothese.

🔄

Asset-Registrierung beim ersten Job

Schickt TicketFlow einen Job für ein Asset, das noch nicht im Watch-Set ist, registriert Sentinel es automatisch. Ab diesem Zeitpunkt wird es kontinuierlich beobachtet — der nächste Job hat bereits eine Timeline.

Warum das nur eine externe Instanz leisten kann

TicketFlow selbst könnte seine Quelldaten zur Ticketöffnungszeit abfragen — aber das wäre eine Momentaufnahme, keine kontinuierliche Beobachtung. Der entscheidende Unterschied: Sentinel läuft unabhängig vom Ticket-Lifecycle. Es beobachtet die Infrastruktur, auch wenn keine Analyse angefordert wurde, auch wenn TicketFlow nicht erreichbar ist, auch wenn niemand daran denkt. Diese operationelle Unabhängigkeit ist kein technisches Detail — sie ist die Grundlage der Verlässlichkeit. Eine Prüfinstanz, die nur auf Anfrage misst, misst immer dann nicht, wenn es darauf ankommt.

Status in v2.3 (Commit 8cd467b) Implementiert: src/continuous-snapshotter.js, asset_timeline-Tabelle, getTimelineStateAt(), pre_ticket_drift im Verdikt. 132 Tests grün. ENVs: SNAPSHOT_INTERVAL_MS (Default 300 s), WATCH_ASSETS (kommagetrennte Asset-IDs), TIMELINE_RETENTION_DAYS (Default 90).

→ v2.4 (Commit 99d6356) erweitert Sentinel um 5 neue Module (S9–S13), ein Report-Dashboard und ein Help-System. Siehe Abschnitt unten.

S9–S13: Sentinel wird zur vollständigen Validierungsinstanz

Mit v2.4 erweitert Sentinel seine Kernaufgabe um fünf Module, die aus einem reaktiven Daten-Checker eine proaktive, lernfähige Qualitätssicherungsinstanz machen. Dazu kommen ein vollständiges Report-Dashboard und ein kontextsensitives Hilfe-System.

📊

S9 — Quelldaten-Qualitäts-Score

Rollierendes 30-Tage-Scoring pro Datenquelle. Score = Verfügbarkeitsrate − Drift-Penalty. Drei Tiers: HEALTHY (≥ 0,85), DEGRADED (0,60–0,84), UNRELIABLE (< 0,60). Circuit-Open-Events fließen als Unavailability in den Score. Sichtbar unter GET /quality und im Report-Dashboard.

🧠

S10 — Anomalie-Baseline

Sentinel lernt, welche Felder eines Assets üblicherweise stabil sind. Ab 10 Beobachtungen und < 10 % Änderungsrate gilt ein Feld als stabil. Ändert es sich trotzdem, erhält das Drift-Event das Flag anomaly: true mit dem erwarteten Normalwert. Baselines werden lazy berechnet und gecacht.

🔁

S11 — Integrity-Scheduler

Tägliche Cross-Asset-Prüfung um 02:00 UTC. Erkennt drei Muster: ip_conflict (mehrere Assets teilen dieselbe IP), ghost_asset (kein Timeline-Eintrag seit > 7 Tagen), vlan_overlap (gleiches VLAN-Label in mehreren /24-Subnetzen). Findings unter GET /findings.

🪟

S12 — Change-Window-Awareness

Wartungsfenster mit optionalem Kunden-Filter. Drift, der innerhalb eines aktiven Fensters erkannt wird, erhält context: "maintenance_window". API: POST/GET/DELETE /maintenance. Ein leeres customers-Array gilt global für alle Mandanten.

🎯

S13 — Ticket-Outcome-Feedback

TicketFlow sendet nach Ticket-Schluss ein tf.analysis.resolved-Event mit Resolution (TRUE_POSITIVE / FALSE_POSITIVE / RESOLVED_EXTERNAL) und Root-Cause-Feldern. Ab 5 Einträgen liefert GET /audit/correlations eine Rangliste der häufigsten Ursachenfelder.

📋

Report-Dashboard + Help-System

GET /report: HTML-Dashboard mit Stats-Karten, Qualitätsbars, Filter-Sidebar, Detail-Modal und CSV-Export. GET /help: 11-thematisches Hilfe-System mit Sticky-Nav — kein Auth, direkt im Browser nutzbar.

Status v2.4 (Commit 99d6356) — 172 Tests grün
Neue Dateien: src/source-quality.js · src/anomaly-baseline.js · src/integrity-scheduler.js · src/maintenance-window.js · src/feedback-handler.js · src/audit-query.js · src/report-ui.js · src/help.js  · 5 neue DB-Tabellen (source_quality_events, field_baseline, scheduled_findings, maintenance_windows, feedback_log)  · CRA RFC-9301AC9C OVERRIDDEN (risk-04 FP: bounded DELETE auf Konfigurationsdaten)

→ v2.5 (Commit 731395b) schließt 10 Security-Findings aus dem vollständigen Ultra-Code-Review. Siehe Abschnitt unten.

10 Findings aus dem vollständigen Code-Review — alle geschlossen

Nach Abschluss von v2.4 wurde ein vollständiger Multi-Agenten-Code-Review über die gesamte Sentinel-Codebase durchgeführt (9 Finder-Winkel, Verifikation, Gap-Sweep). Alle 10 bestätigten Findings sind in v2.5 behoben.

🔐

Shell-Injection beseitigt

audit-store.js: exec() mit Template-String war anfällig für Shell-Injection über jobId und storePath. Ersetzt durch execFile() mit Argument-Array — kein Shell-Interpreter, keine Expansion.

🛡️

XSS in Report-Dashboard

report-ui.js: escHtml() escapte kein ' — kritisch im onclick-Kontext. Fix: '-Encoding + onclick="openModal(this.dataset.job)" eliminiert JS-String-Interpolation vollständig.

🗂️

Path-Traversal geblockt

audit-query.js: jobId aus req.params wurde direkt in path.join() verwendet. Fix: resolve() + startsWith(allowedBase + sep) — jeder Pfad außerhalb AUDIT_STORE_PATH wird verworfen.

🔒

Auth-Lücken auf /report

app.js: GET /report und GET /report/summary waren ohne Auth erreichbar und gaben Audit-Statistiken, Quelldaten-Scores und Maintenance-Windows preis. Beide Routen erfordern jetzt auth-Middleware.

⚙️

Node.js 18-Kompatibilität

feedback-handler.js: glob aus node:fs/promises ist erst ab Node 22 verfügbar. package.json deklariert ≥18. Ersetzt durch manuellen readdir()-Loop — lauffähig auf Node 18, 20 und 22.

🔢

NaN-Guard für Scheduler-Interval

continuous-snapshotter.js: parseInt("invalid") ergibt NaNsetTimeout(fn, NaN) feuert sofort und erzeugt eine Tight-Loop. Fix: isNaN(parsed) || parsed < 1000 → DEFAULT_INTERVAL_MS.

🗄️

SQL HAVING undefined behavior

integrity-scheduler.js: VLAN-Overlap-Query verwendete HAVING a.snapped_at = MAX(a.snapped_at) auf nicht-aggregierten Spalten — SQLite gibt willkürliche Zeilen zurück. Ersetzt durch korrelierte Subqueries, die den echten MAX-Datensatz selektieren.

📊

Quality-Metrik bei null-Antwort

snapshot-manager.js: fetchAsset → null (Quelle hat keinen Eintrag) wurde still verworfen — onSnapshotMiss() nie aufgerufen, Quelldaten-Score damit zu optimistisch. Fix: Miss-Metrik wird auch bei null-Rückgabe gezählt.

Input-Validierung mit 400-Response

app.js: Ungültige tf.analysis.resolved-Events (fehlende jobId, unbekannte Resolution) wurden von handleFeedback() geworfen, aber als 500 zurückgegeben. Fix: try/catch mit explizitem 400-Status.

🌐

Query-Parameter-Clamping

app.js: GET /quality?window=999999 konnte einen unkontrollierten Abfragebereich über die gesamte DB-Historie erzwingen. windowDays wird auf 1–365 geclampt; NaN fällt auf Default 30 zurück.

Status v2.5 (Commit 731395b) — 172 Tests grün
Geänderte Dateien: src/audit-store.js · src/report-ui.js · src/audit-query.js · src/app.js · src/feedback-handler.js · src/continuous-snapshotter.js · src/integrity-scheduler.js · src/snapshot-manager.js  · CRA RFC-F1D3881D APPROVED (Score 5 — Medium)

Glossar

Alle im Dokument verwendeten Fachbegriffe — von Diagnose-Methodik über Datenmodell bis Infrastruktur.

ACH-Matrix (Analysis of Competing Hypotheses)
Strukturierte Analysemethode aus der Geheimdienstanalytik (CIA-Tradition). Statt eine Hypothese zu verfolgen und Belege zu sammeln, werden alle plausiblen Erklärungen gleichzeitig bewertet: Welche Evidenz widerspricht welcher Hypothese? Die Hypothese mit den wenigsten Widersprüchen — nicht die mit den meisten Belegen — gewinnt. TicketFlow zeigt dem Techniker diese Matrix vollständig, trifft aber kein Urteil.
Anti-Anchoring
Kognitive Verzerrung: Menschen fixieren sich auf die erste Information, die sie sehen (den „Anker"), und gewichten spätere Informationen zu schwach. KI-Systeme, die sofort ein Urteil ausgeben, erzeugen diesen Anker. TicketFlow verhindert das architekturell: Die Herkunft (source_system) jeder Beobachtung ist während der ACH-Bewertung maskiert — der Techniker bewertet Trennschärfe, bevor er die Quellen sieht.
Provenienz (Datenprovenienz)
Lückenlose Rückverfolgbarkeit jedes Datenpunkts zu seiner Quelle. Im TicketFlow/Sentinel-Datenmodell trägt jede Beobachtung: source_system (woher), source_ref (welcher Datensatz), observed_at (wann gemessen), fetched_at (wann abgerufen), source_strength (wie verlässlich). Ohne Provenienz ist eine KI-gestützte Diagnose nicht überprüfbar und nicht auditierbar.
source_strength
Verlässlichkeitsklasse einer Datenquelle: strong = eigene Live-Daten (CMDB, RMM, IPAM, NinjaOne), medium = sekundäre oder ähnliche interne Quellen (Firewall-Logs, frühere Fälle), weak = externe Quellen, LLM-generiert oder nicht verifiziert. Sentinel degradiert source_strength automatisch, wenn Drift erkannt wird — eine stale CMDB liefert keine strong-Evidenz mehr.
CloudEvents 1.0
Offener Standard der CNCF für die Beschreibung von Ereignissen in einem einheitlichen Format. Definiert Pflichtfelder wie specversion, type, source, id, time. TicketFlow und Sentinel kommunizieren ausschließlich über dieses Format — die Schnittstelle ist damit vendor-agnostisch und unabhängig vom Transport-Protokoll (HTTP, Kafka, MQTT).
Circuit Breaker
Resilienz-Pattern aus dem Software-Engineering, benannt nach dem elektrischen Sicherungsautomaten. Bei 3 aufeinanderfolgenden Fehlern einer Quelle (z. B. CMDB nicht erreichbar) wechselt der Breaker in den Zustand OPEN — weitere Anfragen werden 60 Sekunden lang blockiert, um die Quelle nicht zu überlasten. Danach: HALF_OPEN (ein Probe-Request). Bei Erfolg: CLOSED (normal). Sentinel zeigt den Zustand aller Circuit Breaker in /health.
Lineage (Analyse-Lineage)
Der nachvollziehbare Pfad von rohen Quelldaten bis zur fertigen Diagnose. In TicketFlow: die Menge aller Datenpunkte mit Provenienz, die in die ACH-Matrix eingeflossen sind. Sentinel prüft diese Lineage auf Contamination und Integrity Violations — hat ein Datenpunkt eine falsche Herkunft, ist der gesamte Analysepfad kompromittiert und das Verdikt entsprechend.
Fingerprint
Strukturierte Gerätesignatur bestehend aus vier Feldern: vendor, product, role, version. Kein Freitext-Label, sondern ein typisiertes Objekt, das Sentinel pro Job speichert. TicketFlow nutzt den Fingerprint für Pattern-Matching: Zwei Assets mit identischem Fingerprint auf demselben Stack haben statistisch ähnliche Fehlerbilder — das ist kausal begründet, nicht heuristisch.
Mandanten-Scoping / end_customer_id
Jeder Job, jedes CloudEvent und jede Beobachtung trägt die ID des betroffenen Endkunden. Das ist eine Korrektheitsentscheidung: Ereignisse verschiedener Kunden sind kausal nicht verwandt — eine Korrelation über Mandantengrenzen wäre analytisch falsch, nicht nur ein Datenschutzproblem. end_customer_id ist kein Security-Gate, sondern eine Semantik-Grenze.
VLAN-Drift
Der Zustand, in dem die VLAN-Zuordnung eines Assets in der CMDB nicht mehr mit der tatsächlichen Netzwerkkonfiguration übereinstimmt. Kritisch: VLAN-Konfiguration bestimmt Firewall-Regeln, Routing und Segmentierung — jede netzwerkbezogene Diagnose, die auf einem gedrifteten VLAN-Eintrag basiert, arbeitet auf falschen Annahmen.
WAL (Write-Ahead Log)
SQLite-Betriebsmodus. Schreiboperationen werden zuerst in ein separates Log-File protokolliert, bevor die Hauptdatenbankdatei geändert wird. Vorteil: Gleichzeitige Lesezugriffe (API, Prometheus-Scrape) blockieren Schreiboperationen nicht. Sentinel nutzt WAL, um unter Last mehrerer gleichzeitiger Jobs stabil zu bleiben.
CMDB (Configuration Management Database)
Zentrale Inventardatenbank für IT-Assets: Geräte, Konfigurationen, Abhängigkeiten, Standorte, Eigentümer. Gilt als „Single Source of Truth" für den dokumentierten Ist-Zustand der Infrastruktur. Sentinel behandelt CMDB-Daten als Quelle höchster Verlässlichkeit (source_strength: strong), da sie vom MSP selbst gepflegt werden und die Primärquelle für Asset-Snapshots sind.
RMM (Remote Monitoring & Management)
Plattform für den Fernzugriff auf und die Überwachung von Kunden-Endgeräten. Liefert Live-Daten zu CPU-Last, RAM, Netzwerk-Interfaces, installierten Software-Versionen, Patch-Stand, Online-Status. Beispiel: NinjaOne. Im Sentinel-Kontext: Primäre Quelle für den Betriebszustand von Assets im laufenden Betrieb.
PSA (Professional Services Automation)
Ticket- und Projektverwaltungssystem für MSPs. Enthält Tickets, Arbeitszeiten, SLA-Definitionen, Kundenkontakte, Abrechnungsdaten. Beispiele: ConnectWise Manage, Autotask, HaloPSA. TicketFlow wird über einen PSA-Webhook ausgelöst — jeder Ticket-Eingang triggert automatisch eine Diagnose-Analyse.
IPAM (IP Address Management)
System zur Verwaltung von IP-Adressbereichen, Subnetzen, VLANs und DNS-Einträgen. Im Sentinel-Kontext: Liefert Subnet-Nachbar-Informationen für die Contamination-Erkennung. Wenn ein Asset-IP-Wert zu einem anderen Subnet gehört als dokumentiert, ist das ein starkes Signal für cross_asset_contamination.
mTLS (Mutual TLS)
Gegenseitige TLS-Authentifizierung. Nicht nur der Server weist sich gegenüber dem Client aus (Standard-HTTPS), sondern auch der Client gegenüber dem Server — beide präsentieren Zertifikate. Im Hybrid-Szenario (Sentinel beim Kunden → TicketFlow beim MSP) empfohlen: nur bekannte, zertifizierte Sentinel-Instanzen dürfen Events senden.
KRITIS
Kritische Infrastrukturen gemäß § 2 BSI-Gesetz. Betreiber in den Sektoren Energie, Wasser, IT/TK, Transport, Gesundheit und Finanz ab definierten Versorgungsschwellenwerten. Unterliegen verschärften IT-Sicherheitsanforderungen (BSI-KritisV, NIS2). Für KRITIS-Betreiber ist die Air-Gapped-Option (Architektur 4) die einzig zulässige Deployment-Form.
Audit Store
Sentinel-Modul (src/audit-store.js), das nach jedem abgeschlossenen Analyse-Job ein Markdown-Protokoll schreibt. Enthält Verdikt, Drift-Chronologie, Integritätsbefunde und Asset-Fingerprint. Aktiviert über AUDIT_STORE_PATH (Pfad zum Git-Repo) und AUDIT_STORE_GIT_AUTO=true (automatischer Commit). Das Modul ist fire-and-forget — ein Fehler beim Schreiben blockiert nicht die Verdikt-Auslieferung an TicketFlow.
asset_timeline (kontinuierliche Asset-Zustandshistorie)
Sentinel-Datenstruktur, die den Zustand aller beobachteten Assets als Zeitreihe speichert — unabhängig von laufenden Analyse-Jobs. Delta-Modell: Ein Eintrag entsteht nur, wenn sich ein Feldwert gegenüber dem letzten bekannten Stand ändert. Mit getTimelineStateAt(assetId, timestamp) lässt sich der vollständige Zustand eines Assets zu einem beliebigen Zeitpunkt in der Vergangenheit rekonstruieren. Retention-Schwelle: 90 Tage (konfigurierbar über TIMELINE_RETENTION_DAYS).
Pre-Ticket-Drift (pre_ticket_drift)
Drift-Analyse für den Zeitraum zwischen Ticketöffnung (ticket_opened_at) und dem Zeitpunkt des Analyse-Starts. Während der reguläre Drift-Watch Veränderungen während einer laufenden Analyse erfasst, zeigt pre_ticket_drift das, was sich vor dem Ticket verändert hat — der diagnostisch wichtigere Zeitraum, da viele Vorfälle durch Konfigurationsänderungen verursacht werden, die Stunden vor dem Symptom stattfanden. Wird als separater Block im finalen Verdikt-CloudEvent geliefert, enthält Status (NONE / DRIFT_MINOR / DRIFT_CRITICAL / NO_HISTORY), Zeitfenster und Feld-Events.
Externe Prüfinstanz (asynchrone Datenvalidierung)
Sentinel ist bewusst außerhalb des Systems positioniert, das es überwacht. Das ist keine Deployment-Entscheidung, sondern eine epistemische: Ein System kann seine eigenen Daten nicht unabhängig validieren. Sentinel hat keinen Zugriff auf die TicketFlow-ACH-Matrix, kennt keine Hypothesen und hat kein Interesse am Analyseergebnis. Es misst nur, ob die Quelldaten noch stimmen — kontinuierlich, ohne Trigger, ohne Absprache mit TicketFlow. Erst diese Unabhängigkeit macht das Verdikt zu einer verlässlichen Prüfgröße. Eine interne Validierungsschicht würde im Fehlerfall gemeinsam mit dem überwachten System ausfallen.
ticket_opened_at
Zeitstempel der Ticketöffnung im PSA-System (ISO 8601). TicketFlow übergibt dieses Feld in tf.analysis.started an Sentinel. Sentinel nutzt es als Rückblick-Anker: Es fragt die asset_timeline ab, um den Asset-Zustand zum Zeitpunkt der Ticketöffnung zu rekonstruieren und mit dem aktuellen Zustand zu vergleichen. Ohne ticket_opened_at ist kein Pre-Ticket-Drift möglich — Sentinel fällt auf das Forward-Polling-Modell zurück.
BSI C5 (Cloud Computing Compliance Criteria Catalogue)
Prüfrahmen des Bundesamts für Sicherheit in der Informationstechnik für sichere Cloud-Dienste in Deutschland. Definiert Basiskriterien und ergänzende Kriterien für Cloud-Anbieter. Relevant für MSPs, die Cloud-Dienste für regulierte Kunden (Behörden, Finanz, Gesundheit) erbringen — Sentinel/TicketFlow im Private-Cloud-Betrieb kann C5-Konformität unterstützen.