Detection rules › Kusto

UniFi Site Manager: New critical notifications appeared

Status
available
Severity
medium
Time window
45m
Group by
siteId_s
Source
github.com/Azure/Azure-Sentinel

Identifies when the UniFi critical-notification count increases since the previous poll, signaling at least one new critical-severity alarm has appeared.

MITRE ATT&CK coverage

TacticTechniques
Impact

Rule body

id: e4b75722-7239-f247-558f-d2e851ea0b38
name: "UniFi Site Manager: New critical notifications appeared"
description: |
  Identifies when the UniFi critical-notification count increases since the previous poll, signaling at least one new critical-severity alarm has appeared.
severity: Medium
status: Available
requiredDataConnectors:
  - connectorId: UniFiSiteManagerConnectorDefinition
    dataTypes:
      - Unifi_SiteManager_Sites_CL
queryFrequency: 15m
queryPeriod: 45m
triggerOperator: gt
triggerThreshold: 0
tactics:
  - Impact
relevantTechniques:
  - T1499
subTechniques:
  - T1499.002
query: |
  let prev = Unifi_SiteManager_Sites_CL
      | where TimeGenerated between (ago(30m) .. ago(15m))
      | summarize arg_max(TimeGenerated, *) by tostring(SiteId)
      | project siteId_s = tostring(SiteId), prevCritical = CriticalNotifications;
  Unifi_SiteManager_Sites_CL
  | where TimeGenerated > ago(15m)
  | summarize arg_max(TimeGenerated, *) by tostring(SiteId)
  | extend siteId_s = tostring(SiteId), CriticalCount = CriticalNotifications
  | join kind=inner prev on siteId_s
  | where CriticalCount > prevCritical
  | extend NewCriticals = CriticalCount - prevCritical
  | extend Activity = strcat(NewCriticals, ' new critical notification(s) - count went ', prevCritical, ' -> ', CriticalCount)
  | project TimeGenerated, SiteId, SiteName, Activity, prevCritical, CriticalCount, NewCriticals
entityMappings:
  - entityType: Host
    fieldMappings:
      - identifier: HostName
        columnName: SiteId
      - identifier: DnsDomain
        columnName: SiteName
incidentConfiguration:
  createIncident: true
  groupingConfiguration:
    enabled: true
    reopenClosedIncident: false
    lookbackDuration: PT5H
    matchingMethod: AllEntities
kind: Scheduled
version: 1.0.1

Stages and Predicates

Let binding: prev used in Stage 5

let prev = Unifi_SiteManager_Sites_CL
    | where TimeGenerated between (ago(30m) .. ago(15m))
    | summarize arg_max(TimeGenerated, *) by tostring(SiteId)
    | project siteId_s = tostring(SiteId), prevCritical = CriticalNotifications;

Stage 1: source

Unifi_SiteManager_Sites_CL

Stage 2: where

| where TimeGenerated > ago(15m)

Stage 3: summarize

| summarize arg_max(TimeGenerated, *) by tostring(SiteId)

Stage 4: extend

| extend siteId_s = tostring(SiteId), CriticalCount = CriticalNotifications

Stage 5: join

| join kind=inner prev on siteId_s

Stage 6: where

| where CriticalCount > prevCritical

Stage 7: extend

| extend NewCriticals = CriticalCount - prevCritical

Stage 8: extend

| extend Activity = strcat(NewCriticals, ' new critical notification(s) - count went ', prevCritical, ' -> ', CriticalCount)

Stage 9: project

| project TimeGenerated, SiteId, SiteName, Activity, prevCritical, CriticalCount, NewCriticals

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
CriticalCountcross_field_compare
  • prevCritical transforms: op:gt
field:"CriticalCount" kind:cross_field_compare value:"prevCritical"

Output fields

These fields are emitted when the rule matches.

FieldSource
Activityproject
CriticalCountproject
NewCriticalsproject
SiteIdproject
SiteNameproject
TimeGeneratedproject
prevCriticalproject