opentide

Microsoft Sentinel (`platform::sentinel::1.0`)

`configurations.sentinel` is a Microsoft Sentinel scheduled analytics rule, or a near-real-time (NRT) rule when `scheduling.nrt` is true. The detection text is KQL. Query validation is supported. The analytics rule id sent to Sentinel is the rule's `metadata.uuid`.

Shared fields (enabled, name, schema, status, flags, tenants, contributors) are defined in platforms.

Requirements

  • Static validation MUST require query, scheduling, and alert.
  • query MUST be non-blank KQL.
  • scheduling MAY omit frequency, lookback, and nrt and still validate.
  • alert MAY be an empty object and still validate. suppression defaults to false. create_incident defaults to true.
  • The Sentinel loader treats a missing scheduling or alert as an empty object, and it drops keys it does not map. Static validation still requires both objects and rejects unknown keys.
  • grouping, entities, exclusions, template, and trigger MAY be omitted and still validate.
  • Deploy of a non-NRT rule MUST fail when scheduling.frequency or scheduling.lookback is missing.
  • Deploy MUST fail when grouping is missing, and MUST fail when grouping.alert is missing.
  • Deploy MUST fail when alert.suppression is boolean true. The value MUST be false or a duration string.
  • Every duration (scheduling.frequency, scheduling.lookback, alert.suppression, grouping.alert.grouping_lookback) MUST be ISO 8601 or shorthand (Durations). Deploy MUST fail on a duration in neither form. Static validation accepts any string.
  • When grouping.alert.enabled is true, deploy MUST fail when grouping.alert.grouping_lookback is missing.
  • scheduling.nrt: true MUST deploy an NRT rule and MUST NOT require frequency, lookback, or trigger.

Definition

Block

FieldTypeRequiredDefaultDescription
querystringyes—KQL. Multiline. Compiled with matching exclusions before deploy.
schedulingSentinelSchedulingyes—Run cadence, or NRT.
alertSentinelAlertyes—Alert and incident presentation.
groupingSentinelGroupingoptionalnullEvent grouping and incident grouping. Required at deploy.
entitieslist[SentinelEntityMapping]optionalnullEntity mappings from result columns.
exclusionslist[SentinelExclusion]optionalnullPer-tenant KQL fragments appended to query.
templateSentinelTemplateoptionalnullAnalytics-rule template this rule was built from.
triggerSentinelTriggeroptionalnullResult threshold. Ignored when scheduling.nrt is true.

scheduling (SentinelScheduling)

FieldTypeRequiredDefaultDescription
nrtbooleanoptionalnulltrue deploys kind: NRT and skips frequency, lookback, and trigger.
frequencystringoptionalnullDuration: ISO 8601, or shorthand converted to ISO 8601. How often a scheduled rule runs (PT1H). Required at deploy unless nrt is true.
lookbackstringoptionalnullDuration: ISO 8601, or shorthand converted to ISO 8601. Query window (PT2H). Required at deploy unless nrt is true.

Deploy sends frequency as Sentinel queryFrequency and lookback as queryPeriod.

alert (SentinelAlert)

FieldTypeRequiredDefaultDescription
titlestringoptionalnullAlert display-name format. Empty leaves the Sentinel default. The rule name is still the analytics-rule display name.
descriptionstringoptionalnullAlert description format.
severitystringoptionalnullSentinel severity. When omitted, deploy uses response.alert_severity. Critical is sent as High.
suppressionstring | booleanoptionalfalsefalse disables suppression and sends a one-hour duration. A duration, ISO 8601 or shorthand, enables suppression for that long. Boolean true fails deploy.
create_incidentbooleanoptionaltrueWhether a firing alert opens an incident.
tacticslist[string]optionalnullSentinel tactic names (the ARM AttackTactic enum). Replaced when the rule's ATT&CK techniques resolve to tactics: each att&ck stage maps to the tactic of the same name. Stealth, Defense Impairment, and the ICS Evasion tactic map to DefenseEvasion. A stage with no Sentinel tactic is dropped.
techniqueslist[string]optionalnullTechnique ids. Replaced by the rule's resolved techniques when those exist.
custom_detailslist[CustomDetail]optionalnullExtra alert properties.
dynamic_propertieslist[DynamicProperty]optionalnullColumn-driven alert properties.

custom_details[]:

FieldTypeRequiredDescription
keystringyesAlert property name.
columnstringyesResult column.

dynamic_properties[]:

FieldTypeRequiredDescription
propertystringyesSentinel alert property. Tactics and Severity are sent as the tactics and severity column overrides. Any other value is an alert dynamic property.
columnstringyesResult column.

grouping (SentinelGrouping)

FieldTypeRequiredDefaultDescription
eventstringyes—Sentinel aggregationKind. SingleAlert groups events into one alert. AlertPerResult emits one alert per row.
alertSentinelAlertGroupingoptionalnullIncident grouping. Required at deploy.

grouping.alert (SentinelAlertGrouping)

FieldTypeRequiredDefaultDescription
enabledbooleanyes—Group alerts into one incident.
reopen_closed_incidentsbooleanoptionalnullReopen a matching closed incident. Deploy sends false when omitted.
grouping_lookbackstringoptionalnullDuration: ISO 8601, or shorthand converted to ISO 8601. Required at deploy when enabled is true. When enabled is false and this is omitted, deploy sends PT1H.
matchingstringoptionalnullSentinel matching method. Deploy sends AllEntities when omitted.
group_by_entitieslist[string]optionalnullEntity types used when matching is selective.
group_by_alert_detailslist[string]optionalnullAlert-detail fields used when matching is selective.
group_by_custom_detailslist[string]optionalnullCustom-detail keys used when matching is selective.

entities[] (SentinelEntityMapping)

FieldTypeRequiredDescription
entitystringyesSentinel entity type (Account, Host, IP, URL, …).
mappingslist[Mapping]yesColumn bindings for that entity.

mappings[]:

FieldTypeRequiredDescription
identifierstringyesEntity identifier (Name, Address, …).
columnstringyesResult column.

exclusions[] (SentinelExclusion)

Applied at deploy for the target tenant. An exclusion with no tenant, or with tenant equal to the target, is included. Others are skipped.

FieldTypeRequiredDefaultDescription
querystringyes—KQL fragment appended after the base query. The key is required. An empty string is accepted (this field is not the non-blank rule query).
reasonstringyes—Why the exclusion exists. Not sent to Sentinel.
tenantstringoptionalnullLimit the exclusion to one tenant name.
letmap[string, scalar]optionalnullKQL let bindings prepended to the query. Values may be string, number, or boolean. Other types are skipped. The last definition of a name wins.

template (SentinelTemplate)

FieldTypeRequiredDescription
uuidstringyesSentinel alert-rule template name.
versionstringyesTemplate version.

trigger (SentinelTrigger)

FieldTypeRequiredDescription
operatorstringyesSentinel trigger operator.
thresholdintyesSentinel trigger threshold.

Sent only for scheduled rules. Omitted on NRT rules.

Durations

ISO 8601 is the documented form of every Sentinel duration (PT1H, PT30M, P1D, P1DT2H), and the form templates and examples use. Sentinel durations are whole weeks, days, hours, minutes, and seconds; years, months, and fractions are not supported.

Shorthand is also accepted: single-unit (30m, 1h, 1d) or compound (1h10m, 1d2h, 2m30s). It is the shorthand grammar of Elastic Security: whole numbers with the lower-case units d, h, m, and s, in that order, each at most once. A shorthand value is the same duration as its ISO 8601 form (1h10m is PT1H10M). Deploy converts every duration to ISO 8601 before it reaches Sentinel, so the API never receives shorthand.

WrittenSent
PT1HPT1H
1hPT1H
1h10mPT1H10M
1d2hP1DT2H
2m30sPT2M30S

The Sent column is the duration. An implementation MAY zero-pad the time fields (PT01H00M00S); Sentinel reads both spellings as the same duration.

Deploy

Block status strategySentinel result
DISABLEMENTRule updated with enabled: false
DELETIONAnalytics rule deleted by metadata.uuid
any otherRule created or updated with enabled: true

The rule display name is the Tide rule name. The description is the Tide rule description. Severity prefers alert.severity, then response.alert_severity.

Relationships

Defaults & overrides

FieldDefault
alert.suppressionfalse
alert.create_incidenttrue
grouping.alert.reopen_closed_incidentsfalse at deploy when omitted
grouping.alert.matchingAllEntities at deploy when omitted
grouping.alert.grouping_lookbackPT1H at deploy when grouping is disabled and the field is omitted
Alert severityresponse.alert_severity, then the block value if set
Critical severitysent as High

Examples

configurations:
  sentinel:
    enabled: true
    schema: platform::sentinel::1.0
    status: STAGING
    query: |
      SecurityEvent
      | where EventID == 4688
      | take 1
    scheduling:
      frequency: PT1H
      lookback: PT2H
    alert:
      title: Suspicious process creation
      severity: High
      suppression: false
      create_incident: true
    grouping:
      event: SingleAlert
      alert:
        enabled: false
    entities:
      - entity: Account
        mappings:
          - identifier: Name
            column: Account

NRT omits the schedule window:

scheduling:
  nrt: true

Fixture: fixtures/platforms/sentinel.yaml. The rule-object fixture fixtures/valid/rule-1.0.yaml carries the same scheduled shape.

History

VersionDateNotes
1.02026-09-30Initial field contract from the Sentinel configuration model and deployer.
1.12026-10-19tactics: ATT&CK v19 renamed Defense Evasion (TA0005) to Stealth and split out Defense Impairment (TA0112). Both, and the ICS Evasion tactic, deploy as DefenseEvasion, the only Sentinel tactic for them. A stage with no Sentinel tactic is dropped (opentide#568). Schema id unchanged.
1.12026-10-19Durations: ISO 8601 stays the documented form; shorthand, single-unit or compound (30m, 1h10m, 1d2h, 2m30s), with the grammar of Elastic Security, is accepted and converted to ISO 8601 at deploy (opentide#564 and the opentide 0.16.0 follow-up, which makes shorthand case-sensitive and adds seconds). Applies to scheduling.frequency, scheduling.lookback, alert.suppression, and grouping.alert.grouping_lookback. Schema id unchanged.

On this page