↳ Source GitHubRègle analytiqueMedium

PRODAFT USTA - TI map Domain to DnsEvents

Description

'Identifies a match in DnsEvents from any domain-name indicator ingested from PRODAFT USTA IoC Threat Intelligence (SourceSystem starting with "PRODAFT USTA").'
Type de règle
Scheduled
Version
1.0.0
Fréquence
1h
Période analysée
14d
Déclenchement
gt 0

Couverture MITRE déclarée

Sources déclarées

Métadonnées du fichier source. Aucune dépendance déduite du KQL.

Connecteurs

Types de données

Requête KQL

Requête originale, sans modification.

let dt_lookBack = 1h;
let ioc_lookBack = 14d;
let Domain_Indicators = ThreatIntelIndicators
  // Each USTA IoC feed uploads under its own SourceSystem ("PRODAFT USTA - Malicious URLs", etc.)
  | where SourceSystem startswith "PRODAFT USTA"
  | extend IndicatorType = replace(@"\[|\]|\""", "", tostring(split(ObservableKey, ":", 0)))
  | where IndicatorType == "domain-name"
  | extend DomainName = tolower(ObservableValue)
  | extend TrafficLightProtocolLevel = tostring(parse_json(AdditionalFields).TLPLevel)
  | where TimeGenerated >= ago(ioc_lookBack)
  | summarize LatestIndicatorTime = arg_max(TimeGenerated, *) by Id, ObservableValue
  | where IsActive and (ValidUntil > now() or isempty(ValidUntil));
// TLD allow-list built from the feed: lets the DnsEvents scan discard most rows before the join
let maxListSize = 100000;
let list_tlds = Domain_Indicators
  | extend parts = split(DomainName, '.')
  | extend tld = parts[(array_length(parts)-1)]
  | extend IndicatorId = tostring(split(Id, "--")[2])
  | summarize count() by tostring(tld)
  | project tld
  | summarize make_list(tld, maxListSize);
Domain_Indicators
 | project-reorder *, IsActive, Tags, TrafficLightProtocolLevel, DomainName, Type
  // innerunique: one match per indicator is enough to alert, and it keeps the join cheap
  | join kind=innerunique (
    DnsEvents
    | where TimeGenerated > ago(dt_lookBack)
    | where isnotempty(Name)
    // DnsEvents.Name keeps the queried casing; the indicator side is lowercased, and the join below is case-sensitive
    | extend Name = tolower(Name)
    | extend parts = split(Name, '.')
    | extend tld = parts[(array_length(parts)-1)]
    | where tld in~ (list_tlds)
    | extend DNS_TimeGenerated = TimeGenerated
  ) on $left.DomainName==$right.Name
  // non-expiring indicators are allowed above, so they must survive this filter too
  | where isempty(ValidUntil) or DNS_TimeGenerated < ValidUntil
  | summarize DNS_TimeGenerated = arg_max(DNS_TimeGenerated, *) by Id, Name
  | extend Description = tostring(parse_json(Data).description)
  | extend IndicatorTags = tostring(parse_json(Data).labels)
  | project DNS_TimeGenerated, Description, IndicatorTags, Id, ValidUntil, Confidence, Computer, ClientIP
  | extend HostName = tostring(split(Computer, '.', 0)[0]), DnsDomain = tostring(strcat_array(array_slice(split(Computer, '.'), 1, -1), '.'))
  | extend timestamp = DNS_TimeGenerated

Entités déclarées

HostIP

Contenus associés

Liens établis à partir des identifiants déclarés et des manifests des solutions.

Traçabilité de la source

GitHub

Les valeurs affichées proviennent des fichiers du dépôt Azure/Azure-Sentinel. Elles décrivent le modèle publié, pas la configuration de votre workspace.

Identifiant source
c6f85aff-4ef0-4fde-b90e-e0ba1a9c3df6
Autres fichiers source 2Solutions/PRODAFT USTA - IoC Threat Intelligence/Analytic Rules/TIMapDomainToDnsEvents.yamlsource ↗Solutions/PRODAFT USTA - IoC Threat Intelligence/Data/Solution_PRODAFTUstaIoC.jsonsolution-membership ↗
GSTEP / SUIVI DU CATALOGUE

Ajouté au catalogue : 16 sept. 2026 · 05:49 UTC
Dernier changement observé : 16 sept. 2026 · 05:49 UTC

Dates de synchronisation GSTEP, distinctes des dates de publication du contenu source.