Syslog-NG 使用 IETF 格式处理日志消息时出错

Syslog-NG 使用 IETF 格式处理日志消息时出错

我们刚刚更改了 AS/400 分区上的日志记录应用程序,现在正在使用一款名为 PowerTech SIEM agent for IBM I 的产品

该工具过去使用旧的系统日志约定来格式化消息,现在显然能够发送因特网工程任务组消息(RFC5424),但是由于某种原因我们的 Syslog-NG 服务器无法处理它们,好像格式不正确。

下面是我们收到的一个错误示例:

Feb  8 15:53:49 hostname syslog-ng[1489874]: Error processing log message: <38>1 2021-02-08T15:53:34.918160+1:00 HOSTNAME.fqn.here - - - - CEF:0!Powertech!SIEM Agent!4.2!AUDIT!TCD0003!6!src=0.0.0.0 dst=1.2.3.4 reason=Command executed msg=A command (WRKPTSA) was run by 12345/T555500/PC01AFB0

活动本身是:

<38>1 2021-02-08T15:53:34.918160+1:00 HOSTNAME.fqn.here - - - - CEF:0!Powertech!SIEM Agent!4.2!AUDIT!TCD0003!6!src=0.0.0.0 dst=1.2.3.4 reason=Command executed msg=A command (WRKPTSA) was run by 12345/T555500/PC01AFB0

查看 RFC,看起来内容没有问题。他们应该尊重:

<priority>VERSION ISOTIMESTAMP HOSTNAME APPLICATION PID MESSAGEID STRUCTURED-DATA MSG

就我而言,我有:

<priority> is "38"
VERSION is "1"
ISOTIMESTAMP is "2021-02-08T15:53:34.918160+1:00"
HOSTNAME is "HOSTNAME.fqn.here"
APPLICATION is unknown (-)
PID  is unknown (-)
MESSAGEID  is unknown (-)
STRUCTURED-DATA is unknown (-)
MSG is "CEF:0!Powertech!SIEM Agent!4.2!AUDIT!TCD0003!6!src=0.0.0.0 dst=1.2.3.4 reason=Command executed msg=A command (WRKPTSA) was run by 12345/T555500/PC01AFB0"

我们运行 syslog-NG 3.8

请注意,我确实故意替换了主机名和 IP,但保留了大小写。

我已经在 syslog-ng 配置中尝试了多种方法(主要在源代码中),例如从 network() 切换到 syslog() 驱动程序(还指定了标志(syslog-protocol))等,但没有任何变化),以下是我在源代码中尝试过的几个示例:

source s_ISERIES        { syslog(transport("tcp") ip(0.0.0.0) port(51513)); };
source s_ISERIES        { network(transport("tcp") ip(0.0.0.0) port(51513) flags(syslog-protocol)); };

如果我不使用系统日志()或者系统日志协议并使用基本网络()驱动程序没有标志,消息会被“重写”(syslog-NG 添加了它自己的标题并在消息开头添加了时间戳和主机名,这是我不想要的)。

有办法解决这个问题吗?你发现事件格式有什么错误吗?如果没有,有没有办法告诉 syslog-NG 处理“原始”消息(获取它并将其发送到我想要的地方而不对其进行进一步修改)。

谢谢 !

编辑

重新启动并多次检查后,现在我们不再有错误。但日志根本没有被处理。

整个“日志”配置非常简单,我们有:

源定义如下:

source s_ISERIES        { syslog(transport("tcp") ip(0.0.0.0) port(51513)); }; 

日志配置定义如下:

log {
  source(s_ISERIES);
  destination(d_LOCALCOPY_ISERIES);
  destination(d_SPLUNK_ISERIES);
};

目的地定义如下:

destination d_LOCALCOPY_ISERIES   { file("/app/syslog-ng/logs/${YEAR}/${MONTH}/${DAY}/iseries/${HOST}.log" create-dirs(yes)); };

destination d_SPLUNK_ISERIES    { syslog("splunk-host.here.net" port(51513) send-time-zone("UTC")); }; 

并且在 tcpdump 时我看不到任何离开 syslog-NG 主机的消息(我看到它们传入,但没有离开主机)。另外,没有创建本地副本。所以我“相信” syslog-NG 正在接收消息,但由于某种原因无法解析它。我尝试了标志(no-parse),但它也不起作用,就好像它根本无法在定义的“源”上识别消息一样。

答案1

据我所知,IBM 从未测试过他们的 RFC5424 导出器,因为他们的时间戳格式是垃圾,并且无法与太多导出器兼容。

RFC5424(重点是我的):

时间戳 = 无值 / 完整日期“T” 完整时间

完整日期 = 日期-全年 "-" 日期-月份 "-" 日期-MDAY

日期-全年 = 4 位数字

日期-月份 = 2 位数字;01-12

DATE-MDAY = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 基于月/年

全职 = 兼职 时间偏移

部分时间 = 时间-小时“:”时间-分钟“:”时间-秒[时间-秒分]

时间-小时 = 2 位数字;00-23

时间-分钟 = 2 位数字;00-59

时间-秒 = 2 位数字;00-59

时间秒数 = "." 1*6DIGIT

时间偏移 = “Z” / 时间数字偏移

时间-数字偏移 = ("+" / "-") 时间-小时 ":" 时间-分钟

一旦发现它,你就会很清楚地知道你得到了什么,因为你的时间戳中显然有一个不应该存在的空格:

ISOTIMESTAMP 为 "2021-02-08T15:53:34.918160+1:00 "

相关内容