Detection rules › Kusto

Conditional Access - A new Conditional Access policy was created

Severity
informational
Time window
5m
Source
github.com/Azure/Azure-Sentinel

A new Conditional Access policy was created in Entra ID.

MITRE ATT&CK coverage

Telemetry coverage

PlatformRecord / event type
AzureAdd conditional access policy

Rules detecting the same action

These rules filter on the same operation.

Rule body

id: 0459a1b5-909d-4783-9e27-24536b05a47f
name: Conditional Access - A new Conditional Access policy was created
version: 1.0.1
kind: Scheduled
description: A new Conditional Access policy was created in Entra ID.
severity: Informational
requiredDataConnectors:
  - connectorId: AzureActiveDirectory
    dataTypes:
      - AuditLogs
queryFrequency: 5m
queryPeriod: 5m
triggerOperator: gt
triggerThreshold: 0
tactics:
- DefenseEvasion
relevantTechniques:
  - T1562.007
query: |+
  // A new Conditional Access policy was created.
  AuditLogs
  | where OperationName in ("Add conditional access policy")
  | extend modifiedBy = tostring(InitiatedBy.user.userPrincipalName)
  | extend accountName = tostring(split(modifiedBy, "@")[0])
  | extend upnSuffix = tostring(split(modifiedBy, "@")[1])
  | project
      TimeGenerated,
      OperationName,
      policy = TargetResources[0].displayName,
      modifiedBy,
      accountName,
      upnSuffix,
      result = Result,
      newPolicy = TargetResources[0].modifiedProperties[0].newValue
  | order by TimeGenerated desc
entityMappings:
- entityType: Account
  fieldMappings:
  - identifier: Name
    columnName: accountName
  - identifier: UPNSuffix
    columnName: upnSuffix
suppressionEnabled: false
suppressionDuration: 5h
eventGroupingSettings:
  aggregationKind: AlertPerResult
incidentConfiguration:
  createIncident: true
  groupingConfiguration:
    enabled: false
    reopenClosedIncident: false
    lookbackDuration: PT1H
    matchingMethod: AllEntities
    groupByEntities: []
    groupByAlertDetails: []
    groupByCustomDetails: []

Stages and Predicates

Stage 1: source

AuditLogs

Stage 2: where

| where OperationName in ("Add conditional access policy")

Stage 3: extend (3 consecutive steps)

| extend modifiedBy = tostring(InitiatedBy.user.userPrincipalName)
| extend accountName = tostring(split(modifiedBy, "@")[0])
| extend upnSuffix = tostring(split(modifiedBy, "@")[1])

Stage 4: project

| project
    TimeGenerated,
    OperationName,
    policy = TargetResources[0].displayName,
    modifiedBy,
    accountName,
    upnSuffix,
    result = Result,
    newPolicy = TargetResources[0].modifiedProperties[0].newValue

Stage 5: sort

| order by TimeGenerated desc

Indicators

These rows show field, operator, and value matches.

Output fields

These fields are emitted when the rule matches.

FieldSource
OperationNameproject
TimeGeneratedproject
accountNameproject
modifiedByproject
newPolicyproject
policyproject
resultproject
upnSuffixproject