SIEM-Logging (ECS-JSON)

NodePilot kann Anwendungslogs und Audit-Ereignisse als Elastic Common Schema 1.x ausgeben. Das ECS-JSON-Format eignet sich für Elastic Filebeat, Splunk HEC, Microsoft Sentinel und andere SIEM-Systeme mit strukturierter JSON-Aufnahme. Beide Ereignisarten verwenden dieselbe Serilog-Pipeline.

Aktivieren

"Logging": { "Format": "ecs-json" }
Format-WertOutputUse Case
text (code fallback)Plain-TemplateDev, Console
cmtrace (ausgeliefert)ConfigMgr CMTraceOps auf Windows
jsonSerilog Compact JSON (CLEF)Generic structured ingest
ecs-jsonElastic Common Schema 1.xSIEM (Elastic/Sentinel/Splunk)

Wire-Format

Ein Event pro Zeile, \n-terminiert. Reservierte ECS-Fields:

{
  "@timestamp": "2026-05-08T22:34:11.482Z",
  "log.level": "info",
  "message": "Workflow execution started",
  "ecs.version": "1.12.0",
  "nodepilot": {
    "workflow_id": "...",
    "execution_id": "...",
    "step_id": "step-7",
    "duration": 1234
  }
}

NodePilot-Domain-Properties landen unter nodepilot.* (PascalCase → snake_case). Properties mit ECS-Prefix (event., user., source., service., host., error., trace., http., url., network. …) werden an den JSON-Root in ihrer geschachtelten ECS-Form gehoben.

Duplicate-Key-Dedup: zwei Source-Namen, die aufs gleiche snake_case-Target normalisieren, werden per last-wins dedupliziert — verhindert Rejects bei strict-Ingest-Pipelines.

Audit-Events auf dem SIEM-Stream

Jeder erfolgreiche Audit-Row wird zusätzlich als strukturiertes ECS-Event emittiert:

ECS-FieldSourceBeispiel
event.actionAction-VerbWORKFLOW_PUBLISHED
event.categoryaus Action-Prefix gemapptiam (Login/User/Credential), process (Execution/Trigger), configuration (Workflow/Machine)
event.kindkonstantevent
event.outcomeaus Action und strukturiertem details.success abgeleitetsuccess, failure oder bei *_ATTEMPTED unknown
event.datasetkonstantnodepilot.audit
event.idAuditLog-Row-IDUUID
event.originalredacted Details-JSON{"name":"Daily-Report","version":4}
user.id / user.nameClaimsUUID / alice
source.ipRemoteIpAddress10.1.2.3

Out-of-the-box Sigma/Sentinel/Elastic-Detection-Rules matchen ohne Custom-Field-Mapping. Fehlschlagende Audit-Writes* werden ebenfalls geloggt (error-Level mit error-Block), damit eine still gedroppte Audit-Row operationell sichtbar wird.

Filebeat-Beispiel

Die Beispiele lesen nur die datierten Hauptlogs nodepilot-[0-9]*.log im JSON/ECS-Format. nodepilot-support-*.log bleibt immer Klartext und gehört nicht in den NDJSON-Parser. Bei einem eigenen Logging:File:Path das Muster entsprechend anpassen.

filebeat.inputs:
  - type: filestream
    id: nodepilot
    paths:
      - C:\ProgramData\NodePilot\logs\nodepilot-[0-9]*.log
    parsers:
      - ndjson:
          target: ""
          add_error_key: true
processors:
  - timestamp:
      field: "@timestamp"
      layouts: ["2006-01-02T15:04:05.999999999Z07:00"]
output.elasticsearch:
  hosts: ["es.firma.de:9200"]
  index: "nodepilot-%{+yyyy.MM.dd}"

Splunk

Nutze Splunk Universal Forwarder zum Einlesen der ECS-JSON-Logdateien. Filebeat bietet keinen generischen HTTP-Output. Konfiguriere Empfänger und TLS über die für deine Splunk-Umgebung freigegebene outputs.conf und ergänze diese Stanza in inputs.conf:

[monitor://C:\ProgramData\NodePilot\logs\nodepilot-*.log]
disabled = 0
whitelist = nodepilot-[0-9].*\.log$
index = nodepilot
sourcetype = _json

Lege den Index nodepilot mit passenden Berechtigungen an, gib dem Forwarder Lesezugriff auf das Logverzeichnis, starte ihn neu und prüfe ein synthetisches Ereignis am Empfänger. Dieser Weg verwendet Splunk-Forwarding, nicht HEC. Falls HEC erforderlich ist, wähle einen Collector mit ausdrücklicher Splunk-HEC-Unterstützung und prüfe Ereignisformat und TLS-Einstellungen.

Splunk: inputs.conf · Splunk: forwarder configuration

Operator-Checkliste

  • Logging:Format=ecs-json in appsettings.Production.json.
  • Ein Collector wie Filebeat, Vector, Fluentd oder Splunk Universal Forwarder ist neben dem NodePilot-Service installiert.
  • Log-File-Path matched Logging:File:Path (Produktion: C:\ProgramData\NodePilot\logs\nodepilot-.log).
  • Ein Sample-Event end-to-end im SIEM indexed (Smoke-Test).
  • Mind. ein Dashboard-Panel auf nodepilot.execution_id erstellt.

Out of scope

Audit-Outbox-Push-Pipeline (V2), CEF/LEEF, Syslog-Sink (via Filebeat oder Serilog.Sinks.Syslog addierbar).

Alle Kapitel