【问题标题】:Table Entry Comparison Against Static Array in KustoKusto 中与静态数组的表条目比较
【发布时间】:2021-08-31 13:02:18
【问题描述】:

我有一个多行多列的表,其中包含按用户名的登录事件。每行都提供其他详细信息,例如时间、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-explorer kql


    【解决方案1】:

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

    1. has_any_ipv4_prefix()
    2. has_any_ipv4()

    【讨论】:

    • 我认为这些函数中的任何一个都不会检查整个范围。例如,如果我的恶意 IP 范围列表中有范围 157.78.44.0/24,并且我的 SigninLogs 中有一个 IP 157.78.44.102 作为条目,那么我希望能够根据整个列表检查该 IP恶意 IP 范围数组中的范围。因此,因为 157.78.44.102 位于 157.78.44.0/24 的子网中,所以这是正确的,并且该行 SigninLogs 将被投影,因为它与恶意 IP 范围匹配
    • 157.78.44.0/24 范围扩展到从 157.78.44.1 到 157.78.44.254 的 Ips 列表。因此 has_any_ipv4_prefix(msg, ‘157.78.44.’) 可用于匹配。您是否在 Kusto 集群上尝试过这些功能?如果是这样,请提供一个具体的例子,我们会调查它。
    • 前缀功能也并非总是有效。如果子网掩码高于/24 且覆盖的C 类范围少于1 个,则不能应用前缀功能。例如,假设我们有范围 157.78.44.128/25 和 IP 157.78.44.102。 IP 不会是上述子网的成员,但如果我使用前缀函数 has_any_ipv4_prefix(msg, '157.78.44.'),IP 将匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多