SIEM通过TCP流式传输,将多条消息放入一个事件中

时间:2015-05-09 00:30:44

标签: c++ linux tcp stream

调整问题: SIEM是一个管理系统,它接收系统日志和其他类型的日志消息,并允许管理员以有助于他们更好地了解正在发生的事情的方式搜索,组合和报告日志。我正在使用Splunk并将Syslog(CEF)格式的消息发送到Splunk。当我向splunk发送两条消息时,会出现在此处显示的相同消息中。

  

< 1286> Sep 16,2014 2:07:38 PM dbrLnxRv CEF:0 | MyCompany | MyApp | 2.0 |恶意| 6 | FileName eicar.cab dname = www.csm-testcenter.org dst = 10.204.64.137 dpt = 8080 prot = HTTP src = 10.204.82.168 spt = 49809 suser ="" xAuthenticatedUser ="" requestMethod = GET requestClientApplication ="" reason = 0-1492-EICARFile.Detection_Test.Web.RTSS request = http://www.csm-testcenter.org/download/archives/cab/eicar.cab AnalysisType ="" ThreatName = EICARFile ThreatReason = 0-1492-EICARFile.Detection_Test.Web.RTSS Category = 128 Direction = inbound Manual = 1 TicketNumber = 0 FileType = unknown FileHash = 654ec5ae29c1718501af794822663da40aec51fc FileSize = 168 Status = completed SessionId = 79421 TransactionId = 5   < 1286> Sep 16,2014 2:07:39 PM dbrLnxRv CEF:0 | MyCompany | MyApp | 2.0 |恶意| 6 | FileName eicar.cab dname = www.csm-testcenter.org dst = 85.214.28.69 dpt = 80 prot = HTTP src = 10.204.64.137 spt = 40378 suser ="" xAuthenticatedUser ="" requestMethod = GET requestClientApplication ="" reason = 0-1492-EICARFile.Detection_Test.Web.RTSS request = http://www.csm-testcenter.org/download/archives/cab/eicar.cab AnalysisType ="" ThreatName = EICARFile ThreatReason = 0-1492-EICARFile.Detection_Test.Web.RTSS Category = 128 Direction = inbound Manual = 1 TicketNumber = 0 FileType = unknown FileHash = 654ec5ae29c1718501af794822663da40aec51fc FileSize = 168 Status = completed SessionId = 79432 TransactionId = 3

我的问题是,如何让它们出现在不同的块中。 目前每条消息之间都有CR / LF(通过使用Wireshark查看TCP事务进行验证)。尝试添加NULL也没有什么区别。 我知道我没有在日期/时间字段中找到MS,这是一个问题吗? 是否有我错过的消息ID会强制Splunk分离消息? 其他想法?
(当通过UDP发送时,每个事件都会出现在它自己的消息中) 还尝试禁用nagle算法。还是一样的问题。

我创建了一个自定义C ++应用程序,用于将SIEM消息从我的数据源发送到Splunk。如果我一次通过套接字发送6条SIEM消息,每条消息由CR / LF分隔(我也尝试在消息之间添加NULL),Splunk将它们放入一个单独的事件中。我应该发送什么来使消息处于独特的事件中?我已经到处查看SIEM协议的规范,并且没有在实际协议上找到二进制基础文档。

2 个答案:

答案 0 :(得分:1)

TCP是' stream'协议而不是面向消息。它不保持消息边界。发送的内容不能保证以相同的方式读取。 TCP上面的应用程序可以解释字节和形式的消息'

手上的UDP维护消息边界。一个sendto的X字节将转换为X字节的recvfrom。虽然UDP不会保证该消息将到达接收方。

上述原因正是您所见证的。多个send转换为单recv,而UDP则转换为相反。

答案 1 :(得分:0)

搞定了

协议使用basic / r / n来终止流,这是我过去尝试过的。真正的诀窍在于Splunk配置。需要创建名为props.conf的配置文件,并包含以下行

  

SHOULD_LINEMERGE =假

然后一切正常。