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-Wert | Output | Use Case |
|---|---|---|
text (code fallback) | Plain-Template | Dev, Console |
cmtrace (ausgeliefert) | ConfigMgr CMTrace | Ops auf Windows |
json | Serilog Compact JSON (CLEF) | Generic structured ingest |
ecs-json | Elastic Common Schema 1.x | SIEM (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-Field | Source | Beispiel |
|---|---|---|
event.action | Action-Verb | WORKFLOW_PUBLISHED |
event.category | aus Action-Prefix gemappt | iam (Login/User/Credential), process (Execution/Trigger), configuration (Workflow/Machine) |
event.kind | konstant | event |
event.outcome | aus Action und strukturiertem details.success abgeleitet | success, failure oder bei *_ATTEMPTED unknown |
event.dataset | konstant | nodepilot.audit |
event.id | AuditLog-Row-ID | UUID |
event.original | redacted Details-JSON | {"name":"Daily-Report","version":4} |
user.id / user.name | Claims | UUID / alice |
source.ip | RemoteIpAddress | 10.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-jsoninappsettings.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_iderstellt.
Out of scope
Audit-Outbox-Push-Pipeline (V2), CEF/LEEF, Syslog-Sink (via Filebeat oder Serilog.Sinks.Syslog addierbar).