An Azure service that provides a cloud content delivery network with threat protection.
The existing answer above is correct on the schema and the watchlist enrichment pattern. However, I want to add a few practical points from running similar detections in production, because watchlist joins are one of the most common sources of silent failures in Sentinel rules.
- Normalize both sides of the join
The most frequent reason a watchlist enrichment appears to "not work" is formatting mismatch. CSVs exported from IP-to-ASN providers often have trailing spaces or mixed casing. Always normalize:
let AsnMap = _GetWatchlist('ip-to-asn')
| project SearchKey = tolower(trim(@"\s", SearchKey)),
ASN, Organization;
AzureDiagnostics
| where Category == "FrontDoorWebApplicationFirewallLog"
| where action_s == "Block"
| where resourceName_s == "<your-FrontDoor-resource>"
| extend EvaluatedIP = tolower(trim(@"\s", socketIP_s))
| lookup kind=leftouter AsnMap on $left.EvaluatedIP == $right.SearchKey
| project TimeGenerated, EvaluatedIP, ASN, Organization,
action_s, ruleName_s, requestUri_s
- lookup vs join vs in
Use lookup (as shown above) when you want to enrich logs with watchlist columns (ASN, Organization).
Use 'in' when you only need to filter (e.g., "is this IP on my blocklist?"). 'in' is significantly more performant on large log tables because it avoids the shuffle that join/lookup triggers.
Avoid 'join kind=inner' for enrichment — it will drop log rows that don't match the watchlist, which is usually not what you want for a WAF analysis.
- Watchlist refresh cadence
ASN-to-IP mappings drift. If you're populating this watchlist via a Logic App or API, set it to refresh at least weekly. A stale watchlist will give you confident but wrong ASN labels, which is worse than no label at all.
- Debugging tip
If the lookup returns empty ASN columns, run this sanity check first:
_GetWatchlist('ip-to-asn') | take 5
Check for leading spaces in SearchKey — this is the #1 cause I've seen in the field.
Hope this helps. Happy to clarify if you hit any schema quirks with your specific Front Door instance.