etminan
SIEM integration

Every finding and signed action, straight into your SIEM.

Etminan emits one event per integrity finding and per signed operator action over syslog, in the formats Splunk and QRadar already parse — CEF and LEEF. This is the consuming-side reference: how to turn it on, the event model, the field dictionary, real sample events, and the normalization mappings (Splunk CIM, QRadar QID) that make findings raise proper alerts and offenses.

i

Supported today. Both SIEMs ingest Etminan's output generically right now — Splunk parses CEF, QRadar natively parses LEEF (which is exactly why Etminan emits LEEF for it). This guide plus that generic ingestion is the supported path. A certified Splunk Technology Add-on and QRadar DSM are a planned follow-on (see the end of the page) — this page is the field-level contract both will follow.

01 — Producer side

Turn it on with one environment variable.

SIEM output is off by default. Set the format on the verifier and events start flowing on the next check — no new process, no in-process HTTP, no third-party dependency.

# /etc/etminan-verifier/verifier.env ETMINAN_SIEM_FORMAT=cef # cef (Splunk / ArcSight) or leef (QRadar); unset = off ETMINAN_SIEM_SYSLOG_ADDR=siem.internal:514 # optional: UDP to a remote collector # unset -> local /dev/log, your syslog daemon forwards it

Events are written to the local /dev/log socket by default (your syslog daemon forwards them onward), or sent as UDP to ETMINAN_SIEM_SYSLOG_ADDR=host:port. Facility is local0; syslog severity maps critical → err, warning → warning, action → info. One event is emitted per finding and per signed operator action.

02 — Event model

Two event categories, one line each.

Everything Etminan emits is one of two categories, split on the cat (CEF) / cat (LEEF) field so your SIEM can route them to different data models.

EventcatWhen
findingfindingan integrity check result (a run/check finding)
operator-actionoperator-actiona signed trust-changing action, taken from the hash-chained audit log

Format strings

The <version> field is the CEF/LEEF device-version header — it carries the running etminan-verifier version at emit time.

CEF header
CEF:0|Etminan|etminan-verifier|<version>|<sigId>|<name>|<sev 0-10>|<extension>
LEEF header (x09 declares the TAB attribute delimiter)
LEEF:2.0|Etminan|etminan-verifier|<version>|<eventId>|x09|<TAB-separated attrs>
03 — Field dictionary

What every field means, per category.

The field names are stable. Signature and payload blobs are deliberately never placed on the wire — they live in the hash-chained audit log, not the SIEM event.

Field (CEF / LEEF)findingoperator-action
sigId / eventId the finding kind (pcr-mismatch, template-hash-mismatch, unexpected-pcr-selection, sla-exceeded, pending-overflow, plugin-failure, check-error, audit-chain-invalid, …) the audit action (host_enrolled, baseline_approved, baseline_rejected, baseline_exclusion_created/_revoked, operator_key_authorized/_revoked/_rotated, tls_cert_rotated, ak_rotated, profile_assigned)
catfindingoperator-action
dhost / dstmonitored host idresource acted on (host id, or a key for registry actions)
cs1 (cs1Label=kind) / kindthe finding kind
suser / usrNamethe signing operator key (hex)
actthe audit action
msgthe finding textcompact k:v,k:v detail summary (blobs dropped)
severityCEF numeric (critical=10, warning=5, action=3); LEEF sev = the raw wordsame
04 — Sample events

Exactly what lands on the wire.

Real event shapes for both categories, in both formats. The <version> field is the running verifier version.

CEF — finding

CEF:0|Etminan|etminan-verifier|<version>|pcr-mismatch|Host integrity finding|10|dhost=web-01 cat=finding cs1Label=kind cs1=pcr-mismatch msg=quoted PCR10 digest does not match the replayed IMA measurement log

CEF — operator action

CEF:0|Etminan|etminan-verifier|<version>|baseline_approved|Signed operator action|3|suser=3a1f9c2b…e7 cat=operator-action act=baseline_approved dhost=web-01 msg=path:/usr/local/bin/app,reason:scheduled deploy 4821

LEEF — finding (tabs shown as )

LEEF:2.0|Etminan|etminan-verifier|<version>|pcr-mismatch|x09|cat=findingdst=web-01kind=pcr-mismatchsev=criticalmsg=quoted PCR10 digest does not match the replayed IMA measurement log

LEEF — operator action

LEEF:2.0|Etminan|etminan-verifier|<version>|baseline_approved|x09|cat=operator-actionusrName=3a1f9c2b…act=baseline_approveddst=web-01sev=actionmsg=path:/usr/local/bin/app,reason:scheduled deploy 4821
05 — Splunk

Normalize to CIM.

Ingest as CEF — a dedicated sourcetype = etminan:cef is recommended. Split by cat and normalize: findings to Alerts, operator actions to Change (so registry/baseline changes surface in Splunk ES change analysis).

EtminanSplunk CIM fieldData model
cat=finding eventsAlerts (and/or Endpoint integrity)
dhostdest, dvcAlerts / Endpoint
cs1 (kind)signature, categoryAlerts
CEF severityseverityAlerts
msgdescriptionAlerts
cat=operator-action eventsChange
suseruserChange
actaction / change_typeChange
dhostobject / destChange

Until the certified TA ships, a few field aliases (dhost→dest, suser→user) plus event tags get you CIM-compliant.

06 — QRadar

Map eventId to QID and category.

LEEF is parsed natively — add a Log Source of type LEEF. A DSM / Log-Source Extension assigns each eventId a QID → category + severity so findings raise proper offenses.

Etminan eventIdQRadar category (high / low-level)Severity
pcr-mismatch, template-hash-mismatch, unexpected-pcr-selection, audit-chain-invalidSuspicious Activity → System Integrity ViolationHigh (8–10)
operator-rejectedPolicy → Host-Based Policy ViolationHigh
sla-exceeded, pending-overflow, plugin-failure, check-errorPotential Exploit / Policy → WarningMedium
operator-action eventIds (baseline_approved, operator_key_*, *_rotated, …)Audit → Configuration / Authentication ChangeLow–Medium
07 — Deployment checklist

Three steps to first events.

Turn on the producer

Set ETMINAN_SIEM_FORMAT (and ETMINAN_SIEM_SYSLOG_ADDR for a remote collector), restart the verifier, and confirm events reach the SIEM.

Splunk

Set the sourcetype, apply the field aliases + CIM tags above (or install the certified TA when available). Validate against the Change / Alerts data models.

QRadar

Add the LEEF Log Source; import the QID map / DSM extension when available — generic LEEF parsing works in the meantime.

08 — On the roadmap

What's planned next.

Everything above works today with generic CEF/LEEF ingestion. These follow-ons are honest about what they need before they can ship as “supported” rather than untested-blind.

Planned

JSON output — a newline-delimited JSON event per finding and per signed action, over the same syslog transport, for generic structured-log ingesters (Elasticsearch, Loki, Vector, Fluent Bit). Its flat, Etminan-defined schema will be documented on this page when it lands.

Planned

Certified Splunk TA + QRadar DSM — a packaged Splunk Technology Add-on (props.conf/transforms.conf + CIM tags) and a QRadar DSM / Log-Source Extension (QID map), each following the field dictionary above. Gated on access to Splunk (+ Splunk ES) and QRadar test instances so they can be validated against real ingestion rather than shipped blind. Running one of those and want to help? Tell us.