部署自定义规则集并启用威胁情报源

约 35 分钟

能在 CentOS 上部署自定义规则目录,启用威胁情报源,并用 -T 校验整套规则集。

上一课的设计已经定稿:官方规则集由 suricata-update 拉取聚合,自定义与试验规则分层隔离,威胁情报源以 IP/域名黑名单形式接入,集成后还要回归测试防误报。现在把这张设计图落成可运行的配置。这一节只完成一个目标:自定义规则目录被加载,威胁情报源被启用,整套规则集通过 -T 校验。执行顺序三步:部署自定义规则文件,用 suricata-update 合并情报源,用测试模式校验最终规则集。

先记住两个位置。发行版安装的 Suricata,配置文件位于 /etc/suricata/suricata.yaml。suricata-update 会把规则安装到 /var/lib/suricata/rules,配置默认只引用其中的 suricata.rules 一个文件。后续所有步骤都围绕这两处展开。

"纳入配置"的意思很具体:suricata.yaml 的规则文件列表里必须出现你的自定义文件,否则 Suricata 根本不会读它。

操作边界先讲清楚:本节只改本机配置,只跑本地校验和离线回放,不向任何外部目标发送探测流量。

确认环境与规则基线

  1. 1

    查看版本与构建信息,确认安装可用。若命令不存在,说明 Suricata 未安装或不在 PATH 中。

    bash
    sudo suricata --build-info
  2. 2

    查看服务状态。服务应处于运行状态,或至少已被启用。

    bash
    sudo systemctl status suricata
  3. 3

    若服务未运行,启动它。

    bash
    sudo systemctl start suricata
  4. 4

    列出默认规则目录,确认 suricata.rules 存在。再用 wc 记录它的行数,作为稍后核对加载数量的基线。

    bash
    ls -l /var/lib/suricata/rules
    wc -l /var/lib/suricata/rules/suricata.rules

你应该看到

四条命令正常返回:版本信息可读,服务处于运行或已启用状态,/var/lib/suricata/rules 下存在 suricata.rules,并已记录基线行数。

部署自定义规则并纳入配置

  1. 1

    在默认规则目录下创建自定义规则文件 local.rules(文件名可自定)。写入一条之前写过的告警规则,包含 msg 与唯一 sid。参考格式:alert tcp any any -> any any (msg:"local test rule"; content:"example"; sid:99000001; rev:1;)。文件放这里,是为了与 suricata-update 的输出共用同一套路径。

    bash
    sudo vim /var/lib/suricata/rules/local.rules
  2. 2

    打开 suricata.yaml,找到列出规则文件路径的配置节——它默认引用 /var/lib/suricata/rules 下的 suricata.rules——在列表后追加对 local.rules 的引用,保存退出。

    bash
    sudo vim /etc/suricata/suricata.yaml
  3. 3

    立刻用测试模式做一次快速校验,让语法错误在合并大规则集之前暴露。若报错,先解决再继续。

    bash
    sudo suricata -T -c /etc/suricata/suricata.yaml

你应该看到

测试模式无错误退出,没有路径或语法报错;local.rules 中的自定义规则已被读取。

用 suricata-update 合并威胁情报源

  1. 1

    运行 suricata-update。默认模式抓取 ET Open 规则集,这是威胁情报源在 Suricata 侧的落地方式。

    bash
    sudo suricata-update
  2. 2

    确认更新结果:规则被安装到 /var/lib/suricata/rules,合并为唯一的 suricata.rules 文件。

    bash
    ls -l /var/lib/suricata/rules/suricata.rules
  3. 3

    重启服务,让新的规则集生效。

    bash
    sudo systemctl restart suricata
  4. 4

    查看启动日志,确认引擎正常启动。日志最后一行与类似内容结尾:所有处理线程与管理线程初始化完成、引擎已启动。

    bash
    sudo tail /var/log/suricata/suricata.log
  5. 5

    (可选)另开一个终端跟踪统计输出,确认引擎在持续处理数据。

    bash
    sudo tail -f /var/log/suricata/stats.log

你应该看到

suricata-update 报告更新完成;/var/lib/suricata/rules/suricata.rules 已更新;重启后日志末尾显示引擎已启动。

用 -T 校验整套规则集并核对加载

  1. 1

    对整套规则集运行测试模式。此刻规则集包含合并后的 suricata.rules 与你的 local.rules,校验的是最终形态。

    bash
    sudo suricata -T -c /etc/suricata/suricata.yaml
  2. 2

    检查输出有无错误。若报文件路径问题,对照日志逐条核对 suricata.yaml 中的每个路径,修正后再跑。

  3. 3

    核对规则加载数量:与基线行数比较,确认启用威胁情报源后数量增长,且自定义规则被计入。若数量没变化,先检查 local.rules 是否真的进了规则文件列表。

  4. 4

    (可选)离线验证自定义规则:先确认 fast.log 输出已在 suricata.yaml 中启用,再回放本地 PCAP。

    bash
    sudo suricata -r /path/to/test.pcap
  5. 5

    打开 fast.log(与 suricata.log 同目录),确认自定义规则的 sid 出现在告警中。

你应该看到

-T 无错误退出;规则加载数量与基线对比符合预期(启用源后增长、自定义规则计入);可选回放后 fast.log 出现自定义规则的告警。

遇到问题:-T 或服务启动时报错,提示找不到规则文件。典型表现:日志显示 suricata.yaml 中指定的文件不在预期位置。

可能原因

  • suricata.yaml 中引用的规则文件路径与实际文件位置不一致。
  • 自定义规则文件已创建,但没写进 suricata.yaml 的规则文件列表。
  • 文件权限不足,Suricata 运行用户读不到规则文件。

排查步骤

  1. 对照日志逐条核对 suricata.yaml 中的每个路径:把文件放到日志所指位置,或修正配置里的引用。
  2. 确认 local.rules 已加入规则文件列表,再重新运行 -T。
  3. 检查规则文件属主与权限,确保运行用户可读。
  4. 需要 fast.log 时,先在 suricata.yaml 中启用 fast.log 输出。
自检:用 -T 校验整套规则集时,命令是什么?期望结果是什么?如何确认自定义规则被加载?

命令是 sudo suricata -T -c /etc/suricata/suricata.yaml。期望无错误退出,规则文件全部被读取。确认方法:把 local.rules 写入 suricata.yaml 的规则文件列表,再用 suricata-update 把威胁情报源合并进 /var/lib/suricata/rules/suricata.rules;-T 与启动日志给出的加载计数应包含自定义规则,数量与基线对比符合预期。