【问题标题】:Malformed Syslog Packet when using LEEF format使用 LEEF 格式时格式错误的 Syslog 数据包
【发布时间】:2017-04-04 18:47:34
【问题描述】:

我正在使用 SyslogNet 库将 SIEM Syslog 消息从我的应用程序以 LEEF 格式(在此为 QRadar)发送到 3rd 方供应商 SIEM 系统。 但是,我没有发送消息,并且该过程无处产生任何异常。 根据 Rfc5424 的 LEEF 消息,我可以看到并确认该字符串与正确的模板/格式相关(参见代码下方的示例)。

消息未正确发送的唯一迹象是 WireShark 跟踪显示消息仅由几个字节组成,更重要的是被认为是格式错误的数据包:

代码如下:

using System.IO;
using System.Text;
using System.Reflection;
using SyslogNet.Client;
using SyslogNet.Client.Serialization;
using SyslogNet.Client.Transport;
using Severity = SyslogNet.Client.Severity;

namespace Providers.Syslog
{
public class SyslogLogger
{

    private readonly SyslogSettings _syslogSettings;
    private readonly SyslogUdpSender _syslogUdpSender;

    public SyslogLogger(SyslogSettings syslogSettings)
    {
        _syslogSettings = syslogSettings;
        _syslogUdpSender = new SyslogUdpSender(syslogSettings.SyslogServerName, syslogSettings.SyslogServerPort);
    }

    public void Log(string message)
    {
        var syslogMessage = new SyslogMessage(
            null,
            (Facility)_syslogSettings.Facility,
            Severity.Informational,
            null,
            _syslogSettings.Identity,
            message);
        _syslogUdpSender.Send(syslogMessage, new SyslogMessageSerializer());
    }

    private class SyslogMessageSerializer : SyslogMessageSerializerBase, ISyslogMessageSerializer
    {
        private const int AppNameMaxLength = 32;

        public void Serialize(SyslogMessage message, Stream stream)
        {
            var priorityValue = CalculatePriorityValue(message.Facility, message.Severity);

            string timestamp = null;
            if (message.DateTimeOffset.HasValue)
            {
                var dt = message.DateTimeOffset.Value;
                var day = dt.Day < 10 ? " " + dt.Day : dt.Day.ToString();
                timestamp = string.Concat(dt.ToString("MMM "), day, dt.ToString(" HH:mm:ss"));
            }

            var headerBuilder = new StringBuilder();
            headerBuilder.Append("<").Append(priorityValue).Append(">");
            if (!string.IsNullOrEmpty(timestamp))
            {
                headerBuilder.Append(timestamp).Append(" ");
            }
            if (!string.IsNullOrEmpty(message.HostName))
            {
                headerBuilder.Append(message.HostName).Append(" ");
            }

            if (!message.Message.IsSiemOrientadTemplate())
            {
                var appName = message.AppName;
                headerBuilder.Append(string.IsNullOrWhiteSpace(appName)
                    ? appName
                    : (appName.Length > AppNameMaxLength ? appName.Substring(0, AppNameMaxLength) : appName) + ": ");
                headerBuilder.Append(message.Message ?? "No Content");
            }

            var encoding = new UTF8Encoding(false);
            var bytes = encoding.GetBytes(headerBuilder.ToString());
            stream.Write(bytes, 0, bytes.Length);
        }
    }
}

}

例如一条消息(我删除了实际数据并放置了占位符):

"LEEF:2.0|CompanyNameString|ProduceNameString|VersionString|int|^| ^cat=Test - QRADAR^sev=6^DescriptionString=^Timestamp=Apr 03 2017 14:48:02^userNameString=domain\DisplayName^accountName=samAccountName^proto=Syslog"

任何帮助将不胜感激,因为已经有一段时间了,我找不到解决方案。提前致谢!

【问题讨论】:

    标签: c# syslog malformed


    【解决方案1】:

    终于找到问题了。 我忽略了内容位于非 SIEM 系统的“if”子句中的事实。 将此行移出子句可解决所有 syslog 提供程序类型的问题。

    headerBuilder.Append(message.Message ?? "No Content");

    【讨论】:

      猜你喜欢
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多