前置知识: 网络安全

IDS/IPS 命令(Suricata/Snort)

2 min入门

Suricata 与 Snort 命令:规则语法与自定义签名、IDS/IPS 模式部署(NFQ)、eve.json 与告警日志分析

Suricata 基础操作

基本写法:启动 Suricata suricata -c <配置文件> -i <接口>

# 启动 Suricata 监听 eth0 接口
sudo suricata -c /etc/suricata/suricata.yaml -i eth0

基本写法:守护进程模式启动 suricata -c <配置文件> --pidfile <PID文件> -D

# 后台守护进程运行 Suricata
sudo suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -D

基本写法:使用 PCAP 文件离线分析 suricata -r <PCAP文件> -c <配置文件>

# 离线分析 PCAP 抓包文件
suricata -r capture.pcap -c /etc/suricata/suricata.yaml

基本写法:测试配置文件 suricata -T -c <配置文件>

# 校验 Suricata 配置文件语法
suricata -T -c /etc/suricata/suricata.yaml

基本写法:查看 Suricata 版本 suricata --build-info

# 查看 Suricata 版本与编译信息
suricata --build-info

Suricata 规则更新

基本写法:更新规则库 suricata-update

# 更新 Suricata 规则集
sudo suricata-update

基本写法:指定规则源 suricata-update --source <源名>

# 从指定源更新规则
sudo suricata-update --source et/open

基本写法:列出规则源 suricata-update list-sources

# 列出所有可用规则源
sudo suricata-update list-sources

基本写法:启用规则源 suricata-update enable-source <源名>

# 启用 ET Pro 规则源
sudo suricata-update enable-source et/pro

基本写法:测试规则文件 suricata -T -S <规则文件> -c <配置文件>

# 测试自定义规则文件语法
suricata -T -S /etc/suricata/rules/local.rules -c /etc/suricata/suricata.yaml

Suricata 规则编写

基本写法:检测特定端口流量 alert tcp any any -> <目标IP> <端口> (msg:"<描述>"; sid:<ID>; rev:1;)

# 检测到 22 端口的 SSH 流量告警
# alert tcp $HOME_NET any -> $EXTERNAL_NET 22 (msg:"SSH traffic"; sid:1000001; rev:1;)

基本写法:检测恶意 User-Agent alert http any any -> any any (msg:"Malicious UA"; http.user_agent; content:"<UA>"; sid:<ID>; rev:1;)

# 检测包含恶意 User-Agent 的请求
# alert http any any -> any any (msg:"Suspicious UA"; http.user_agent; content:"sqlmap"; sid:1000002; rev:1;)

基本写法:检测 SQL 注入特征 alert http any any -> any any (msg:"SQL Injection Attempt"; content:"UNION"; nocase; sid:<ID>; rev:1;)

# 检测 SQL 注入 UNION 关键字
# alert http any any -> any any (msg:"SQLi attempt"; content:"UNION SELECT"; nocase; sid:1000003; rev:1;)

基本写法:规则中引用正则 alert http any any -> any any (msg:"XSS Attempt"; pcre:"/<script/i"; sid:<ID>; rev:1;)

# 使用正则检测 XSS 攻击
# alert http any any -> any any (msg:"XSS attempt"; pcre:"/<script[^>]*>/i"; sid:1000004; rev:1;)

Suricata 日志分析

基本写法:查看告警日志 tail -f /var/log/suricata/fast.log

# 实时查看 Suricata 告警
sudo tail -f /var/log/suricata/fast.log

基本写法:统计告警来源 IP awk '{print $3}' /var/log/suricata/fast.log | sort | uniq -c | sort -rn

# 统计告警来源 IP 排行
sudo awk '{print $3}' /var/log/suricata/fast.log | sort | uniq -c | sort -rn | head

基本写法:检索特定规则告警 grep "<SID>" /var/log/suricata/fast.log

# 查找特定规则 ID 的告警
grep "sid:1000001" /var/log/suricata/fast.log

基本写法:分析 EVE JSON 日志 cat /var/log/suricata/eve.json | python3 -m json.tool | head -50

# 格式化查看 EVE JSON 日志
cat /var/log/suricata/eve.json | python3 -m json.tool | head -50

基本写法:提取告警事件 jq 'select(.event_type=="alert")' /var/log/suricata/eve.json

# 使用 jq 提取所有告警事件
jq 'select(.event_type=="alert")' /var/log/suricata/eve.json

Snort 基础操作

基本写法:启动 Snort 监听 snort -i <接口> -c <配置文件>

# 启动 Snort 监听 eth0
sudo snort -i eth0 -c /etc/snort/snort.conf

基本写法:守护进程模式 snort -D -i <接口> -c <配置文件>

# 后台运行 Snort
sudo snort -D -i eth0 -c /etc/snort/snort.conf -l /var/log/snort

基本写法:测试配置 snort -T -c <配置文件>

# 测试 Snort 配置文件
snort -T -c /etc/snort/snort.conf

基本写法:读取 PCAP 文件 snort -r <PCAP文件> -c <配置文件>

# 离线分析 PCAP 文件
snort -r capture.pcap -c /etc/snort/snort.conf -l /var/log/snort

基本写法:查看 Snort 版本 snort -V

# 查看 Snort 版本
snort -V

Snort 规则编写

基本写法:基础告警规则 alert tcp any any -> <目标> <端口> (msg:"<描述>"; sid:<ID>;)

# 检测 ICMP 流量
# alert icmp any any -> any any (msg:"ICMP traffic"; sid:100001; rev:1;)

基本写法:基于内容检测 alert tcp any any -> any 80 (msg:"<描述>"; content:"<关键字>"; nocase; sid:<ID>;)

# 检测 HTTP 请求中的特定内容
# alert tcp any any -> any 80 (msg:"Directory traversal"; content:"../"; nocase; sid:100002; rev:1;)

基本写法:基于正则匹配 alert tcp any any -> any 80 (msg:"<描述>"; pcre:"/<正则>/i"; sid:<ID>;)

# 使用正则匹配 Web 攻击
# alert tcp any any -> any 80 (msg:"XSS attack"; pcre:"/<script.*alert/i"; sid:100003; rev:1;)

基本写法:基于阈值限制告警 alert tcp any any -> any 80 (msg:"<描述>"; threshold:type threshold, track by_src, count 5, seconds 60; sid:<ID>;)

# 60 秒内同一源 IP 最多告警 5 次
# alert tcp any any -> any 80 (msg:"HTTP scan"; threshold:type threshold, track by_src, count 5, seconds 60; sid:100004; rev:1;)

Snort 日志分析

基本写法:查看告警日志 tail -f /var/log/snort/alert

# 实时查看 Snort 告警
sudo tail -f /var/log/snort/alert

基本写法:统计告警次数 grep -c "alert" /var/log/snort/alert

# 统计告警总数
grep -c "\[**\]" /var/log/snort/alert

基本写法:提取告警类型 grep -oE "\[1:[0-9]+:[0-9]+\]" /var/log/snort/alert | sort | uniq -c | sort -rn

# 提取告警规则 ID 并统计
grep -oE "\[1:[0-9]+:[0-9]+\]" /var/log/snort/alert | sort | uniq -c | sort -rn | head

基本写法:检索特定规则告警 grep "<SID>" /var/log/snort/alert

# 查找规则 ID 为 100001 的告警
grep "1:100001" /var/log/snort/alert

Zeek(原 Bro)分析

基本写法:启动 Zeek 监听 zeekctl deploy

# 部署 Zeek 配置并启动
sudo zeekctl deploy

基本写法:查看 Zeek 状态 zeekctl status

# 查看 Zeek 各节点状态
sudo zeekctl status

基本写法:分析 PCAP 文件 zeek -r <PCAP文件>

# 离线分析 PCAP 生成 Zeek 日志
zeek -r capture.pcap

基本写法:查看连接日志 cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p

# 提取连接日志中的源 IP 目标 IP 端口
cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p | head

基本写法:统计 HTTP 访问 cat http.log | zeek-cut host uri | sort | uniq -c | sort -rn

# 统计 HTTP 访问的目标主机和 URI
cat http.log | zeek-cut host uri | sort | uniq -c | sort -rn | head

IDS 规则管理

基本写法:加载自定义规则 echo 'include /etc/suricata/rules/local.rules' >> <配置文件>

# 在 Suricata 配置中加载自定义规则
echo 'include /etc/suricata/rules/local.rules' | sudo tee -a /etc/suricata/suricata.yaml

基本写法:统计规则数量 grep -c "^alert\|^drop" <规则文件>

# 统计规则文件中规则数量
grep -c "^alert\|^drop" /etc/suricata/rules/local.rules

基本写法:禁用特定规则 sed -i 's/^alert.*sid:<SID>.*/#&/' <规则文件>

# 注释掉指定 SID 的规则
sudo sed -i 's/^alert.*sid:1000001.*/#&/' /etc/suricata/rules/local.rules

基本写法:Snort 加载自定义规则 echo 'include $RULE_PATH/local.rules' >> /etc/snort/snort.conf

# 在 Snort 配置中加载自定义规则
echo 'include $RULE_PATH/local.rules' | sudo tee -a /etc/snort/snort.conf

IDS 性能调优

基本写法:查看 Suricata 运行统计 suricatasc -c uptime

# 通过 Suricata 控制接口查看运行时间
suricatasc -c uptime

基本写法:查看抓包统计 cat /var/log/suricata/stats.log | grep -i "drop"

# 查看数据包丢弃情况
cat /var/log/suricata/stats.log | grep -i "drop\|drop_alert"

基本写法:优化抓包模式 suricata --set af-packet.0.cluster-type=cluster_flow

# 设置 AF_PACKET 集群模式为按流分发
sudo suricata --set af-packet.0.cluster-type=cluster_flow -c /etc/suricata/suricata.yaml -i eth0

基本写法:调整运行模式 suricata --runmode=workers -c <配置文件> -i <接口>

# 使用 workers 模式提高性能
sudo suricata --runmode=workers -c /etc/suricata/suricata.yaml -i eth0

基本写法:查看 CPU 使用 top -p $(pidof suricata)

# 监控 Suricata 进程 CPU 占用
top -p $(pgrep -d, suricata)

IDS 部署验证

基本写法:发送测试流量 curl -A "sqlmap/1.0" http://<目标>/test?id=1

# 发送模拟攻击流量验证 IDS 检测
curl -A "sqlmap/1.0" "http://192.168.1.10/test?id=1' UNION SELECT 1--"

基本写法:发送 ICMP 测试 ping -c 1 <目标>

# 发送 ICMP 包触发 ICMP 规则
ping -c 1 192.168.1.10

基本写法:使用 nmap 触发规则 nmap -sS -p 1-1000 <目标>

# 端口扫描触发扫描检测规则
nmap -sS -p 1-1000 192.168.1.10

基本写法:验证告警是否生成 tail -f /var/log/suricata/fast.log | grep "test"

# 实时查看测试流量触发的告警
sudo tail -f /var/log/suricata/fast.log | grep -i "test\|sqlmap"