Wazuh子解码器在Phase-2阶段后未执行的问题求助
关于Wazuh子解码器仅执行第一个的问题
尝试用Wazuh解码器解析以下日志:
received a login at 23:45:32 for user marc from 10.10.10.1
正则表达式已在线验证有效,但prematch解码器下的子解码器仅第一个生效,第二个子解码器始终不执行;调换子解码器顺序后,也只有排在前面的子解码器生效,后续的被忽略。将第一个子解码器的正则合并后能提取多个字段,但第二个子解码器仍被忽略。
原始解码器配置
<!-- 日志内容: received a login at 23:45:32 for user marc from 10.10.10.1 --> <decoder name="loginLog"> <prematch>login</prematch> </decoder> <decoder name="loginLog-time"> <parent>loginLog</parent> <regex type="pcre2">login at (\S+) for</regex> <order>time</order> </decoder> <decoder name="loginLog-user"> <parent>loginLog</parent> <regex type="pcre2">for user (\S+) from</regex> <order>user</order> </decoder>
对应logtest输出
echo "received a login at 23:45:32 for user marc from 10.10.10.1" | /var/ossec/bin/wazuh-logtest Starting wazuh-logtest v4.14.0 Type one log per line **Phase 1: Completed pre-decoding. full event: 'received a login at 23:45:32 for user marc from 10.10.10.1' **Phase 2: Completed decoding. name: 'loginLog' time: '23:45:32' <= 仅第一个子解码器生效
合并子解码器后的配置
<decoder name="loginLog"> <prematch>login</prematch> </decoder> <decoder name="loginLog-time"> <parent>loginLog</parent> <regex type="pcre2">login at (\S+) for user (\w+) from</regex> <order>time, user</order> </decoder> <decoder name="loginLog-user"> <parent>loginLog</parent> <regex type="pcre2">for user (\S+) from</regex> <order>user</order> </decoder>
合并后的logtest输出
**Phase 1: Completed pre-decoding. full event: 'received a login at 23:45:32 for user marc from 10.10.10.1' **Phase 2: Completed decoding. name: 'loginLog' dstuser: 'marc' <= \ time: '23:45:32' <= 仅合并后的子解码器生效,第二个子解码器被忽略
问题原因与解决方案
原因
Wazuh的子解码器逻辑是匹配即停止:当父解码器匹配成功后,会按顺序遍历其子解码器,只要有一个子解码器匹配成功,就会终止后续子解码器的检查,不会继续执行其他同层级的子解码器。
解决方案
方案1:使用链式解码(推荐用于拆分复杂解码器)
将后续子解码器的parent设置为前一个子解码器的名称,形成链式调用,这样第一个子解码器匹配后,会继续执行它的子解码器:
<decoder name="loginLog"> <prematch>login</prematch> </decoder> <decoder name="loginLog-time"> <parent>loginLog</parent> <regex type="pcre2">login at (\S+) for</regex> <order>time</order> </decoder> <decoder name="loginLog-user"> <parent>loginLog-time</parent> <!-- 修改parent为前一个子解码器的名称 --> <regex type="pcre2">for user (\S+) from</regex> <order>user</order> </decoder>
方案2:单个子解码器提取所有字段
如果日志格式固定,可在一个子解码器中用正则一次性提取所有需要的字段:
<decoder name="loginLog"> <prematch>login</prematch> </decoder> <decoder name="loginLog-details"> <parent>loginLog</parent> <regex type="pcre2">login at (\S+) for user (\S+) from (\S+)</regex> <order>time, user, srcip</order> </decoder>
验证
使用wazuh-logtest测试链式解码配置,即可同时提取time和user字段。
内容的提问来源于stack exchange,提问作者user2593869
相关产品推荐
相关产品推荐

