opentide

Splunk (`platform::splunk::1.0`)

`configurations.splunk` is a Splunk saved search. The detection text is SPL. Query validation is supported. Enterprise Security notable events, risk, and correlation search are optional blocks on top of the saved search.

The current block is the v3 layout. A splunk::2.x rule that still uses the flat keys is accepted and normalised onto this layout before validation. Both opentide validate and deploy use that normalisation.

Shared fields are defined in platforms.

Requirements

  • Static validation MUST require a non-blank query, or a non-blank legacy search which is copied into query.
  • scheduling, trigger, actions, and correlation_search MAY be omitted and still validate.
  • Legacy flat keys (search, cron_schedule, throttling, threshold, notable, risk, email, and scheduling.frequency / scheduling.lookback / scheduling.cron / scheduling.custom_time) MUST be accepted and moved as defined in Legacy splunk::2.x keys.
  • A query or scheduling.schedule set on the v3 layout MUST win over search and cron_schedule.
  • search and cron_schedule MUST be retained after normalisation so the object round-trips.
  • Unknown keys that are not in the legacy set MUST fail static validation.
  • The Splunk loader drops unknown keys inside scheduling other than type, expires, schedule, and timerange. An unknown key at the block root still fails load.
  • Deploy of a block whose scheduling.schedule is set, or whose scheduling.type is set to anything other than real time, MUST mark the saved search scheduled. A schedule with no type MUST still be scheduled.
  • scheduling.type: Real Time (any case) MUST deploy a real-time search and MUST NOT require a cron schedule.

Definition

Block

FieldTypeRequiredDefaultDescription
querystringyes—SPL. Multiline. Legacy search fills this when query is empty.
schedulingSplunkSchedulingoptionalnullCron or frequency, and the search time range.
triggerSplunkTriggeroptionalnullAlert threshold, severity, and throttling.
actionsSplunkActionsoptionalnullNotable, risk, and email actions.
correlation_searchbooleanoptionalnullForce the Enterprise Security correlation-search action on or off. null follows the tenant.
advancedmap[string, any]optionalnullExtra savedsearches.conf keys, stringified at deploy. Hidden from templates. Generated schema marks the field deprecated in favour of the nested blocks.
searchstringoptionalnullLegacy v2 search string. Hidden from templates. Kept after it is copied to query.
cron_schedulestringoptionalnullLegacy v2 cron. Hidden from templates. Kept after it is copied into scheduling.schedule.cron.

scheduling (SplunkScheduling)

FieldTypeRequiredDescription
typestringoptionalReal Time deploys dispatch.earliest_time and dispatch.latest_time as rt. Any other non-empty value, or a schedule with no type, deploys is_scheduled = 1.
expiresstringoptionalSplunk alert.expires (2h, 1d).
scheduleSplunkScheduleoptionalWhen the search runs.
timerangeSplunkTimerangeoptionalWindow the search covers.

scheduling.schedule (SplunkSchedule)

Provide cron, or frequency. frequency is converted to cron using the tenant's frequency_scheduling mode (random, current, or custom).

FieldTypeRequiredDescription
frequencystringoptionalNm, Nh, or Nd (5m, 1h, 1d). Expected ranges are 1–59 minutes, 1–23 hours, 1–30 days. Values outside the range still convert, with a warning.
cronstringoptionalCron expression. Wins over frequency when both are set.
custom_timestringoptionalAnchor for frequency when the tenant mode is custom. Format HHhmm (09h15). Required at deploy for that mode.

scheduling.timerange (SplunkTimerange)

FieldTypeRequiredDescription
lookbackstringoptionalNm, Nh, or Nd. Deploy converts it to a Splunk earliest time (-90m@m), including the tenant skew and offset.
earlieststringoptionalRaw Splunk earliest time. Wins over lookback.
lateststringoptionalRaw Splunk latest time.

trigger (SplunkTrigger)

FieldTypeRequiredDescription
conditionstringoptionalSplunk counttype (number of events, number of hosts, …).
comparatorstringoptionalSplunk relation (greater than, less than, …).
thresholdintoptionalSplunk quantity.
severityintoptionalSplunk alert.severity (1–6). When omitted, deploy maps response.alert_severity.
custom_conditionstringoptionalSplunk alert_condition search.
typestringoptionalonce (any case) sets alert.digest_mode true. Any other value sets it false.
throttlingSplunkThrottlingoptionalSuppression window.

response.alert_severity maps to Splunk as:

Tide severitySplunk alert.severity
Informational2
Low3
Medium4
High5
Critical6

An unmapped value is sent as 3.

trigger.throttling (SplunkThrottling)

FieldTypeRequiredDescription
fieldslist[string]optionalalert.suppress.fields, joined with commas.
durationstringoptionalalert.suppress.period. When set, deploy also sets alert.suppress true.
group_namestringoptionalalert.suppress.group_name.

actions (SplunkActions)

Notable and risk are sent only when the tenant has Enterprise Security enabled. Email is always eligible. A tenant modifier may still clear the allowed action list.

actions.notable

FieldTypeRequiredDescription
event.titlestringoptionalaction.notable.param.rule_title.
event.descriptionstringoptionalaction.notable.param.rule_description.
drilldown.namestringoptionalaction.notable.param.drilldown_name.
drilldown.searchstringoptionalaction.notable.param.drilldown_search.
security_domainstringoptionalaction.notable.param.security_domain, lowercased.

actions.risk

FieldTypeRequiredDescription
messagestringoptionalaction.risk.param._risk_message.
risk_objectslist[object]optionalEach item requires field (string), type (string), and score (int).
threat_objectslist[object]optionalEach item requires field (string) and type (string).

Risk and threat objects are sent together as action.risk.param._risk.

actions.email

FieldTypeRequiredDescription
to, cc, bccstringoptionalRecipients.
prioritystringoptionalMail priority.
subjectstringoptionalSubject line. Deploy key action.email.subject.
messagestringoptionalBody. Deploy key action.email.message.alert.
content_typestringoptionalaction.email.content_type.
send_csvbooleanoptionalaction.email.sendcsv as 1 or 0.
send_pdfbooleanoptionalaction.email.sendpdf as 1 or 0.
inline_resultsbooleanoptionalaction.email.inline as 1 or 0.
include.results_linkbooleanoptionalaction.email.include.results_link.
include.search_stringbooleanoptionalaction.email.include.search.
include.trigger_conditionbooleanoptionalaction.email.include.trigger.
include.trigger_timebooleanoptionalaction.email.include.trigger_time.
ValueDeploy
true / falseThat value.
omittedThe tenant's correlation_searches flag, which defaults to true.

When enabled, deploy sets action.correlationsearch.enabled and a label of <rule name> - Rule. Resolved ATT&CK techniques are written to action.correlationsearch.annotations.mitre_attack.

Legacy splunk::2.x keys

Normalisation runs before field validation. It is idempotent.

Legacy keyMoved to
searchquery, only when query is missing or blank
cron_schedulescheduling.schedule.cron, only when that schedule has neither cron nor frequency
scheduling.frequency, scheduling.cron, scheduling.custom_timescheduling.schedule.*
scheduling.lookbackscheduling.timerange.lookback
throttlingtrigger.throttling
thresholdtrigger.threshold
top-level notableactions.notable
top-level riskactions.risk
top-level emailactions.email

A flat key is not moved when the nested destination is already present. search and cron_schedule stay on the object.

Deploy

The saved-search description is the Tide rule description. response.responders is sent as alert.managedBy.

Block status strategySplunk result
DISABLEMENTdisabled = true
DELETIONHandled by deploy's removal path for the saved search
any otherSaved search enabled

Tenant modifiers in splunk.toml overlay savedsearches.conf keys after the block is compiled. Default modifiers fill gaps. Status, tenant, and flag modifiers overwrite.

Relationships

Defaults & overrides

FieldDefault
correlation_searchtenant correlation_searches, else true
trigger.severitymapped from response.alert_severity
frequency cron minute and hourtenant frequency_scheduling (random when unset on a tenant block)
lookback earliesttenant skew (allow_skew) and schedule_offset

Examples

v3:

configurations:
  splunk:
    enabled: true
    schema: platform::splunk::1.0
    status: STAGING
    query: |
      index=main sourcetype=WinEventLog EventCode=4688
      | head 1
    scheduling:
      schedule:
        frequency: 1h
      timerange:
        lookback: 2h
    trigger:
      condition: number of events
      comparator: greater than
      threshold: 0
      throttling:
        duration: 1h
        fields: [host]
    actions:
      notable:
        event:
          title: Suspicious process
        security_domain: threat

Legacy v2, still valid:

configurations:
  splunk:
    schema: splunk::2.0
    search: index=main | head 1
    cron_schedule: "0 * * * *"
    threshold: 0
    throttling:
      fields: [host]
      duration: 1h

Fixtures: fixtures/platforms/splunk.yaml, fixtures/platforms/splunk-legacy.yaml.

History

VersionDateNotes
1.02026-09-30Initial field contract, including the splunk::2.x normalisation the engine already applies.

On this page