我正在尝试使用 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
答案1
问题可能是您需要更改屏幕Message Processors Configuration
下的顺序。Configurations
默认情况下是GeoIP Processor > Pipeline Processor > Message Filter Chain
。
据记载Greylog 官方文档关于管道的使用在“配置消息处理器”下,您需要将其更改为Message Filter Chain > Pipeline Processor > GeoIP Processor
。
在 2.1 版本下运行了几周后,我忘记在新安装的 2.2 Graylog 上执行此操作。症状与您的相同,snort 流规则和管道规则匹配,模拟有效,但实际上没有设置任何字段,也没有错误迹象,但奇怪的是,如果我将管道连接到默认的“所有消息”流,它就会工作,而我不想要。现在我更改了这个消息处理器顺序,snort 管道按预期工作。
答案2
我不确定这是否是正确的方法,但我将所有管道规则添加到默认溪流 (系统/管道 > 管道 > 默认流 > 编辑连接..然后添加您的自定义管道),然后我的所有字段都开始显示在搜索数据中。