Back
Idb4c5d6e7-1234-5678-90ab-cdef12345010
RulenameTailscale: Split-DNS configuration modified
DescriptionIdentifies when the tailnet split-DNS configuration is modified. Split-DNS overrides per-domain resolution within the tailnet - an attacker adding a new domain mapping or changing the resolver IP can hijack DNS for that domain.
SeverityHigh
TacticsDefenseEvasion
CommandAndControl
TechniquesT1556
T1568
Required data connectorsTailscaleCCF
KindScheduled
Query frequency15m
Query period15m
Trigger threshold0
Trigger operatorgt
Source Urihttps://github.com/Azure/Azure-Sentinel/blob/master/Solutions/Tailscale%20%28CCF%29/Analytic%20Rules/TailscaleSplitDnsModified.yaml
Version1.0.0
Arm templateb4c5d6e7-1234-5678-90ab-cdef12345010.json
Deploy To Azure
Tailscale_Audit_CL
| where Action == "UPDATE"
| where tostring(Target.type) == "TAILNET"
| where tostring(Target.property) == "DNS_SPLIT_DNS"
| extend ActorLogin = tostring(Actor.loginName)
| extend OldDomains = bag_keys(Old)
| extend NewDomains = bag_keys(New)
| extend AddedDomains = set_difference(NewDomains, OldDomains)
| extend RemovedDomains = set_difference(OldDomains, NewDomains)
| project TimeGenerated, ActorLogin, AddedDomains, RemovedDomains, Old, New, Origin
incidentConfiguration:
  groupingConfiguration:
    lookbackDuration: P1D
    reopenClosedIncident: false
    matchingMethod: AllEntities
    enabled: true
  createIncident: true
name: 'Tailscale: Split-DNS configuration modified'
triggerOperator: gt
query: |
  Tailscale_Audit_CL
  | where Action == "UPDATE"
  | where tostring(Target.type) == "TAILNET"
  | where tostring(Target.property) == "DNS_SPLIT_DNS"
  | extend ActorLogin = tostring(Actor.loginName)
  | extend OldDomains = bag_keys(Old)
  | extend NewDomains = bag_keys(New)
  | extend AddedDomains = set_difference(NewDomains, OldDomains)
  | extend RemovedDomains = set_difference(OldDomains, NewDomains)
  | project TimeGenerated, ActorLogin, AddedDomains, RemovedDomains, Old, New, Origin
queryFrequency: 15m
description: |
  Identifies when the tailnet split-DNS configuration is modified. Split-DNS overrides per-domain resolution within the tailnet - an attacker adding a new domain mapping or changing the resolver IP can hijack DNS for that domain.
id: b4c5d6e7-1234-5678-90ab-cdef12345010
triggerThreshold: 0
queryPeriod: 15m
version: 1.0.0
kind: Scheduled
status: Available
severity: High
requiredDataConnectors:
- connectorId: TailscaleCCF
  dataTypes:
  - Tailscale_Audit_CL
OriginalUri: https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/Tailscale%20%28CCF%29/Analytic%20Rules/TailscaleSplitDnsModified.yaml
relevantTechniques:
- T1556
- T1568
tactics:
- DefenseEvasion
- CommandAndControl
entityMappings:
- fieldMappings:
  - identifier: FullName
    columnName: ActorLogin
  entityType: Account
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "workspace": {
      "type": "String"
    }
  },
  "resources": [
    {
      "apiVersion": "2024-01-01-preview",
      "id": "[concat(resourceId('Microsoft.OperationalInsights/workspaces/providers', parameters('workspace'), 'Microsoft.SecurityInsights'),'/alertRules/b4c5d6e7-1234-5678-90ab-cdef12345010')]",
      "kind": "Scheduled",
      "name": "[concat(parameters('workspace'),'/Microsoft.SecurityInsights/b4c5d6e7-1234-5678-90ab-cdef12345010')]",
      "properties": {
        "alertRuleTemplateName": "b4c5d6e7-1234-5678-90ab-cdef12345010",
        "customDetails": null,
        "description": "Identifies when the tailnet split-DNS configuration is modified. Split-DNS overrides per-domain resolution within the tailnet - an attacker adding a new domain mapping or changing the resolver IP can hijack DNS for that domain.\n",
        "displayName": "Tailscale: Split-DNS configuration modified",
        "enabled": true,
        "entityMappings": [
          {
            "entityType": "Account",
            "fieldMappings": [
              {
                "columnName": "ActorLogin",
                "identifier": "FullName"
              }
            ]
          }
        ],
        "incidentConfiguration": {
          "createIncident": true,
          "groupingConfiguration": {
            "enabled": true,
            "lookbackDuration": "P1D",
            "matchingMethod": "AllEntities",
            "reopenClosedIncident": false
          }
        },
        "OriginalUri": "https://github.com/Azure/Azure-Sentinel/blob/master/Solutions/Tailscale%20%28CCF%29/Analytic%20Rules/TailscaleSplitDnsModified.yaml",
        "query": "Tailscale_Audit_CL\n| where Action == \"UPDATE\"\n| where tostring(Target.type) == \"TAILNET\"\n| where tostring(Target.property) == \"DNS_SPLIT_DNS\"\n| extend ActorLogin = tostring(Actor.loginName)\n| extend OldDomains = bag_keys(Old)\n| extend NewDomains = bag_keys(New)\n| extend AddedDomains = set_difference(NewDomains, OldDomains)\n| extend RemovedDomains = set_difference(OldDomains, NewDomains)\n| project TimeGenerated, ActorLogin, AddedDomains, RemovedDomains, Old, New, Origin\n",
        "queryFrequency": "PT15M",
        "queryPeriod": "PT15M",
        "severity": "High",
        "status": "Available",
        "subTechniques": [],
        "suppressionDuration": "PT1H",
        "suppressionEnabled": false,
        "tactics": [
          "CommandAndControl",
          "DefenseEvasion"
        ],
        "techniques": [
          "T1556",
          "T1568"
        ],
        "templateVersion": "1.0.0",
        "triggerOperator": "GreaterThan",
        "triggerThreshold": 0
      },
      "type": "Microsoft.OperationalInsights/workspaces/providers/alertRules"
    }
  ]
}