Runbooks/Siem Providers

SIEM providers

Operator runbook for sending IdentityMesh audit events to your SIEM. You choose where events go in the portal, under Settings → SIEM Integrations. Each destination is a provider with a name you pick, the same way you pick a provider for email or secrets. The product reads events from its own audit record, hands them to each provider in order, and proves what was delivered.

This page covers the model, the delivery guarantees, the shape of every event and the switches that limit what leaves the product. The destination-specific pages follow from it: siem-splunk.md for Splunk, siem-webhook.md for HTTPS, siem-syslog.md for syslog and siem-cef-leef.md for the CEF and LEEF formats.

How it works

The SIEM Integrations tab is under Console → Settings. Viewing it needs the roles.read permission. Adding, changing, testing and deleting providers need roles.write.

Delivery guarantees

GuaranteeWhat it means for you
Events come from the audit recordEach event is built from a row in the hash-chained audit tables (or from a finished run), after that row is committed. Nothing is built from log lines, so nothing depends on a log level or a text filter.
At-least-once, with acknowledgementA provider’s position moves forward only after the destination accepted the batch. A failed or unanswered send is retried from the same position. A receiver can therefore see an event twice, and must tolerate that.
A sequence number on every eventEach provider counts its own events 1, 2, 3 and so on, separately for each stream. A retried batch is sent again with the same numbers. A gap in the sequence proves an event was lost on the way. A gap in the audit table’s own row numbers does not, because a rolled-back write leaves a hole there.
Delivery you can seeThe Operations page shows, per enabled provider, the backlog, the last delivery, the last error and a Stalled flag.
A warning when delivery stallsWhen a provider has a backlog and has delivered nothing for 30 minutes, it is marked Stalled and the IdentityMesh event log gets one warning. The default window can be changed by your support contact.
Retention waits for deliveryThe audit retention sweep never removes an admin, object or group audit entry, or a run history row, that an enabled provider has not delivered yet. Workflow run retention is not held back by delivery. See audit-retention.md.

Retry and parking

The dispatcher runs every 15 seconds, one provider and stream at a time, and two Admin API instances never send the same batch.

A provider also gives up its turn once it has spent about a minute sending in one pass, for example while a Splunk indexer is slow to acknowledge. Whatever it did not send goes on the next pass.

Run and workflow events are delivered about two minutes after the run ends. That pause lets every engine and API instance finish writing its runs, so a run recorded a moment late is not passed over. Installs with more than one engine or Admin API instance must keep those servers’ clocks in sync with NTP: the run and workflow times come from the server that wrote them, and a clock that runs more than about two minutes behind the others can still cause a run event to be missed.

The dispatch interval is set by Siem:DispatchSeconds in the Admin API configuration (default 15). Setting it to 0 switches delivery off. Do that only with every provider switched off as well: because retention waits for delivery, an enabled provider that is never sent to stops the audit tables being trimmed. See audit-retention.md.

UDP syslog cannot be acknowledged. A UDP provider counts every send as accepted, so its sequence numbers are still stamped, and a gap at the receiver still shows loss, but the product cannot retry what the network dropped. Use TCP or TLS where the evidence matters.

Streams and kinds

An event belongs to one stream and has one kind within it. On a provider’s card in Settings → SIEM Integrations, each stream has an Event kinds list that names its kinds, marks the ones that carry personal data, and lets you switch kinds off one by one. The severity of each kind is in Severity below.

StreamSourceKind isCarries personal data
adminAdmin auditThe action, such as POST /api/connectorsYes: the administrator’s identity; snapshots only when attribute values are switched on
objectObject auditThe change type, such as Add, Update, DeleteYes, when attribute values are switched on; otherwise attribute names only
vaultVault auditThe event type, such as CheckoutYes: user name and IP address; justification and reason only when free text is switched on
groupGroup auditThe event type, such as MemberAddedYes: the acting, target and approving users and the IP address
runFinished sync runsThe final status, such as Success or FailedThe error text only when free text is switched on
workflowFinished workflow runsThe final status, such as Completed or FailedThe last error only when free text is switched on

Kinds per stream

A kind written by a newer component than the one sending is still delivered, at severity 5 and flagged as personal data.

The event

Every event, in every stream and in every format, carries the same envelope. JSON is the reference form. CEF and LEEF are renderings of it, described in siem-cef-leef.md.

{
  "product": "IdentityMesh",
  "component": "AdminApi",
  "instance": "im-api-01",
  "provider": "Corporate SIEM",
  "seq": 12345,
  "stream": "admin",
  "sourceId": "88213",
  "kind": "POST /api/connectors",
  "severity": 3,
  "eventTimeUtc": "2026-11-02T09:14:07.421Z",
  "readTimeUtc": "2026-11-02T09:14:22.031Z",
  "actor": { "upn": "alice@corp.example", "sid": "S-1-5-21-...", "source": "Api", "ip": null },
  "subject": { "kind": "Connector", "id": "8e6b8c44-...", "type": null },
  "outcome": "success",
  "correlationId": "0HMV-...",
  "rowHash": "9f2c...",
  "previousRowHash": "41ab...",
  "detail": { "statusCode": 201 },
  "tags": { "env": "prod" }
}
FieldMeaning
productAlways IdentityMesh.
componentThe part of the product that wrote the entry: AdminApi, SyncEngine, Relay or System.
instanceThe machine that built the event.
providerThe name of the provider that sent it, so one receiver can tell several providers apart.
seqThe provider’s own counter for this stream, increasing by one for every event delivered. See Using the sequence.
streamadmin, object, vault, group, run or workflow.
sourceIdThe audit row number, or the run id for the run and workflow streams. Stable for the life of the event.
kindThe action, change type, event type or status.
severity0 to 10, set by the kind.
eventTimeUtcWhen the entry was recorded. For the run and workflow streams, when the run finished, or started if it has no end.
readTimeUtcWhen the dispatcher read the entry to send it. One value per batch.
actorWho did it: upn (user name), sid, source (Api, Engine, Relay or System) and ip (vault and group events only). Fields that do not apply are null.
subjectWhat it was done to: kind, id and type. See the per-stream tables.
outcomesuccess, denied, failed or unknown.
correlationIdPivots to the same value on the request in the API log and in the audit table. Empty on object, run and workflow events.
rowHashThe audit row’s hash. Empty on rows written before the hash chain existed, and on the run and workflow streams. See audit-chain.md.
previousRowHashThe hash of the row before it in the chain, for independent verification.
detailFields specific to the stream. See below.
tagsThe labels you set on the provider. Present only when you set some, and carried by JSON only.

Two clocks, both UTC

eventTimeUtc is when the entry was recorded. Where a writer had to wait for the audit chain, the recorded time is never earlier than the entry before it, so it can sit a moment after the change itself. readTimeUtc is when IdentityMesh read the entry to send it. The gap between the two is your delivery delay. Every time is UTC. In JSON, times use the default format, so trailing zeros in the fractional seconds are trimmed. CEF and LEEF times are described in siem-cef-leef.md.

Severity

Severity is fixed by the kind and runs from 0 to 10. The table below gives it by kind:

SeverityEvents
1Object add, update, create, refresh, link and export; successful or continuing sync run; completed or skipped workflow run; group expiry warning
3Admin endpoint call and named admin actions; workflow object changes; object isolate and release; group update, owner, member and request events; vault cancel, expire and rotation succeeded; cancelled or paused sync run; cancelled or rejected workflow run
4Object delete and disconnect; group create, delete, restore, expire and purge, and group failures
5Vault request, approve, deny, check-out, check-in, account nomination, status and archive, and remote target events
6Audit chain reseal; vault account deletion; group and vault policy changes and vault scope changes; forced rotation; failed or interrupted sync run; failed or timed out workflow run
7Admin call refused (401 or 403); vault credential view, credential token events, scope refusals and remote connections
8Erasure request; a successful erase or subject access request call; vault rotation failed

Field reference per stream

The actor, outcome, correlationId and hash fields above come from the audit row. The subject and detail members are as follows. Where a switch is named, the member is absent unless the switch is on for the provider. Members with no value are left out.

admin

MemberMeaning
subject.kind, subject.idThe target type and id, when the handler names one. For an erasure, MeshObject and the internal object id.
detail.statusCodeThe HTTP result of the call.
detail.before, detail.afterSnapshots before and after a high-value change, with sensitive fields already removed. Attribute values switch. Each side is capped at 16 KB: a larger snapshot keeps the top-level fields that fit, and one that is not a set of fields is left out.
detail.detailTruncatedtrue when the cap left something out. Present with the snapshots. The full snapshot stays in the audit record.

The outcome is denied for 401 and 403, success for 2xx and 3xx, and failed for other 4xx and 5xx. An erasure event has no snapshots. Its detail holds counts only. A call to a route that names the person, such as the erase and subject access request calls, is treated the same way: it has no subject id, no snapshots even when attribute values are on, and a detail of counts only.

object

MemberMeaning
subject.kind, subject.id, subject.typeMeshObject, the mesh object id and the object type.
detail.sourceThe connector, or the component, that caused the change.
detail.msObjectIdThe management space object.
detail.connectorIdThe connector, when the change names one.
detail.changedAttributesA list of attribute names, capped at 200. Always present.
detail.changedAttributeCountHow many attributes changed in total.
detail.changedAttributesTruncatedtrue when the cap cut the list. The full change stays in the audit record.
detail.externalIdThe object’s id in the connected system. Attribute values switch.
detail.attributeValuesThe current value of each changed attribute, capped at 200 entries. Attribute values switch. Secret attributes are always shown as redacted.

vault

MemberMeaning
subject.kind, subject.idVaultedAccount and the account id, or VaultPolicy and the policy id for policy events.
detail.requestId, detail.checkoutSessionId, detail.policyIdThe records the event concerns, when there are any.
other detail membersWhatever the event recorded, such as a failure code, up to 16 KB in all.
detail.justification, detail.reasonThe requester’s justification and the decision reason. Free text switch.
detail.detailTruncatedtrue when the 16 KB cap left some recorded members out. The full entry stays in the audit record.

Credentials are never part of a vault event. The outcome is denied for Deny and CheckoutRefusedByScope, failed for RotationFailed, and success otherwise.

group

MemberMeaning
subject.kind, subject.idGroup and the group’s mesh object id.
detail.targetUsername, detail.targetMeshObjectIdThe member or owner affected.
detail.approverUsername, detail.requestIdThe approver and the request, for request events.
detail.before, detail.afterSnapshots of the changed fields. Attribute values switch. Capped at 16 KB per side, as for admin events.
detail.detailTruncatedtrue when the cap left something out. Present with the snapshots.

The outcome is failed for GroupCreateFailed and GroupOnboardFailed, denied for RequestDenied, and success otherwise.

run

MemberMeaning
subject.kind, subject.id, subject.typeConnector, the connector id and the run type.
detail.runTypeThe kind of run.
detail.startTimeUtc, detail.endTimeUtcWhen the run started and ended.
detail.addedCount, detail.updatedCount, detail.deletedCountWhat the run changed.
detail.totalCount, detail.processedCountHow many objects the run expected and handled.
detail.instanceNameThe engine instance that ran it.
detail.errorMessageThe failure text. Free text switch.

workflow

MemberMeaning
subject.kind, subject.id, subject.typeWorkflow, the workflow id and the trigger kind.
detail.workflowName, detail.workflowVersionWhich workflow and version.
detail.triggerKind, detail.attemptWhat started the run and which attempt this was.
detail.currentStep, detail.depthThe step it reached and its nesting depth.
detail.meshObjectId, detail.groupMeshObjectId, detail.directionThe object or group it ran for, and the direction, where there is one.
detail.startedUtcWhen the run started.
detail.lastErrorThe last error. Free text switch.

Limiting what leaves the product

Each provider has its own switches, under its card in Settings → SIEM Integrations.

A switched-off stream or kind does not hold back delivery of the others, and it does not hold back audit retention: retention waits only for streams a provider actually has switched on.

Provider kinds

KindWhere events goSettingsAcknowledged
Windows event logThe IdentityMesh log on the API host, source IdentityMesh SIEM, one entry per event with the JSON as its messageNoneYes, once the entry is written
HTTPS collectorAny HTTPS endpoint. See siem-webhook.mdCollector URL, Allow plain HTTP, Format (JSON, CEF or LEEF), Auth header name, Auth header value, Batch size, Tags (JSON only)Yes, on a 2xx answer
SyslogA syslog collector over UDP, TCP or TLS. See siem-syslog.mdHost, Port, Protocol, Format, Tags (JSON only)TCP and TLS yes; UDP no
Splunk HECSplunk HTTP Event Collector on Splunk Enterprise or Splunk Cloud. See siem-splunk.mdHEC URL, HEC token, Index, Source, Source type, Source type per stream, Use indexer acknowledgement, Channel, Batch size, Max content bytes, Skip certificate validation, TagsYes, on a 2xx answer; with indexer acknowledgement, once Splunk confirms the batch is indexed

Datadog log forwarding is separate and unchanged. It forwards log lines, not the audit record.

Using the sequence

The sequence is how a receiver proves nothing is missing.

  1. Key every event on provider name, stream and seq. That key is unique and never reused: each stream has its own count, and a resend after a retry carries the numbers it had the first time.
  2. Drop an event whose key you have already stored. Retries make duplicates normal.
  3. Alert when a stream’s next seq is not the last one plus one. A gap means an event never arrived. A repeat means a retry.

Upgrading from the old webhook and syslog settings

On the first start after the upgrade, IdentityMesh creates the Windows event log provider, makes it the default and then converts what was configured before:

The conversion reads the webhook and syslog settings saved through the portal first, and the values in the Admin API configuration only where the portal saved none. If an enabled webhook had no URL, or had an auth header name but no token, or enabled syslog had no host, the provider is created switched off, and the IdentityMesh event log gets a warning saying what to fill in. Fill it in on the provider’s card, switch it on and save.

The old settings stay where they were, but after the conversion nothing reads them. Check the new providers in Settings → SIEM Integrations, press Test on each, and remove the old settings when you are satisfied.

The providers the upgrade creates start at the current end of each stream: they deliver what happens from the upgrade on, not the entries already in the database. To send the history that is still retained, add a provider yourself under Settings → SIEM Integrations. A provider you add starts from the oldest retained entry, so expect that backlog to arrive at it.