在Azure Monitor工作簿中结合资源图查询与日志查询,将Azure防火墙日志SourceIp映射至对应虚拟网络的解决方案咨询
在Azure Monitor工作簿中结合资源图查询与日志查询,将Azure防火墙日志SourceIp映射至对应虚拟网络的解决方案咨询
看起来你遇到的核心问题是没法把资源图里的虚拟网络地址段和防火墙日志的SourceIp做范围关联——毕竟资源图查询和日志查询不能直接混写,默认的合并功能也只支持等值匹配,确实挺头疼的。下面给你几个可行的解决思路,亲测有效的那种:
方案一:用Kusto Join结合IP范围判断函数直接关联
这是最直接的方式,利用Azure Monitor日志查询支持的ipv4_is_in_range()函数,把资源图查询作为子查询嵌套到日志查询里,实现IP和VNet地址段的匹配:
完整查询示例
// 先获取所有VNet的ID和拆分后的地址前缀 let vnetAddressSpaces = arg("").resources | where type == "microsoft.network/virtualnetworks" // 取出VNet的地址前缀数组,注意资源图里的属性路径写法 | extend AddressPrefixes = properties.addressSpace.addressPrefixes | project VNetId = id, AddressPrefixes // 把地址前缀数组拆成单独的行,指定类型为字符串避免类型问题 | mv-expand AddressPrefixes to typeof(string); // 关联防火墙日志,判断SourceIp是否在VNet地址段内 AZFWDnsQuery | project SourceIp, TimeGenerated, QueryContent = Query | join kind=inner vnetAddressSpaces on $left.SourceIp ipv4_is_in_range $right.AddressPrefixes // 最终展示需要的字段 | project TimeGenerated, SourceIp, VNetId, QueryContent, MatchedAddressPrefix = AddressPrefixes
这个方法的关键是用ipv4_is_in_range()作为join的匹配条件,替代了传统的等值匹配,完美解决了你需要的"IP在某个范围里"的判断需求。
方案二:把VNet地址段保存为工作簿参数,复用查询结果
如果你的VNet地址段不会频繁变更,可以把资源图的查询结果保存为工作簿参数,这样后续日志查询可以直接复用,提升效率:
创建VNet地址前缀参数
- 在工作簿里新建一个参数,类型选择「Resource Graph Query」
- 输入以下查询:
resources | where type == "microsoft.network/virtualnetworks" | extend AddressPrefixes = properties.addressSpace.addressPrefixes | mv-expand AddressPrefixes to typeof(string) | summarize VNetPrefixList = make_set(AddressPrefixes) - 参数命名比如叫
VNetAddressPrefixes,保存后它会返回一个所有VNet地址前缀的数组。
在日志查询中使用参数过滤并关联
// 引入参数里的地址前缀数组 let vnetPrefixes = dynamic('{{VNetAddressPrefixes}}'); AZFWDnsQuery | project SourceIp, TimeGenerated, QueryContent = Query // 先过滤出属于VNet的IP | extend IsInVNet = array_length(filter(vnetPrefixes, p => ipv4_is_in_range(SourceIp, p))) > 0 | where IsInVNet == true // 再关联对应的VNet信息 | join kind=inner ( arg("").resources | where type == "microsoft.network/virtualnetworks" | extend AddressPrefixes = properties.addressSpace.addressPrefixes | project VNetId = id, AddressPrefixes | mv-expand AddressPrefixes to typeof(string) ) on $left.SourceIp ipv4_is_in_range $right.AddressPrefixes | project TimeGenerated, SourceIp, VNetId, QueryContent
关于你遇到的mv-expand问题的说明
你之前测试里的mv-expand失效,大概率是因为没有指定类型转换。资源图返回的addressPrefixes是动态数组,在mv-expand的时候加上to typeof(string)就能正确拆分成单独的行,比如:
arg("").resources | where type == "microsoft.network/virtualnetworks" | extend addressPrefixes = dynamic(['10.200.19.0/26', '10.200.26.0/26']) | project addressPrefixes | mv-expand addressPrefixes to typeof(string)
这样就能正常展开每个地址前缀了。
备注:内容来源于stack exchange,提问作者JoakimE
相关产品推荐
相关产品推荐

