【道】纵深 · 【术】防火墙/IDS/WAF · 【器】规则集 · 【造器】M4
黄玮
2026-秋
M3 你已攻破了自己的靶场——明文凭证、SQL 注入、XSS、上传马都复现了。M4:给这个千疮百孔的应用套上纵深防御,并量化你挡住了多少、放过了多少。
debug=False、隐藏指纹、最小权限| 维度 | 内容 |
|---|---|
| 真实问题 | 如何用防火墙 + IDS + WAF 联防? |
| 实验(= 综合实践项目(capstone) M4) | 加固与边界防护(规则集 + 度量) |
| 讲授 | ≤2 学时:道 / 术 / 器 / 造器 |
| 来源 | 第 8 章(防火墙)/ 第 9 章(IDS/IPS)/ 第 10 章(运行环境加固,并入实践) |
| 能力点亮 | 簇 ④·L2 防御与加固 |
M4 权重 12%;其中「深度 0.30」要求规则集有命中 / 误报度量数字——规则 vs 误报的权衡是本里程碑的核心思维。
5000 只对内 / 仅本机)Server / Werkzeug
版本号)一条规则写得太宽 → 误报(FP)炸了,正常请求被拦,业务受损;写得太窄 → 漏报(FN),攻击溜过去,形同虚设。好的防御工程师不是写得出规则,而是能量化这条权衡曲线。
' OR 1=1 -- 的规则 = 5
分钟;证明它在真实流量下不误报、不漏报 = 5 天这就是为什么 M4 量规里「深度 0.30」单独考核「规则严格度 vs 误报的权衡」——它区分了「贴规则」与「会守」。
M4 的思维升级:从 M3 的「能不能攻破」到 M4 的「我的防御覆盖率是多少、误报率是多少」——这是从攻击者思维到防御者思维的转折点。
DROP
所有未显式放行的流量——最小暴露原则的直接实现filter(过滤,最常用)/
nat(地址转换)/ mangle(改包)INPUT(入站)/
OUTPUT(出站)/ FORWARD(转发)ACCEPT /
DROP(静默丢弃)/ REJECT(拒绝并回包)默认策略
DROP+ 白名单放行 = 收敛暴露面的标准范式。深度理论见chap0x08.md「防火墙」一章。
# 默认拒绝所有入站,允许所有出站
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 放行回包(已建立连接)和本机回环
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
# 仅放行必要端口:SSH(22) + Web(5000,限来源)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 127.0.0.1 --dport 5000 -j ACCEPT
# 其余全 DROP(已被默认策略兜底)
对照 M2 暴露面清单:M2 扫到的每一个开放端口,在这里都要回答「该不该对外开」——这就是把暴露面清单的处置建议落地。
nftables 是 iptables 的统一替代(统一了
iptables/ip6tables/arptables)# nftables 等价写法(默认拒绝 + 放行 22/5000)
nft add table inet filter
nft add chain inet filter input '{ type filter hook input priority 0; policy drop; }'
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iif lo accept
nft add rule inet filter input tcp dport 22 accept
| IDS(入侵检测) | IPS(入侵防御) | |
|---|---|---|
| 部署 | 旁路(镜像流量) | 串接(在线) |
| 动作 | 检测到 → 告警 | 检测到 → 阻断 |
| 风险 | 漏报无害(只漏告警) | 误报会中断业务 |
| 课程定位 | M4 主线(先看清楚) | 进阶(基于 IDS 度量后上 IPS) |
' OR 1=1)
埋伏(M6):异常检测正是 AI / ML 的用武之地——M4 任务 E 用 IsolationForest 给请求 / 日志打异常分,与规则版对比,为 M6「AI 检测组件」铺路。规则 → AI 增强 = 课程螺旋。
深度理论(IDS/IPS 部署模式、规则语法全集、误报治理)见
https://github.com/c4pr1c3/cuc-ns-ppt/blob/master/chap0x09.md「入侵检测系统」一章。
# 规则 = 动作 协议 源 源端口 -> 目的 目的端口 (选项)
# 经典 SQLi 签名:在 URI 或请求体里匹配 ' OR 1=1
alert http any any -> $HOME_NET any ( \
msg:"M4-SQLi OR-1-1 signature"; \
flow:established,to_server; \
http.request_line; \
content:"' OR 1=1"; nocase; \
sid:1000001; rev:1; \
)
alert(告警)/
drop(IPS 丢弃)/ pass(放行,做白名单)1000000+
段,避开官方保留段)| 规则判定:攻击 | 规则判定:正常 | |
|---|---|---|
| 真实:攻击 | TP(命中) | FN(漏报) |
| 真实:正常 | FP(误报) | TN(真阴) |
规则调优的本质:在 precision 和 recall 之间找业务可接受的平衡点——M4「深度 0.30」考核的核心。
# 1. 跑 IDS(旁路监听),把告警输出到文件
suricata -c suricata.yaml -i lo -l /var/log/suricata/ &
# 2. 重放 M3 PoC 流量(正样本)——SQLi/XSS/上传变种
python3 replay-poc.py --target http://127.0.0.1:5000 --set m3-payloads/
# 3. 重放正常流量(负样本)——含特殊字符的合法登录/查询
python3 replay-normal.py --target http://127.0.0.1:5000
# 4. 解析 eve.json(Suricata 告警),对照标签算 TP/FP/precision/recall
python3 score.py --alerts /var/log/suricata/eve.json --labels labels.json
输出形如
TP=18, FP=3, FN=2, TN=45 → precision=0.86, recall=0.90——这就是 M4 报告里要的数字。光贴规则无度量 = 深度不合格。
DetectionOnly(只记录,不拦)——调优期首选,先看误报再决定On(阻断)——调优完成后上线最佳实践:先
DetectionOnly跑一周看日志,把误报白名单化,再切阻断——这又是「度量优先于阻断」的思维。
' OR 1=1 --)容易被规则挡;变种才是 WAF
的真正考验' Or 1=1 --'/**/OR/**/1=1' OR '1'='1、' OR 2>1nocase +
解码后再匹配 + 语义分析变种表 + 每条的命中/绕过结果 + 规则演进这就是「规则是活的」——攻击者一直在演化,WAF 规则集也要持续迭代。M7 复盘会回到这一点。
debug=True → Werkzeug 调试器 → 直接
RCE(pin 可爆破)Server: Werkzeug/x.y.z Python/3.x →
攻击者精准选 CVE| 项 | 加固动作 | 落实 M2 暴露面 |
|---|---|---|
| 关 debug | app.run(debug=False) /
FLASK_DEBUG=0 |
M2 指纹里的 Werkzeug 调试器 |
| 隐藏指纹 | 移除 / 改写 Server
头、统一错误页 |
M2 -sV 探到的版本号 |
自检:
git grep -nE 'debug\s*=\s*False|FLASK_DEBUG' milestone/m4 -- '*.py'——debug=False是量规「安全严谨」的硬门槛。
| 项 | 加固动作 | 落实 M2 暴露面 |
|---|---|---|
| 最小权限 | 非 root 用户运行;容器
--read-only |
减少提权后的爆炸半径 |
| 容器 / SSH | 最小镜像、SSH 禁 root + 密钥登录 | 收敛管理面 |
系统化加固清单(主机加固、服务最小化、SELinux/AppArmor、日志审计)见
chap0x10.md「运行环境加固」一章;本课件只讲「做 M4 所需」最小集。
debug=True 开启 Werkzeug
调试器:网页上直接看到堆栈、交互式 Python
控制台debug=True 暴露在生产 =
裸奔,比绝大多数应用漏洞都严重M3 你大概率就是靠
debug=True的控制台拿到的 RCE——M4 第一步就是把它关掉,断了攻击者最舒服的路。
| 工具 | 层次 | 典型规则形态 | M4 对应任务 |
|---|---|---|---|
| iptables / nftables | 网络边界 | -A INPUT -p tcp --dport X -j ACCEPT |
A 暴露面收敛 |
| Suricata / Snort | 流量检测 | alert http ... (content:...; sid:...) |
B 规则 + 度量 |
| ModSecurity + CRS | 应用层 | SecRule ARGS "@rx ..." "id:...,deny" |
C 拦截变种 |
docs/m4/ids.rules、docs/m4/waf/)docs/m4/
├── ids.rules / suricata.yaml # 任务 B:规则 + 命中/误报度量(数字)
├── waf/ 或 modsec/ # 任务 C:拦截变种 + 绕过↔反绕过一轮
├── iptables.rules # 任务 A:暴露面收敛(对照 M2 清单)
└── report.md # 规则集 + 加固 diff + 度量数字 + 自评
milestone/m3 切
milestone/m4,MR 目标 = milestone/m3(见 Git 指南)详见
../labs/lab04-defense.md。完成后在report.md自评点亮 簇④·L2。
| 簇 × 级 | 能力描述 | 自评勾选 |
|---|---|---|
| ④·L2 | 配置防火墙 / WAF / IDS 规则 + 运行环境加固 + 命中 / 误报度量 | ☐ M4 规则集 + 度量交付 |
| ④·L3(延伸) | 规则集工程化(CI 回归 + 持续调优) | ☐ 进阶方向 |
下一单元 U5(M5 日志取证蜜罐):把 IDS/WAF 的告警接入集中日志,复盘一次针对己方的攻击——告警 → 日志 → 取证 → 蜜罐,闭环。经典理论:
chap0x08.md/chap0x09.md/chap0x10.md;实验指南见../labs/lab04-defense.md。