0Pricing
Cyber Security Academy · 课时

使用 Snort 与 Suricata 编写特征规则

编写并读取网络规则。

使用 Snort 与 Suricata 编写特征规则 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。

Snort 与 Suricata

Snort 和 Suricata 是两种占主导地位的开源 IDS/IPS 引擎。它们共享大体兼容的规则语言,因此为其中一个编写的规则通常也能在另一个上运行。

Suricata 增加了多线程、原生协议解析器、文件提取和丰富的日志记录(EVE JSON);Snort 3 也以类似方式实现了自身引擎的现代化。掌握一次规则语法,就能同时驾驭两者。

规则结构

每条规则包含两部分:一个标头和一个由括号括起的选项主体。标头设置动作、协议和流量方向;主体定义匹配内容以及报告方式。

alert tcp $EXTERNAL_NET any -> $HOME_NET 80 ( \
  msg:"WEB suspicious request"; \
  content:"/admin.php"; http_uri; \
  sid:1000001; rev:1; )

规则头部字段

规则头部按从左到右的顺序读取:

  • 动作 — 告警、丢弃、拒绝、放行
  • 协议 — tcp、udp、icmp、ip(或 Suricata 中的应用层协议:http、dns、tls)
  • 源 IP/端口和目标 IP/端口
  • 方向 — -> 表示单向,或 <> 表示双向

像 $HOME_NET 和 $EXTERNAL_NET 这样的变量来自您的配置,因此规则可以在不同站点之间移植。

drop tcp any any -> $HOME_NET 22 ( msg:"SSH blocked"; sid:1000002; rev:1; )

动作:告警与丢弃

动作决定该规则表现为 IDS 还是 IPS:

  • alert — 记录日志并通知,但不停止流量(IDS)
  • drop — 静默丢弃数据包(IPS,仅适用于内联部署)
  • reject — 丢弃数据包,并发送 TCP 重置或 ICMP 不可达消息
  • pass — 明确允许流量,跳过后续规则

同一引擎是否表现为 IDS 或 IPS,取决于它是否以内联方式部署,以及您使用了哪些动作。

内容匹配

content 关键字会在有效载荷中匹配字节模式。文本放在引号中;二进制内容用十六进制表示,并放在竖线中。

用于锚定位置的关键字可以让匹配更加精确:offset、depth、distance 和 within 会限定模式可以出现的位置,从而同时提高准确性和性能。

alert tcp any any -> $HOME_NET any ( \
  msg:"Malware magic bytes"; \
  content:"|4D 5A|"; offset:0; depth:2; \
  sid:1000003; rev:1; )

固定缓冲区

现代规则不是针对原始数据流进行匹配,而是针对协议感知缓冲区进行匹配。在缓冲区关键字之后,后续的 content 匹配会应用于已解析协议的相应部分。

  • http_uri — 请求 URI
  • http_header — 请求和响应标头
  • http_user_agent — 用户代理
  • tls_sni / dns_query — TLS 服务器名称 / DNS 查询

与在整个数据包中搜索子字符串相比,这种方式可靠得多。

alert http any any -> any any ( \
  msg:"Suspicious user agent"; \
  http.user_agent; content:"sqlmap"; nocase; \
  sid:1000004; rev:1; )

PCRE 与不区分大小写

固定字符串不足以应对所有情况时,pcre 会提供与 Perl 兼容的正则表达式。将成本较低的 content 预过滤与 pcre 配合使用,可以让正则表达式只对候选数据包运行,从而保持性能。

nocase 修饰符会使内容匹配不区分大小写;对于标头和攻击者可以任意改变的用户控制字段,这一点非常重要。

alert http any any -> $HOME_NET any ( \
  msg:"SQLi attempt in URI"; \
  http.uri; content:"select"; nocase; \
  pcre:"/union\s+select/i"; \
  sid:1000005; rev:1; )

流与状态关键字

flow 选项会将规则限定在特定的连接状态和方向上,从而减少误报和开销。

  • established — 仅适用于已完成的 TCP 会话
  • to_server / to_client — 请求方向与响应方向

仅在连接已建立且方向为 to_client 时匹配服务器响应,可以避免规则因零散或伪造的数据包而触发。

alert tcp $HOME_NET any -> $EXTERNAL_NET any ( \
  msg:"Beacon response"; \
  flow:established,to_client; \
  content:"|00 01 02 03|"; \
  sid:1000006; rev:1; )

元数据:签名标识、修订版本、消息、引用

用于记录和管理的选项有助于维护规则集:

  • sid — 唯一的签名 ID(本地规则使用 1000000 以上的值)
  • rev — 修订版本号,每次编辑都应递增
  • msg — 分析人员看到的告警文本
  • classtype — 决定优先级的类别
  • reference — 指向 CVE 或安全公告的链接

稳定的 sid 和递增的 rev 可以让您跟踪和更新规则,同时不会破坏仪表板和抑制设置。

alert tcp any any -> $HOME_NET 445 ( \
  msg:"EternalBlue exploit attempt"; \
  flow:to_server,established; content:"|FF|SMB"; \
  classtype:attempted-admin; \
  reference:cve,2017-0144; sid:1000007; rev:2; )

Snort 与 Suricata 的差异

虽然两者的规则兼容,但引擎的能力有所不同:

  • Suricata 支持多线程,能够原生解析应用层协议、提取文件、计算 JA3,并生成 EVE JSON
  • Snort 3 为提升性能和支持模块化插件系统而重写了引擎

有些关键字是特定引擎专用的。Suricata 增加了应用层关键字(tls.sni、dns.query、http.method)以及数据集和流位功能。共享规则时,请以两者共同支持的最低特性集为目标,或分别维护专用规则集。

速率过滤与阈值

为避免规则淹没控制台,请应用阈值。detection_filter 仅在一个时间窗口内发生 N 次事件后才触发;使用 threshold 配合 limit 可以限制告警数量。

对于暴力破解和扫描检测,这一点必不可少:单个事件没有意义,但短时间内的集中爆发才是信号。

alert tcp any any -> $HOME_NET 22 ( \
  msg:"SSH brute force"; flow:to_server; \
  detection_filter:track by_src, count 5, seconds 60; \
  sid:1000008; rev:1; )

快速检查

阅读一条规则,并预测它的行为。

回顾

现在您已经能够阅读和编写 Snort/Suricata 签名:

  • 一条规则 = 头部(动作、协议、源/目标、方向)+ 主体选项
  • 动作决定 IDS 还是 IPS:alert、drop、reject、pass
  • content 配合偏移量/深度以及十六进制内容匹配有效载荷字节
  • 固定缓冲区(http.uri、tls.sni、dns.query)匹配已解析的协议字段
  • 正则表达式和不区分大小写处理可应对可变模式
  • 流选项将规则限定在特定状态和方向上
  • 签名标识、修订版本、消息和引用有助于维护规则
  • 阈值可以减少暴力破解和扫描产生的噪声

下一步:检测完全没有签名的威胁。

常见问题解答

「使用 Snort 与 Suricata 编写特征规则」课时是免费的吗?

是的 — 「使用 Snort 与 Suricata 编写特征规则」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。

「使用 Snort 与 Suricata 编写特征规则」这节课中我会学到什么?

编写并读取网络规则。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cyber Security Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「使用 Snort 与 Suricata 编写特征规则」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cyber Security Academy 课中编写并运行代码吗?

能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. IDS 与 IPS 概念
  2. 使用 Snort 与 Suricata 编写特征规则
  3. 异常与行为检测
  4. 调优与部署
← 返回 Cyber Security Academy