首页 > 解决方案 > Kusto 中与静态数组的表条目比较

问题描述

我有一个多行多列的表,其中包含按用户名的登录事件。每行提供其他详细信息,例如时间、IP 地址、设备信息、位置信息等。我有另一个表,它是单行,包含多列 IPv4 范围(监视列表)。这些 IPv4 范围被认为是“恶意的”。我希望能够从 SigninLogs 表中返回数据,并将每行的 IP 地址元素与每个 IPv4 范围进行比较,以验证 IP 地址是否是“恶意”表中找到的任何 IP 范围的成员。如果此条件为真,我希望执行特定操作。对 IPv4 子网执行“范围”分析的函数是

ipv4_is_in_range(<IP Address>, <IP Range>)

我尝试了几种不同的方法,但都无济于事。这是我尝试过的策略示例:

let GetPackage = (v_IPAddress: string){
    _GetWatchlist('Bad_IP_Ranges')
    | summarize IPAddresses = make_list(pack_array(IPAddress))
    | mv-apply IPAddresses on ( 
        where ipv4_is_in_range(v_IPAddress, tostring(IPAddresses))
    )
};
SigninLogs
| union AADNonInteractiveUserSignInLogs
| extend Malicious_IP = iff(GetPackage(IPAddress), IPAddress, "null")
| project TimeGenerated, Category, ResultType, ResultDescription, Identity, Malicious_IP, AppDisplayName
| order by TimeGenerated | take 1000

这给出了一个错误:

iff(): argument #1 must be a scalar expression

我知道它抱怨 GetPackage() 函数返回一个表格值,但如果 where 语句为真,我不知道如何强制 GetPackage() 函数只返回恶意 IP 地址。

标签: azure-data-explorerkql

解决方案


这里有几个新方法应该会有所帮助(请注意,它们仅在您使用 EngineV3 时可用):

  1. has_any_ipv4_prefix()
  2. has_any_ipv4()

推荐阅读