suricata基本使用

Suricata 是一个开源的高性能网络入侵检测系统(IDS)、入侵防御系统(IPS)和网络安全监控工具,它可以监测、记录和分析网络流量,并检测潜在的安全威胁。Suricata 的工作原理类似于其他 IDS/IPS 系统,主要通过分析网络流量中的数据包来检测恶意活动。

参考:https://docs.suricata.io/en/suricata-8.0.2/

环境搭建

macos

1
brew install suricata

linux

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

启动

1
2
sudo systemctl start suricata
sudo systemctl status suricata

image

使用时,需要明确网卡抓取


suricata rules

规则/签名由以下部分组成

  • action : 决定规则匹配时会发生什么
  • header : 定义规则的协议、IP 地址、端口和方向
  • rule options : 定义规则的具体内容

image

action

action包括:

  • alert - 生成警报。
  • pass - 停止进一步检查数据包。
  • drop - 丢弃数据包并生成警报。
  • reject - 向匹配数据包的发送方发送 RST/ICMP unreach error。
  • rejectsrc - 与 reject 相同。
  • rejectdst - 向匹配数据包的接收方发送 RST/ICMP error 数据包。
  • rejectboth - 向对话双方发送 RST/ICMP error 数据包。

In IPS mode, using any of the reject actions also enables drop.

protocol

协议包括:

tcp、udp、icmp、ip

以及tcp相关协议

  • tcp-pkt(用于匹配单个 tcp 数据包中的内容)
  • tcp-stream(仅用于匹配重新组装的 tcp 数据流中的内容)

还有几个应用层协议

HTTP(1/2)、FTP、TLS、SMB、DNS、DCERPC、DHCP、SSH、SMTP、IMAP、POP3、NFS、IKE、Kerberos(KRB5)、BitTorrent-DHT、NTP、RFB(VNC)、RDP、SNMP、TFTP、SIP、WebSocket

这些协议的可用性取决于配置文件 suricata.yaml 中是否启用了该协议。

如果签名的协议声明为 “http”,Suricata 会确保签名只在 TCP 流包含 http 流量时才匹配。

source 和 destination

规则样式如下:

1
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET Request Containing Rule in URI"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:123; rev:1;)

通常,您还需要使用 $HOME_NET$EXTERNAL_NET 等变量。suricata.yaml 配置文件指定了这些变量所涉及的 IP 地址。相应的$HOME_NET$EXTERNAL_NET 设置将在规则中取代变量。

  • $HOME_NET:表示受监控环境中被视为本地或内部的受保护网络地址集合。
  • $EXTERNAL_NET:表示相对于 HOME_NET 而言,被定义为外部或非本地的网络地址集合,其具体范围取决于配置策略。
  • $not HOME_NET:表示所有不属于 HOME_NET 的网络地址集合,即 HOME_NET 的补集。
  • $EXTERNAL_NET and not HOME_NET:表示在已定义的外部网络范围内,进一步排除 HOME_NET 后得到的、明确不属于本地网络的地址集合。

规则使用示例:

示例 含义
!1.1.1.1 除1.1.1.1外的所有IP地址
![1.1.1.1, 1.1.1.2] 除1.1.1.1和1.1.1.2外的所有IP地址
$HOME_NET yaml中设置的HOME_NET
[$EXTERNAL_NET, !$HOME_NET] EXTERNAL_NET且不包括HOME_NET
[10.0.0.0/24, !10.0.0.5] 10.0.0.0/24,不包括10.0.0.5
[…, [….]]
[…, ![…..]]

port 端口

规则使用样例

示例 含义
[80, 81, 82] 端口80、81和82
[80: 82] 从80到82的范围
[1024: ] 从1024到最高端口号
!80 除80外的所有端口
[80:100,!99] 从80到100的范围,不包括99
[1:80,![2,4]] 从1到80的范围,不包括端口2和4
[.., [..,..]]

rules option

option用括号括起来,并用分号隔开。有些选项有设置(如 msg),设置由选项的关键字、冒号和设置指定。其他选项则没有设置,只有关键字(如 nocase):

1
2
<keyword>: <settings>;
<keyword>;

字符 ; 和 “ 在 Suricata 规则语言中具有特殊含义,在规则选项值中使用时必须转义。例如

1
msg:"Message with semicolon\;";

\有转义功能,所以也需要转义

Meta keywords

msg

关键字 msg 提供有关签名和可能警报的上下文信息。

example:

1
2
msg:"ET MALWARE Win32/RecordBreaker CnC Checkin";
msg:"ET EXPLOIT SMB-DS DCERPC PnP bind attempt";

sid

关键字 sid 赋予每个签名自己的 id。该 ID 用大于 0 的数字表示。sid 的格式为:

1
sid: 123;

编写规则的标准做法是将签名 sid 作为签名的最后一个关键字(如果有 rev,则倒数第二个关键字)

对于同一规则组(gid)内的所有规则,该值必须是唯一的。

rev(revision)

Rev 表示签名的版本

1
rev: 123;

gid (group ID)

gid 关键字可用于为不同组的签名赋予另一个 id 值(与 sid 类似)。Suricata 默认使用 gid 1。在大多数情况下,无需更改默认 gid 值。更改 gid 值不会产生任何技术影响,只会在警报数据中注明该值。

fast.log 文件中警报条目中的 gid 值示例。在 [1:123:1] 部分中,第一个 1 是 gid(123 是 sid,1 是 rev)。

classtype

classtype 关键字提供有关规则和警报分类的信息。它由短标签,长名称和优先级组成。可以用于说明一条规则是信息规则还是关于 CVE 的规则

1
2
config classification: web-application-attack,Web Application Attack,1
config classification: not-suspicious,Not Suspicious Traffic,3

reference

1
reference:type,reference

example:

1
2
reference:url,www.info.com
reference:cve,CVE-2014-1234

priority

优先级关键字带有一个强制数值,范围从 1 到 255。常用值为 1 至 4。最高优先级为 1,优先级较高的签名将首先被检查。通常签名的优先级由类类型定义决定。可以通过在签名中定义优先级关键字来覆盖类类型定义。

1
2
priority: 1;
priority: 2;

metadata

元数据关键字允许在签名中添加额外的非功能信息。虽然格式是自由的,但建议坚持使用kv结构

1
2
metadata: key value;
metadata: key value, key value;

target

关键字允许规则编写者指定警报的哪一方是攻击目标。如果指定,警报事件就会增强,以包含源和目标的信息。

1
target:[src_ip|dest_ip]

如果值为 src_ip,则生成事件中的源 IP(JSON 中的 src_ip 字段)就是攻击目标。如果 target 设置为 dest_ip,则目标为生成事件中的目标 IP。

基本使用

1
2
# 查看可用网卡
ip link show
1
2
# 验证可运行模式
sudo suricata --list-runmodes

image

其中disabled是不支持使用

  • 可运行模式

    • PCAP_DEV :简单兼容性好,性能一般,低流量

    • PCAP_FILE : 离线处理,用于分析pcap/pcapng文件

      • suricata -r traffic.pcap -c suricata.yaml
    • AF_PACKET_DEV : 生产常用,性能好,配置简单,稳定,ids常用

    • AF_XDP_DEV : 基于eBPF / XDP,对内核和带宽要求高,配置复杂。延迟低,吞吐高

    • NFQ / IPFW : ips常用,需要iptables配合,pf/ipfw

  • 线程

    • single:单线程,简单,性能低
    • workers:几乎不共享锁,CPU利用率最高,延迟最低
    • autofp:流固定,同一个“连接(流)”的包,永远给同一个检测线程。适合pcap,NFQ,复杂规则集等
1
2
#测试配置文件
sudo suricata -T -c suricata.yaml
1
2
#更新规则库
sudo suricata-update

image

IDS模式

ids模式监听网卡

1
sudo suricata -c /path/to/suricata.yaml -i <网卡名>

查看实时日志

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

启动示例

1
2
3
4
5
6
7
8
9
10
# single 模式
sudo suricata -c suricata.yaml -i enp1s0f1np1 --runmode=single
# workers 模式(高性能)
sudo suricata -c suricataQM2.yaml -i enp1s0f1np1 --runmode=workers

# utofp 模式(流保序)
sudo suricata -c suricata.yaml -i enp1s0f1np1 --runmode autofp

# PF_RING 模式(需先加载驱动)
sudo suricata -c suricata.yaml --runmode pfring --pfring-dev enp1s0f1np1

IPS模式

  1. 配置iptables转发流量

    1
    sudo iptables -I FORWARD -j NFQUEUE --queue-num 0
  2. 启动Suricata处理队列

    1
    sudo suricata -c suricata.yaml -q 0 --runmode=workers

    在线部署,可实时阻断威胁
    规则中需使用 drop 动作:

    1
    2
    #规则示例:阻断SSH暴力破解
    drop tcp any any -> any 22 (msg:"SSH Brute Force"; sid:10001;)

    需定期测试避免误杀合法流量

离线分析

分析pacp文件

1
sudo suricata -r traffic.pcap -c suricata.yaml -l ./logs

输出

  • eve.json:结构化事件日志
  • fast.log:告警摘要
  • stats.log:性能统计

规则管理

自定义规则
默认文件位置:/etc/suricata/rules/local.rules

并非是固定的,具体由suricata.yaml的rule-files字段决定

image

icmp协议检测

1
alert icmp any any -> any any (msg:"ICMP Ping Detected"; sid:1000001;)

HTTP主机检测

1
alert tcp any any -> any 80 (msg:"HTTP Access: Baidu"; content:"Host|3A| www.baidu.com"; sid:1000002;)

其他

主要文件和目录

1
2
3
4
5
6
7
8
9
目录:
/etc/suricata/ 存放suricata执行和配置文件的目录
/etc/suricata/rules 规则文件存放目录,自己之后写的也要放在这里
/var/log/suricata/ 存放suricata日志的目录

文件:
suricata.yaml suricata的配置文件,重中之重,特别重要,位于/etc/suricata/下
suricata.rules 官方规则文件,存放在/etc/suricata/rules中
fast.log 警告日志文件,存放在/var/log/suricata/下,匹配的输出都在这里

简单使用,启动

1
suricata -c /etc/suricata/suricata.yaml -i eth0  

image

由于笔者是使用orbstack拉取的ubuntu,虚拟内核不完整支持 AF_PACKET fanout,所以无法使用 AF_PACKET 的 fanout(多队列/多线程分流)能力,导致报错,程序会自动退回到不使用 fanout 的方式。不影响suricata正常使用。

注意!

更新/修改规则文件(如 local.rulessuricata.rules)后,规则是不会自动加载的,需要重启suricata

1
2
3
sudo systemctl restart suricata 
# 或
sudo pkill suricata && sudo suricata -c /etc/suricata/suricata.yaml -i eth0

在suricata 8.0以后,如果你启用了 Unix socket, 则可以 热加载规则

1
2
3
4
sudo suricata -c /etc/suricata/suricata.yaml -i eth0 --unix-socket

# 更新规则后执行
suricatasc -c reload-rules

注意!

  • 只重新加载规则
  • suricata.yaml 仍然要重启