如何使用in、join等KQL运算符匹配Azure Sentinel中CIDR IP段与登录IP
问题解答
首先明确结论:可以通过KQL实现IP地址与CIDR网段的匹配,但不能直接用in运算符(in仅支持精确值匹配,无法识别网段范围逻辑),需要配合KQL原生的IP处理函数和join运算符完成关联。
前置假设
我们先统一后续示例用到的表结构:
- Azure AD 登录日志表为官方默认的
SigninLogs,存储登录IP的字段为IPAddress - 存储CIDR网段的自定义表名为
CustomIPRanges,核心字段为CIDR(存储CIDR格式网段,如10.0.0.0/8),可搭配网段名称、风险等级等自定义业务字段。
实现方案
方案1:join + ipv4_is_match 函数(适用于CIDR网段数量较少的场景)
直接用交叉连接后调用IP匹配函数过滤,语法简单直接:
SigninLogs // 与自定义IP网段表做交叉连接 | join kind=inner CustomIPRanges on $left.IPAddress != $right.CIDR // 无关联键的交叉连接写法 // 匹配IP是否属于对应CIDR网段 | where ipv4_is_match(IPAddress, CIDR) // 按需保留需要的字段 | project TimeGenerated, UserPrincipalName, IPAddress, CIDR, 网段名称, 风险等级
如果是IPv6场景,将ipv4_is_match替换为ipv6_is_match即可。
方案2:ipv4_lookup 运算符(适用于CIDR网段数量较大的场景,性能更优)
KQL提供了专门优化过的IP网段查找运算符,针对大量CIDR的匹配场景做了性能优化,比普通join效率高很多:
// 先将自定义CIDR表转换为ipv4_lookup要求的输入格式 let CIDR_Lookup_Table = CustomIPRanges | project CIDR, 网段名称, 风险等级; // 对登录日志的IP做网段匹配 SigninLogs | evaluate ipv4_lookup(CIDR_Lookup_Table, IPAddress, CIDR) // 匹配不到的条目会自动填充空值,可按需过滤 | where isnotempty(CIDR)
同样IPv6场景下替换为ipv6_lookup即可。
注意事项
- 若你的自定义表字段名、日志IP字段名和示例不一致,替换为实际使用的字段名即可
- 不要尝试用in运算符直接匹配CIDR,该运算符仅支持全字匹配单个值,无法识别网段范围规则
内容的提问来源于stack exchange,提问作者Ankit Joshi
相关产品推荐
相关产品推荐

