SIEM export — feeding Splunk, syslog/CEF and OpenTelemetry trace receivers
Included from Basic tier
"Can your evidence feed our SIEM?" — yes, as a base capability (no
pack, no entitlement). The server pushes its event feed — every audited
write, warning, approval and lifecycle event — to your SIEM with batched,
at-least-once delivery behind a durable cursor, so your security team's
alerting and retention see OpsChain without polling anything; the same
forwarder exports each correlation chain as one OpenTelemetry trace to
Grafana Tempo, Jaeger or any OTLP collector. The full reference is
opschain docs integrations-siem.
1. Splunk, via HTTP Event Collector
Create an HEC token in Splunk (Settings → Data inputs → HTTP Event Collector), then register the connection — the token never rides the command line and no read ever returns it:
SPLUNK_HEC_TOKEN=... opschain admin siem create splunk-main \
--kind splunk_hec \
--endpoint-url https://splunk.example.com:8088/services/collector/event \
--secret-env SPLUNK_HEC_TOKEN
Created SIEM connection splunk-main (splunk_hec -> https://splunk.example.com:8088/services/collector/event)
Events arrive with sourcetype=opschain:event; the event body is the
catalogued event row (id, type, created_at, username, node_path,
data) and nothing else. Dedup on event.id if your pipeline replays.
2. Anything CEF-speaking, via syslog
QRadar, ArcSight, Sentinel's syslog collector, rsyslog — point a syslog connection at it:
opschain admin siem create soc-syslog --kind syslog \
--syslog-address siem.example.com:6514 --syslog-transport tls
Records are CEF:0|LimePoint|OpsChain|<version>|<event type>|… with
severity mapped from the event-type prefix (error 9, warn 6, audit 5,
api 3) and the event id as externalId.
3. Traces, via OTLP/HTTP
Grafana Tempo, Jaeger, Datadog, an OpenTelemetry Collector in front of a
governance tower — point an otlp_http connection at the receiver's base
URL (traces POST to /v1/traces); the optional token rides as a bearer
credential or in a named tenant header, with the same write-only custody:
TEMPO_TENANT=... opschain admin siem create tempo --kind otlp_http \
--endpoint-url https://tempo.example.com:4318 \
--auth-header X-Scope-OrgID --secret-env TEMPO_TENANT
Created SIEM connection tempo (otlp_http -> https://tempo.example.com:4318)
Each correlation chain arrives as one trace: a root span named by its
unit of work (change <id> / run <id>), one span per event (name = the
event type) under it — or under the event that caused it where the chain
records one — with identifiers under opschain.* (opschain.event.type,
.principal_id, .change_id, .run_id, .agent, model tokens on
model-call events) and, for events an attestation cites, the ledger anchor
opschain.evidence.hash. Usernames and emails are never attributes. Search
the trace by the chain's correlation id: the trace id is its UUID bytes.
4. Verify, filter, watch
opschain admin siem test splunk-main # one synthetic info:siem:test event
opschain admin siem list # kind, target, filter, lag, failures
opschain admin siem update splunk-main --event-filter 'warn:,error:,audit:'
The filter is a prefix list — forward only the security-relevant families,
or leave it empty for everything. list/show carry per-connection
health: when the receiver last acknowledged, how far delivery lags the
newest event, and the failure streak. A receiver outage loses nothing —
batches retry with backoff and the cursor holds until acknowledged — and a
sustained streak lands a throttled warn:siem:delivery_failing event you
can route to notifications (opschain docs cli/admin-siem for every
verb).