运维笔记

Splunk SIEM 关联规则配置实战:从踩坑到高效告警

· InfraOps Router · Cybersecurity
Cybersecurity 技术可视化

前言:别让规则变成噪音

说实话,我见过太多安全团队把 Splunk ES 当成一个“告警制造机”。配了一堆规则,结果每天几千条告警,真正能用的没几条。我去年接手一个客户的 SOC,他们 ES 上有 200 多条 Correlation Search,但平均每天有 70% 的告警是误报。这玩意儿不是越多越好。

今天我想聊聊我们团队在配置 Splunk 关联规则时的一些真实经验。不是那种官方文档的复读,而是你真正会遇到的坑和解决方案。

第一步:搞清楚你的数据源

很多人的第一步就错了。他们直接冲进 Content Management 开始写规则,完全不考虑数据质量。

我一般先问三个问题:

  1. 你的日志源覆盖了哪些 MITRE ATT&CK 战术?
  2. 日志时间戳是否准确?(这个能坑死你)
  3. 字段提取有没有做好?

实战:检查数据源

从 Splunk Enterprise 菜单栏选 Settings > Data inputs > Intelligence Downloads,然后过滤 mitre。这里你会看到 MITRE 的威胁情报更新。如果你连这个都没配,那你的规则基本是盲打。

我们团队的做法是:先跑一个 | datamodel 命令,看看 CIM 兼容性。如果数据模型都过不了,后面的规则就是白费劲。

第二步:创建你的第一个关联规则

好了,假设你的数据质量没问题。现在我们从 Splunk ES 菜单栏进 Configure > Content > Content Management。过滤 TypeCorrelation Search

一个真实的例子:检测暴力破解

我们当时需要检测 SSH 暴力破解。规则长这样:

index=linux_secure sourcetype=linux_secure "Failed password"
| bucket span=5m _time
| stats count by src_ip, dest_ip, _time
| where count > 10
| eval severity = if(count > 50, "critical", "high")
| `notable`

看着简单是吧?但这里有个坑:bucket span=5m 这个参数。如果你的日志量很大,5 分钟窗口可能产生大量假阳性。我们后来改成 span=10m,并且加了一个 lookup 来排除内部跳板机。

规则配置的细节

在 Content Management 里,你需要设置:

  • Cron Schedule:我们一般用 */5 * * * *,但如果是高频率规则,建议用实时搜索(Real-time)
  • Throttling:这个非常关键。不设限的话,一个攻击源能刷出几百条告警。我们通常按 src_ip 在 1 小时内只告警一次
  • Risk Score:别设太高也别设太低。我们内部有个标准:低危 20,中危 50,高危 80,严重 100

第三步:规则调优——这才是真正的技术活

误报处理

这是我最头疼的部分。去年有个规则检测到“DNS 隧道”,结果发现是某个开发团队在用 dig 做测试。我们花了三天才定位到。

我的建议是:永远不要直接删除规则,而是加例外条件

比如:

index=dns sourcetype=dns
| search query_type=TXT AND query_length>500
| where NOT (src_ip IN [subsearch: index=asset_lookup | search category=dev_server | fields ip])
| `notable`

这样既保留了检测能力,又避免了误报。

性能优化

说实话,Splunk 的关联搜索性能是个大问题。我们有个规则跑在 100GB/天的数据上,结果把搜索头搞崩了。

几个优化点:

  1. tstats 代替 stats:如果你用的是数据模型,tstatsstats 快 10 倍以上
  2. 提前过滤:把 index=sourcetype= 写在最前面
  3. 避免子搜索:子搜索在数据量大时就是灾难
优化手段性能提升适用场景
使用 tstats10-20x数据模型已就绪
提前过滤3-5x所有场景
避免子搜索2-3x中等数据量
使用 summary index5-10x历史数据回溯

第四步:与 MITRE ATT&CK 对齐

这个很多人忽略。在 Content Management 里,每个 Correlation Search 都可以关联 MITRE 战术和技术。

我们团队的做法是:每个规则至少对应一个 MITRE 技术。这样当告警产生时,分析师能立刻知道攻击者在做什么。

比如我们的“横向移动检测”规则关联了 TA0008(横向移动)和 T1021(远程服务)。

第五步:告警响应自动化

规则配好了,告警也出来了。然后呢?

我们接入了 SOAR 平台。当规则触发时:

  1. 自动创建告警工单
  2. 提取关键字段(src_ip, dest_ip, user)
  3. 自动查询威胁情报
  4. 如果是高危,直接通知值班人员

这里有个小技巧:在规则里用 notable 命令时,可以自定义告警的 urgencyowner

| `notable` urgency=high owner=soc_team

常见陷阱

时间窗口陷阱

我见过有人把时间窗口设成 earliest=-30d,结果规则跑了 3 小时还没出结果。关联规则的时间窗口不要超过 1 小时,除非你有特殊需求。

字段提取陷阱

eval 命令里用了不存在的字段,规则静默失败。我建议在规则末尾加一行 | fields + src_ip, dest_ip, user, action 来确保关键字段存在。

重复告警陷阱

没有配置 Throttling,结果一个攻击刷了 500 条告警。Throttling 是必须的

FAQ

Q: Splunk 关联规则和普通告警有什么区别?

A: 关联规则是跨事件、跨数据源的逻辑组合。普通告警基于单一事件。比如“5 分钟内 10 次登录失败”是关联规则,而“一次登录失败”是普通告警。

Q: 如何测试新规则?

A: 先用 | stats 在搜索里验证逻辑,确认没问题后再部署到 Content Management。我们团队有个测试环境,所有规则先在测试环境跑 24 小时。

Q: 规则太多影响性能怎么办?

A: 优先使用 tstats,减少子搜索,使用 summary index。另外,定期清理不再需要的规则。

总结

配置 Splunk 关联规则不是一蹴而就的事。你得先搞数据,再写规则,然后调优,最后自动化。这个流程走下来,少说也得两个月。

但回报是值得的。我们团队通过这套方法,把误报率从 70% 降到了 15%,告警处理时间从平均 45 分钟降到了 8 分钟。

记住:好的规则不是写出来的,是调出来的