Suricata 使用记录与规则实践

一、前言

Suricata 一款高性能的开源网络入侵检测系统(IDS)、入侵防御系统(IPS)及网络安全监控引擎。近期工作中有接触并使用该引擎,记录与整理一下使用方法。

二、Suricata 安装

本文安装使用 Ubuntu ,新版 Ubuntu 系统可直接通过官方PPA安装。安装最新稳定版Suricata步骤如下:

1、安装 Suricata

1
2
3
4
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:oisf/suricata-stable
sudo apt-get update
sudo apt-get install suricata jq

image-20251111094351021

image-20251111094438480

image-20251111094602368

2、通过以下命令查看 Suricata 版本信息、编译选项及服务状态,验证是否安装成功

1
2
sudo suricata --build-info
sudo systemctl status suricata

wechat_2025-11-11_174959_726

⚠️若出现 failed 报错,查看一下本机的网卡名称与 suricata.yaml 配置文件是不是不一致

image-20251111115419658

1)查看网卡名称 ,本机网卡名称为 ens160

1
ip addr

ip

2)查看 Suricata 配置文件 suricata.yaml 中网卡名称是否与本机的网卡名称一致,通过定位文件 af-packet 原配置文件为 interfaceeth0 与本机的网卡接口名称不符,导致无法启动成功

1
vim /etc/suricata/suricata.yaml

image-20251111141659143

修改为本机的网卡接口 ens160 后,重启 suricata,查看状态

1
2
3
sudo vim /etc/suricata/suricata.yaml
sudo systemctl restart suricata
sudo systemctl stutus suricata

image-20251111143617429

image-20251217165216081

3、告警测试

1
2
3
sudo suricata-update # 更新 suricata 规则
sudo systemctl restart suricata #安装规则后重启服务
sudo tail /var/log/suricata/suricata.log # 检查运行日志确认状态

image-20251217165340665

测试 IDS(只告警,不阻断),Suricata 自带的规则集中的 ID 2100498 专为测试设计,检测到返回包中存在 uid=0|28|root|29| 字符触发告警,规则内容如下:

1
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)

首先,监控日志输出

1
sudo tail -f /var/log/suricata/fast.log

image-20251217170027694

然后访问指定测试页面,看有没有触发 Suricat IDS 告警

1
curl http://testmynids.org/uid/index.html

image-20251217170616628

至此 Suricata 安装成功,验证也能正常触发告警。

三、Suricata 文件分析

1、通过查看 suricata 目录,了解各个文件的作用/

image-20251217170806456

suricata.yaml

主配置文件,主要包含 “规则配置”、”接口配置”、”日志配置”、”检测配置” 四大部分

Step 1: Inform Suricata about your network 配置 Suricata 可检测的网络范围

image-20251128172406909

Step 2: Select outputs to enable 定义 Suricata 记录哪些日志、以什么格式记录

eve.json:Suricata 的主日志:包含告警、HTTP、DNS、TLS、文件、流、事件等

fast.log:简化告警格式(快速查看)

stats.log:性能统计

pcap-log:把规则命中的包直接输出为 pcap

drop.log:IPS 模式下被拦截的流量

image-20251128172936191

image-20251128173046884

image-20251217170901947

Step 3: Configure common capture settings 设置捕获引擎和捕获的网络接口,还有一些捕获策略

image-20251128173442677

Step 4: App Layer Protocol configuration 应用层协议分析器设置,配置 Suricata 能识别和解码的协议

image-20251128173815490

classification.config

classification.config 是 Suricata 用于定义 分类名称(shortname)分类说明(description)分类优先级(priority),例上面提及的 Suricata 自带的规则集中的 ID 2100498 专为测试设计,规则 classtype 为shortname:bad-unknown

1
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, confidence Medium, signature_severity Informational, updated_at 2019_07_26;)

根据 classification.config ,分类名称为 bad-unknown、分类说明为 Potentially Bad Traffic、分类优先级为 2 (数据越小越严重)

priority 1 高危(High)、priority 2 中危(Medium)、priority 3 低危(Low)、priority 4 很低(Informational)

image-20251201164527953

reference.config

reference.config 主要定义规则的参考链接,例如下面规则中:reference:url,github.com/no0be/DNSlivery; 对应 reference.config 文件定义 url 参数值是 https:// ,所以该规则漏洞的 reference 参考链接是 https://github.com/no0be/DNSlivery

1
alert dns any any -> $HOME_NET any (msg:"ET ATTACK_RESPONSE UTF8 base64 string /This Program/ in DNS TXT Reponse"; content:!"v=DKIM"; content:"|00 00 10 00 01 c0 0c 00 10 00 01|"; content:"hpcyBwcm9"; distance:0; fast_pattern; reference:url,github.com/no0be/DNSlivery; classtype:bad-unknown; sid:2027027; rev:3; metadata:affected_product Windows_XP_Vista_7_8_10_Server_32_64_Bit, attack_target Client_Endpoint, created_at 2019_03_05, deployment Perimeter, malware_family DNSlivery, confidence High, signature_severity Major, tag Description_Generated_By_Proofpoint_Nexus, updated_at 2023_01_24;)

image-20251201165459257

threshold.config

threshold.config 是 Suricata 用来 减少噪声告警(alert noise) 的配置文件,允许对某些规则(SID)进行以下操作:

1)限制(Limit)告警触发频率:某规则非常容易触发,但不是特别危险,希望减少告警频次。

2)阈值(Threshold)判断:只有当事件在短时间内出现多次时才触发告警(暴力破解等场景)。

3)完全抑制(Suppress)某个规则的告警:某条规则误报过多,希望直接禁用(但规则仍加载,只是不告警)。

例子:threshold:type limit, track by_src, count 1, seconds 300; 来源 IP(by_src) 在300 秒内(5 分钟)最多报警 1 次

1
alert http $EXTERNAL_NET any -> $HOME_NET any (msg:"ET ATTACK_RESPONSE Backdoor reDuh http tunnel"; flow:established,to_server; threshold:type limit, track by_src, count 1, seconds 300; http.uri; content:"?action=getData&servicePort="; http.user_agent; content:"Java/"; reference:url,www.sensepost.com/labs/tools/pentest/reduh; classtype:trojan-activity; sid:2011668; rev:8; metadata:created_at 2010_07_30, signature_severity Major, updated_at 2024_03_06;)

image-20251201170027934

suricata.rules

由上面可知,由于初始执行 suricata-update 命令后,加载了开源的 ET Open 全量规则,目前达 6w+ 规则(但维护者是由国外人员维护,大多数不符合我们国内的需求,可以根据业务进行筛选保留),规则文件存放在 /var/lib/suricata/rules/suricata.rules 如果需要新增规则,在 suricata.rules 文件中编写即可。

ScreenShot_2025-12-17_171129_719

image-20251128165925066

ET Open 规则库地址:https://rules.emergingthreats.net/open/suricata-7.0.3/rules/

image-20251128175355635

/usr/share/suricata/rules/*

/usr/share/suricata/rules/是 Suricata 安装包自带的“内置规则目录,这些规则用于协议行为异常(protocol anomalies),不是攻击签名,例如:IPv4 包长度不合法、HTTP 请求格式不合法、TLS 握手内容异常、DNS 响应格式错误、流量方向不对(wrong direction)注意:Suricata 默认不会从 /usr/share/suricata/rules 加载规则。 Suricata 默认加载 /var/lib/suricata/rules/suricata.rules。

image-20251217171907867

四、规则编写

1、规则组成

Suricata 规则(Rule)主要由 规则头(Rule Header)规则选项(Rule Options) 两大部分组成,示例如下:

1
alert http any any -> any any (msg:"Test HTTP Rule"; sid:1000001; rev:1;)

1)规则头(Rule Header)

Action(动作),定义匹配到规则后的行为:

1
2
3
4
5
6
7
| 动作   | 说明                 |
| ------ | ------------------- |
| alert | 触发告警(最常用) |
| drop | 丢弃数据包(IPS 模式) |
| reject | 丢弃并返回 RST/ICMP |
| pass | 忽略该流量 |
| log | 仅记录不告警 |

Protocol(协议),Suricata 支持 应用层协议(L7)直接匹配,如 httpdns,支持的协议包括:

1
tcp | udp | icmp | ip | http | tls | dns | smb | ftp | ssh

源 / 目的地址与端口

1
src_ip src_port -> dst_ip dst_port

Direction(方向)

1
2
3
4
| 符号  | 含义 |
| ---- | ---- |
| -> | 单向 |
| <-> | 双向 |

2)规则选项

规则选项位于括号内,以 ; 分隔。

数据类

1
2
3
4
5
6
7
8
| 关键字    | 说明                |
| --------- | ------------------|
| msg | 告警信息 |
| sid | 规则 ID(必须唯一) |
| rev | 规则版本 |
| classtype | 攻击分类 |
| priority | 告警优先级 |
| metadata | 额外描述 |

流量与状态控制

1
2
3
4
5
6
| 关键字    | 说明          |
| --------- | ------------|
| flow | 会话方向/状态 |
| flowbits | 流标记 |
| flags | TCP 标志位 |
| seq / ack | TCP 序号 |

内容匹配(最核心)

content

1
2
content:"select";
nocase;

正则

1
pcre:"/union\s+select/i";

精准定位匹配范围

1
depth / offset / distance / within

应用层字段匹配(Suricata 强项)

1
2
3
4
5
6
| 协议 | 关键字                                          |
| ---- | --------------------------------------------- |
| HTTP | http_uri, http_method, http_header, http_body |
| DNS | dns.query |
| TLS | tls.sni |
| SMB | smb.command |

编码与绕过检测

1
2
3
4
5
6
| 关键字                | 说明           |
| --------------------- | -------------- |
| uricontent | URL 解码后匹配 |
| fast_pattern | 快速匹配 |
| base64_decode | Base64 解码 |
| byte_test / byte_jump | 二进制分析 |

2、规则编写案例

以下是对 SQLMAP 扫描流量数据包包进行特征分析,并编写的示例规则

1)sqlmap 流量特征分析,User-Agent 头存在特征 “sqlmap/1.9#stable(https://sqlmap.org)

image-20251204174304540

待修改时间

image-20251204174321959

2)编写规则,规则如下:

1
2
3
4
5
6
7
8
9
alert http any any -> any any (
msg:"SQLMAP Attack Detected - SQLMap Full UA";
flow:to_server,established;
http.header;
content:"sqlmap/1.9#stable"; nocase;
classtype:web-application-attack;
sid:900002;
rev:1;
)

对以上 Suricata 规则逐行进行注释说明,

规则头

  • alert:匹配成功时触发告警
  • http:仅匹配 Suricata 解析为 HTTP 的应用层流量
  • any any:任意源 IP 和源端口
  • ->:单向,从客户端到服务器
  • any any:任意目的 IP 和目的端口
1
alert http any any -> any any (

告警信息,明确指出检测的是 SQLMap 工具的完整 User-Agent 特征

1
msg:"SQLMAP Attack Detected - SQLMap Full UA";

流量方向to_server:流量方向为 客户端 -> 服务器established:只匹配已建立的 TCP 会话,减少误报(如扫描或异常握手流量)

1
flow:to_server,established;

指定匹配位置,指定 后续 content 只在 HTTP Header 中匹配

1
http.header;

指定匹配内容,匹配内容为 sqlmap/1.9#stablenocase:忽略大小写

1
User-Agent: sqlmap/1.9#stable

攻击分类:Web 应用攻击

1
classtype:web-application-attack;   //应用 classification.config 文件里面的分类

规则编号,规则唯一 ID

1
sid:900002;

规则版本号,当规则调整(UA 变更、条件增强)时递增

1
rev:1;

3、规则入库

将编写的规则添加到 /var/lib/suricata/rules/suricata.rules 然后重启 suricata 这样规则才能成功加载

1
2
gedit /var/lib/suricata/rules/suricata.rules 
systemctl restart suricata
1
2
3
4
5
6
7
8
9
alert http any any -> any any (
msg:"SQLMAP Attack Detected - SQLMap Full UA";
flow:to_server,established;
http.header;
content:"sqlmap/1.9#stable"; nocase;
classtype:web-application-attack;
sid:900002;
rev:1;
)

wechat_2025-12-04_175555_528

验证规则是否生效,进行 sqlmap 扫描前先监控 fast.log

1
sudo tail -f /var/log/suricata/fast.log

image-20251217172752844

执行sqlmap 查看 fast.log 是否出现告警信息,以下能正常触发告警

ScreenShot_2025-12-17_173543_226

五、参考文章

1
2
3
4
5
https://docs.suricata.io/en/suricata-8.0.2/rules/index.html
https://www.cnblogs.com/smileleooo/p/18169413
https://turtledoc.cn/quickstart.html
https://xz.aliyun.com/news/13362
https://zhuanlan.zhihu.com/p/36340468