Suricata规则基础概念
Suricata是一款开源的网络威胁检测引擎,支持IDS(入侵检测系统)、IPS(入侵防御系统)和NSM(网络安全监控)功能。其规则语法基于Snort规则,但扩展了更多高级特性。规则文件通常以.rules
为后缀,每条规则由动作、协议、源/目标地址、端口、方向及选项组成。
规则结构解析
一条典型的Suricata规则格式如下:
action protocol src_ip src_port direction dst_ip dst_port (options)
示例规则:
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg:"SSH brute force attempt"; flow:to_server; threshold:type both, track by_src, count 5, seconds 60; sid:1000001; rev:1;)
关键字段说明
动作(action)
常见动作包括:
alert
:触发警报drop
:丢弃数据包(IPS模式)pass
:忽略匹配流量reject
: 当Suricata运行IPS模式时,将发送一个TCP重置包,Suricata将放弃匹配的数据包。
协议(protocol)
支持tcp
、udp
、icmp
、http
、dns
等协议类型。
流量方向(direction)
->
表示单向流量,<>
表示双向流量。
any any-> 192.168.1.10 80
表示从任意IP、任意端口到192.168.1.10的80端口会进行匹配
any any <-> 192.168.1.10 80
表示从任意IP、任意端口到192.168.1.10的80端口或192.168.1.10的80端口进行的任何流量会进行匹配
Option
在Suricata签名中的括号(…)内的参数包含各种选项和关键字修改器,你可以用它们来匹配数据包的特定部分,对规则进行分类,或记录自定义信息。规则的header参数是针对IP、端口和协议级别的数据包标题,而OPTIONS则是针对数据包中的数据进行匹配。
Suricata规则中的OPTIONS必须用分号隔开,并且通常使用key:value格式。有些选项没有任何设置,只需要在规则中指定名称
msg
使用msg
关键字进行触发规则后返回的提示信息配置:
alert tcp any any -> 192.168.1.1/24 80 (msg:"this is a tcp payload"; sid:200000;)
content
使用content
关键字进行payload匹配:
alert tcp any any -> 192.168.1.1/24 80 (msg:"this is a tcp payload";content:"|abc|"; depth:4; offset:0; sid:200000;)
- msg:“this is a tcp payload”:触发警报时显示的描述信息。
- content:“|abc|”:在数据包中搜索 十六进制 或 ASCII 内容 abc。
- |…| 表示 原始字节(可以是 ASCII 或十六进制,如 |61 62 63| 也是 abc 的十六进制形式)。
- depth:4:从 offset 开始,最多检查 4 字节 的数据。
- offset:0:从数据包的 第 0 字节(起始位置)开始匹配。
- sid:200000:规则的唯一标识符(Snort ID),用于管理和引用。
- nocase 不区分大小写,nocase为content的修饰符,不需要跟参数
- startswith content的修饰符,不需要跟参数,匹配content 以…开头
- endswith content的修饰符,不需要跟参数,匹配content 以…结尾,endswith 不能和 offset, within 或 distance混合使用
流量特征
flow
选项定义流量状态:
flow:established,to_server;
classtype
classtype
选项定义规则类型:
Suricata可以根据一套预先配置好的类别对流量进行分类,这些类别在你用Linux发行版的软件包管理器安装Suricata软件包时就已经包含了。默认的分类文件通常在/etc/suricata/classification.config中找到
阈值控制
threshold
限制警报频率:
threshold:type limit, track by_src, count 10, seconds 60;
变量使用技巧
预定义变量:
var HOME_NET [192.168.1.0/24,10.0.0.0/8]
var EXTERNAL_NET !$HOME_NET
规则优化实践
性能敏感字段
将高匹配概率的条件前置:
alert http $EXTERNAL_NET any -> $HOME_NET 80 (content:"/wp-admin"; http_uri; fast_pattern; sid:1000002;)
启用快速模式
fast_pattern
加速匹配:
content:"evil.com"; fast_pattern; nocase;
规则调试方法
使用Suricata测试模式:
suricata -T -c /etc/suricata/suricata.yaml -S test.rules
查看匹配统计:
grep -i 'alert' /var/log/suricata/fast.log
实际应用示例
检测HTTP User-Agent中的扫描器特征:
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"Nmap scanning detected"; http_user_agent; content:"nmap"; nocase; sid:1000003; rev:1;)
阻止已知恶意IP:
drop ip 192.0.2.1 any -> $HOME_NET any (msg:"Block known malicious IP"; sid:1000004; rev:1;)