Suricata 使用记录与规则实践
一、前言
Suricata 一款高性能的开源网络入侵检测系统(IDS)、入侵防御系统(IPS)及网络安全监控引擎。近期工作中有接触并使用该引擎,记录与整理一下使用方法。
二、Suricata 安装
本文安装使用 Ubuntu ,新版 Ubuntu 系统可直接通过官方PPA安装。安装最新稳定版Suricata步骤如下:
1、安装 Suricata
1 | sudo apt-get install software-properties-common |
2、通过以下命令查看 Suricata 版本信息、编译选项及服务状态,验证是否安装成功
1 | sudo suricata --build-info |
⚠️若出现 failed 报错,查看一下本机的网卡名称与 suricata.yaml 配置文件是不是不一致
1)查看网卡名称 ,本机网卡名称为 ens160
1 | ip addr |
2)查看 Suricata 配置文件 suricata.yaml 中网卡名称是否与本机的网卡名称一致,通过定位文件 af-packet 原配置文件为 interface 为 eth0 与本机的网卡接口名称不符,导致无法启动成功
1 | vim /etc/suricata/suricata.yaml |
修改为本机的网卡接口 ens160 后,重启 suricata,查看状态
1 | sudo vim /etc/suricata/suricata.yaml |
3、告警测试
1 | sudo suricata-update # 更新 suricata 规则 |
测试 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 |
然后访问指定测试页面,看有没有触发 Suricat IDS 告警
1 | curl http://testmynids.org/uid/index.html |
至此 Suricata 安装成功,验证也能正常触发告警。
三、Suricata 文件分析
1、通过查看 suricata 目录,了解各个文件的作用/
suricata.yaml
主配置文件,主要包含 “规则配置”、”接口配置”、”日志配置”、”检测配置” 四大部分
Step 1: Inform Suricata about your network 配置 Suricata 可检测的网络范围
Step 2: Select outputs to enable 定义 Suricata 记录哪些日志、以什么格式记录
eve.json:Suricata 的主日志:包含告警、HTTP、DNS、TLS、文件、流、事件等
fast.log:简化告警格式(快速查看)
stats.log:性能统计
pcap-log:把规则命中的包直接输出为 pcap
drop.log:IPS 模式下被拦截的流量
Step 3: Configure common capture settings 设置捕获引擎和捕获的网络接口,还有一些捕获策略
Step 4: App Layer Protocol configuration 应用层协议分析器设置,配置 Suricata 能识别和解码的协议
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)
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;) |
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;) |
suricata.rules
由上面可知,由于初始执行 suricata-update 命令后,加载了开源的 ET Open 全量规则,目前达 6w+ 规则(但维护者是由国外人员维护,大多数不符合我们国内的需求,可以根据业务进行筛选保留),规则文件存放在 /var/lib/suricata/rules/suricata.rules 如果需要新增规则,在 suricata.rules 文件中编写即可。
ET Open 规则库地址:https://rules.emergingthreats.net/open/suricata-7.0.3/rules/
/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。
四、规则编写
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 | | 动作 | 说明 | |
Protocol(协议),Suricata 支持 应用层协议(L7)直接匹配,如
http、dns,支持的协议包括:
1 | tcp | udp | icmp | ip | http | tls | dns | smb | ftp | ssh |
源 / 目的地址与端口
1 | src_ip src_port -> dst_ip dst_port |
Direction(方向)
1 | | 符号 | 含义 | |
2)规则选项
规则选项位于括号内,以 ; 分隔。
数据类
1 | | 关键字 | 说明 | |
流量与状态控制
1 | | 关键字 | 说明 | |
内容匹配(最核心)
content
1 | content:"select"; |
正则
1 | pcre:"/union\s+select/i"; |
精准定位匹配范围
1 | depth / offset / distance / within |
应用层字段匹配(Suricata 强项)
1 | | 协议 | 关键字 | |
编码与绕过检测
1 | | 关键字 | 说明 | |
2、规则编写案例
以下是对 SQLMAP 扫描流量数据包包进行特征分析,并编写的示例规则
1)sqlmap 流量特征分析,User-Agent 头存在特征 “sqlmap/1.9#stable(https://sqlmap.org)“
待修改时间
2)编写规则,规则如下:
1 | alert http any any -> any any ( |
对以上 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#stable,nocase:忽略大小写
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 | gedit /var/lib/suricata/rules/suricata.rules |
1 | alert http any any -> any any ( |
验证规则是否生效,进行 sqlmap 扫描前先监控 fast.log
1 | sudo tail -f /var/log/suricata/fast.log |
执行sqlmap 查看 fast.log 是否出现告警信息,以下能正常触发告警
五、参考文章
1 | https://docs.suricata.io/en/suricata-8.0.2/rules/index.html |






























