天天看点

华为USG防火墙,你到底有多少种格式的日志……

上次说,闲着无聊,想把华为USG防火墙的日志收集到ES中进行大屏展示。。已经忙活了两周了,心态崩溃了无数次。。我也不知道这款产品,到底有多少种格式的日志。。先给大家看我的匹配记录。

grok {
        match => [
            "message", "(?<timestamp>%{MONTH}\s+%{MONTHDAY}\s+%{YEAR}\s+%{TIME})%{SPACE}*%{HOSTNAME:fwname}\s+%%(?<log_ver>\d{2})(?<modulename>\w+)\/%{WORD:severity}\/%{WORD:brief}\(%{WORD:log_type}\)\[%{WORD:num}\]\:\[%{WORD:description}\]%{GREEDYDATA:info}",
            "message", "(?<timestamp>%{MONTH}\s+%{MONTHDAY}\s+%{YEAR}\s+%{TIME})%{SPACE}*%{HOSTNAME:fwname}\s+%%(?<log_ver>\d{2})(?<modulename>\w+)\/%{WORD:severity}\/%{WORD:brief}\(%{WORD:log_type}\)\[%{WORD:num}\]:(?<description>(.*))\s+\(%{GREEDYDATA:info}\)" ,
            "message", "(?<timestamp>%{MONTH}\s+%{MONTHDAY}\s+%{YEAR}\s+%{TIME})%{SPACE}*%{HOSTNAME:fwname}\s+%%(?<log_ver>\d{2})(?<modulename>\w+)\/%{WORD:severity}\/%{WORD:brief}\(%{WORD:log_type}\)\[%{WORD:num}\]\:%{GREEDYDATA:info}",
            "message", "(?<timestamp>%{MONTH}\s+%{MONTHDAY}\s+%{YEAR}\s+%{TIME})%{SPACE}*%{HOSTNAME:fwname}\s+%%(?<log_ver>\d{2})(?<modulename>\w+)\/%{WORD:severity}\/%{WORD:brief}\(%{WORD:log_type}\)\:(?<description>(.*))\s+\(%{GREEDYDATA:info}\)",
            "message", "(?<timestamp>%{MONTH}\s+%{MONTHDAY}\s+%{YEAR}\s+%{TIME})%{SPACE}*%{HOSTNAME:fwname}\s+%%(?<log_ver>\d{2})(?<modulename>\w+)/%{INT:severity}/%{WORD:brief}\(%{WORD:log_type}\):%{GREEDYDATA:info}" 
            ]
     }           

先看相对标准的日志头内容,记住,这里用的是相对。

格式一:这里有中括号 [187010]加描述信息

<190>Oct 18 2022 09:09:10 WAN-FW-M %%01USERS/6/NESRV(l)[187010]:id=USG6680

格式二:这里又没有了中括号,直接是描述

<188>Oct 19 2022 07:44:20 WAN-FW-M %%01IPS/4/DETECT(l):An intrusion was detected.

格式三:中括号后面的描述又变成了中括号

<189>Oct 18 2022 07:03:38 WAN-FW-M %%01CM/5/USER_ACCESSRESULT(s)[182860]:[USER_INFO_AUTHENTICATION]

格式四:时间戳后,从上面一个空格,变成两个空格。。(问候一下这个产品经理的亲戚)

<188>Oct 19 2022 07:44:20 WAN-FW-M %%01IPS/4/DETECT(l):An intrusion was detected.

格式五:到此结束。。后面没有描述了

<190>Oct 18 2022 09:09:09 WAN-FW-M %%01POLICY/6/POLICYPERMIT(l):

---

经过几天的折腾,先把前面标准内容匹配出来了。接着下来,解析后面的内容。

这里使用fiter的kv插件进行解析。

大致如下:

kv {
        source => "info"
        trim_value => "<>\[\]\"\\(\\),"
        trim_key => "<>\[\],"
        value_split => "="
        # 宽松模式匹配空格whitespace
        whitespace => "lenient"
    }           

你以为这样就能正确匹配了?

接下来又是崩溃的。。有的日志格式中使用的键值格式是source-port=22470,有的是source-port:22470,有的是source port=22470。

日志内时间格式,有的是time=2022/10/18 17:09:09,有的是:TIME=1666166434;ZONE=UTC+0800;

字段间隔,有的是空格,有的是,号,有的是;号。。。

好吧,我崩溃了。。大华为的产品经理们,这出自一款产品,一个团队啊,怎能如此狗屎?

继续阅读