基于另一个查询结果的 Splunk 查询

Splunk query based on the results of another query

Splunk 问题...

我发现了一些 Google 我认为会对此有所帮助的命中。我正在尝试搜索由外部 search/query.

编辑的所有 "rows"

我绝不是 Splunk 专家,甚至不是高级用户!

外部查询针对 Active Directory 执行 LDAP 搜索,returns 具有特定组成员身份的人员列表(例如:所有域管理员或帐户操作员等)

然后我想根据 Windows 事件日志对每个 returned 用户名进行搜索……并将结果 return 作为一个数据集。

我已经确定了 LDAP 搜索。我已经确定了 Windows 事件日志搜索。我只需要将它们拼接在一起即可。

如果我在脚本中对此进行编码,我会:

i) 将相关组成员枚举到一个数组中。 运行 数组中存在的用户的事件日志查询,例如:使用 isin() 或 contains() 等语义;要么 ii) 枚举组成员并执行 foreach() 类型循环。

那么,#?!@ 我如何在 Splunk 中执行此操作。我试过使用 "search" 命令和 "foreach" 命令,但没有任何乐趣。我什至玩弄了一个查找并尝试了 isin(),但无法让它工作。

LDAP 搜索示例:

| ldapsearch domain="contoso.com" search="(&(objectclass=user)(objectCategory=person)(memberOf=CN=Domain Admins,OU=MyContainer,DC=contoso,DC=com))" attrs="sAMAccountName" basedn="DC=contoso,DC=com" | eval ldapSearchUserName="contoso\"+lower(sAMAccountName)

示例事件日志搜索:

index="wineventlog" source="WinEventLog:Security" sourcetype="WinEventLog:Security" "LogName=Security" "EventCode=4624" earliest=-1d | rex field=Message ".*Logon Type:\s+(?<LogonType>\d+)" | eval UserName=mvindex(Security_ID, 1) | table UserName

有什么想法、提示或指导吗?

非常感谢

S

首先,让我试着澄清一些事情。

Splunk returns 结果为 table。行称为 'events',列称为 'fields'。大多数搜索命令一次只能处理一个事件。

foreach 命令循环处理单个事件中的字段。使用 map 命令循环事件(这可能很慢)。

Splunk 支持嵌套查询。 "inner" 查询称为 'subsearch',"outer" 查询称为 "main search"。子搜索包含在方括号 [] 中并且总是首先执行。这意味着子搜索的结果会传递给主搜索,而不是相反。

解决您的问题的一种方法是在子搜索中执行 ldapsearch,然后让这些结果成为主搜索的一部分。

index="wineventlog" source="WinEventLog:Security" sourcetype="WinEventLog:Security" "LogName=Security" "EventCode=4624" earliest=-1d 
| rex field=Message ".*Logon Type:\s+(?<LogonType>\d+)" 
| eval UserName=mvindex(Security_ID, 1) 
| search [| ldapsearch domain="contoso.com" search="(&(objectclass=user)(objectCategory=person)(memberOf=CN=Domain Admins,OU=MyContainer,DC=contoso,DC=com))" attrs="sAMAccountName" basedn="DC=contoso,DC=com" 
| eval UserName="contoso\"+lower(sAMAccountName)|fields UserName | format]
| table UserName

此处,LDAP 搜索正在将用户列表提取到名为 "UserName" 的字段中。此处使用的字段名称必须与主搜索中使用的字段相匹配,否则您将得不到任何结果。 format 命令将结果放入 (UserName=foo OR UserName=bar...) 形式以便进行正确的搜索。然后用于搜索主搜索生成的用户名列表,这应该会生成您要查找的结果。