使用 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— 请求 URIhttp_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 反馈 — 无需本地设置。
此课程中的所有课时
- IDS 与 IPS 概念
- 使用 Snort 与 Suricata 编写特征规则
- 异常与行为检测
- 调优与部署