/ 网络安全 / 23浏览

Snort 规则选项入门

第一部分 Snort 规则选项入门教程

一、先搞懂:Snort 规则选项到底是什么?

咱们先打个比方:

Snort 就像网络世界的“保安”,它的规则头部(协议、IP、端口)就像“通行证初步检查”,先筛一遍哪些流量要重点关注;而规则选项,就是保安手里的“放大镜+警报器”——决定了这个流量到底是不是攻击、要不要报警、报警之后该怎么办。

所有规则选项都写在圆括号() 里,用分号 ; 隔开,示例:

alert tcp any any -> any 80 (msg:"这是一条规则"; content:"恶意字符串"; sid:1000001;)

括号里的内容,就是本篇文章的核心学习内容。

更多详细知识请前往Snort官网Snort - 网络入侵检测与防御系统

二、规则选项的四大类:各司其职,分工明确

我们把规则选项分成 4 个大类,每个类作用不同,就像保安团队不同岗位:

分类

作用

大白话理解

通用选项

给规则打标签、写备注

给规则贴个“攻击类型、编号、漏洞关联”的标签,方便后续查告警

载荷选项

检查数据包里的“内容”

看数据包里有没有“恶意代码、攻击指令”这些坏东西

非载荷选项

检查数据包的“头部信息”

看数据包的IP、TCP标志位这些“身份信息”有没有异常

后检测选项

触发规则后做什么

攻击被发现后,要不要限流、要不要断开连接、要不要记录日志

三、通用选项:给规则“上户口”,方便管理和溯源

通用选项不影响规则检测,就像给规则办理身份证,记录编号、类型、漏洞信息,方便告警分析。

1. 最常用的通用选项

选项

作用

小白例子

msg

告警时显示的信息,告诉管理员这是什么攻击

msg:"检测到SQL注入攻击";

sid

规则唯一编号,就像身份证号,不能重复

sid:1000001;(自定义规则建议从1000000开始)

rev

规则版本号,修改一次就加1,方便追溯变更

rev:2;

classtype

攻击类型分类,比如SQL注入、端口扫描

classtype:web-application-attack;

priority

规则优先级,1最高,5最低,优先处理高危攻击

priority:1;

reference

关联漏洞库,比如CVE编号,方便查漏洞详情

reference:cve,2023-1234;

2. 避坑提醒

 sid 绝对不能重复,不然 Snort 启动会报错;

 msg 别写得太笼统,别只写“攻击”,要写清楚是什么攻击,例如“检测到针对登录接口的SQL注入”,否则告警过多无法区分。

四、载荷选项:Snort的“火眼金睛”,抓出恶意内容

载荷选项是 Snort 检测攻击的核心,专门检查数据包的数据部分,用来识别SQL注入、XSS、恶意软件等攻击。

1. 核心中的核心:content 选项

content 就是字符串匹配,在数据包中查找指定特征,是最常用的载荷匹配选项。

 用法:content:"要匹配的内容";

 示例:
        
content:"/etc/passwd";  // 检测目录遍历攻击
content:"|27 3B|";      // 十六进制匹配:单引号+分号,抵抗编码绕过

2. content 的“黄金搭档”:修饰符

修饰符用于优化匹配规则,解决大小写绕过、编码绕过、精准定位等问题。

修饰符

作用

例子

nocase

大小写不敏感,忽略大小写绕过

content:"union select"; nocase;

fast_pattern

优先匹配该特征,提升运行效率

content:"exec("; nocase; fast_pattern;

within

限定两个特征之间的字节距离

content:"admin"; content:"123456"; within:20;

offset/depth

限定匹配起始、结束字节位置

content:"pass="; offset:10; depth:100;

3. 针对HTTP流量的专用选项

绝大多数Web攻击基于HTTP协议,Snort内置专用HTTP匹配选项,自动解码URL编码:

 http_uri:仅匹配HTTP请求URL;

 uricontent:"../etc/passwd";:匹配目录遍历特征;

 http_method:匹配请求方式,例如http_method:POST;

4. 进阶:pcre 正则匹配

针对无固定格式的特征(如多变SQL注入),使用正则表达式匹配:

pcre:"/select.*from.*users/i";  // 模糊匹配select语句,大小写不敏感

注意:正则匹配效率低,能使用content就不用pcre,避免占用CPU资源。

五、非载荷选项:检查数据包的“身份信息”,抓异常流量

非载荷选项不检测数据包内容,只检测IP、TCP、ICMP头部信息,多用于检测端口扫描、异常连接、伪造流量。

1. 常用非载荷选项

选项

作用

例子

flags

匹配TCP标志位,检测异常连接

flags:SF; 匹配SYN+FIN半开放扫描包

ttl

匹配IP存活时间,识别伪造IP

ttl:1; 匹配异常TTL数据包

itype/icode

匹配ICMP类型,检测Ping扫描

itype:8; icode:0; 匹配Ping请求

flow

匹配TCP会话状态

flow:established; 仅匹配已建立连接

flowbits

跨数据包标记会话状态

flowbits:set,login_success; 设置登录成功标记

六、后检测选项:攻击被发现后,该怎么办?

规则触发后执行的动作,用来限流告警、主动防御、溯源记录,防止告警风暴。

1. 常用后检测选项

选项

作用

例子

threshold

限制告警频率,防止刷屏

threshold:type limit, track by_src, count 3, seconds 60;

resp

主动断开攻击连接

resp:rst_src; 向攻击者发送重置包断开连接

tag

触发后记录后续流量,用于溯源

tag:track by_src, count 10, seconds 10;

replace

替换恶意载荷内容

content:"恶意代码"; replace:"安全内容";

注意respreplace 仅在 NIPS 防御模式生效,NIDS 检测模式无法使用。

七、实战案例:一条能直接看懂的完整规则

整合以上所有选项,编写一条登录接口SQL注入检测规则:

alert tcp $EXTERNAL_NET any -> $HOME_NET 80 (
    msg:"WEB-高危SQL注入攻击(登录接口)";
    http_method:POST;          // 只检测POST请求
    http_uri:"/api/login";     // 只检测登录接口
    content:";exec("; nocase; fast_pattern;  // 优先匹配这个特征,大小写不敏感
    content:"|27 3B|"; within:20;  // 匹配单引号+分号,且在20字节内
    reference:cve,2023-1234;  // 关联漏洞编号
    classtype:web-application-attack;
    priority:1;
    threshold:type limit, track by_src, count 3, seconds 60;  // 控制告警频率
    sid:1000001;
    rev:1;
)

规则逻辑:筛选访问登录接口的POST请求,匹配注入特征,命中后告警;限制单IP一分钟最多告警3次,避免告警风暴。

八、小白必看:常见问题与避坑指南

1. 规则不触发,无告警?

 检查选项和协议是否匹配(flags只能用于TCP,不能用于ICMP);

 检查content、十六进制格式是否书写错误;

 使用命令 snort -c /etc/snort/snort.conf -T 检测语法错误。

2. 误报太多,正常流量也报警?

 不要使用过于简单的特征(单独匹配select极易误报);

 使用offset、depth缩小匹配范围;

 搭配threshold限制告警次数。

3. Snort运行卡顿、CPU占用高?

 多content规则必须添加fast_pattern;

 尽量少用复杂pcre正则;

 删除冗余无效选项。

写在最后

Snort 规则选项看起来繁多,只要记住逻辑:通用选项打标签→非载荷筛流量→载荷抓特征→后检测做处理。新手写规则不用追求完美,从简单content匹配开始,逐步叠加选项,多测试调试就能写出精准高效的检测规则。

Peregrine
基于 Ubuntu 系统的 OSSEC 服务端安装配置与功能详解
腾讯云CDN配置