我正在尝试使用 Graylog 来获取系统日志和 Snort 警报。我已经按照此处的示例将我的 snort 警报放入 Graylog,然后继续为单独的 IDS 日志源添加另一个流、管道和规则。我基本上复制了 Snort 示例并更改了正则表达式以从新日志源中提取相关字段。当我从搜索选项卡中选择一条消息然后选择“针对流进行测试”时,新的正则表达式确实可以测试。Streams
从Graylog 顶部的菜单项中选择时,消息也会显示在我的新流下。
问题是,在管道规则中,我使用该set_field()
函数从正则表达式中分配匹配组的值。我在规则中有九个字段,set_field()
但它们都没有出现在搜索数据中。为什么是这样?我需要add_field()
像在 GELF 示例中那样首先使用吗?我假设set_field()
自动这样做,因为这就是上面链接中的 snort 示例的工作方式。附加了我的管道规则,该规则附加到 Graylog 中的 IDrops 流。
rule "Extract IDropS fields"
when
has_field("message")
then
let m = regex("^([a-z]+)\\s.*(TCP|UDP|ICMP)\\s([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}):(\\d{1,5})\\s([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}):(\\d{1,5}).*SnortSid.*:([0-9]+):([0-9]+)\\s(.*)$", to_string($message.message));
set_field("snort_alert", false);
set_field("sd_host", m["0"]);
set_field("sd_proto", m["1"]);
set_field("sd_src", m["2"]);
set_field("sd_sport", m["3"]);
set_field("sd_dst", m["4"]);
set_field("sd_dport", m["5"]);
set_field("sd_sid", (m["6"]));
set_field("sd_rev", m["7"]);
set_field("sd_desc", m["8"]);
end
问题可能是您需要更改屏幕
Message Processors Configuration
下的顺序。Configurations
默认情况下它是
GeoIP Processor > Pipeline Processor > Message Filter Chain
.正如Greylog 官方文档中关于“配置消息处理器”下管道使用情况的记录,您需要将其更改为
Message Filter Chain > Pipeline Processor > GeoIP Processor
.在新安装的 2.2 Graylog 在 2.1 下工作了几个星期后,我忘记了这样做。症状与您的相同,snort 流规则和管道规则匹配,模拟有效,但实际上没有设置任何字段,也没有错误迹象,但奇怪的是,如果我将管道连接到默认的“所有消息”流,它会起作用,我不想要。现在我改变了这个消息处理器的顺序,snort 管道按预期工作。
我不确定这是否是正确的方法,但我将所有管道规则添加到默认流(系统/管道>管道>默认流>编辑连接..然后添加您的自定义管道),然后我的所有字段开始出现在搜索数据中。