Detection rules › Kusto
UniFi Site Manager: New critical notifications appeared
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
| Tactic | Techniques |
|---|---|
| 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
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.
| Field | Kind | Values | Search |
|---|---|---|---|
CriticalCount | cross_field_compare |
| field:"CriticalCount" kind:cross_field_compare value:"prevCritical" |
Output fields
These fields are emitted when the rule matches.
| Field | Source |
|---|---|
Activity | project |
CriticalCount | project |
NewCriticals | project |
SiteId | project |
SiteName | project |
TimeGenerated | project |
prevCritical | project |