第四单元:加固与边界防护

【道】纵深 · 【术】防火墙/IDS/WAF · 【器】规则集 · 【造器】M4

黄玮

2026-秋

主题 0:攻过了,然后呢?

问题引入:如何用防火墙 + IDS + WAF 联防?

M3 你已攻破了自己的靶场——明文凭证、SQL 注入、XSS、上传马都复现了。M4:给这个千疮百孔的应用套上纵深防御,并量化你挡住了多少、放过了多少。

  • 攻防不对称:攻击者只需找到一个口子;防御者要守住所有口子 → 单点防御必败
  • 纵深(Defense in Depth):网络边界(防火墙)+ 流量检测(IDS)+ 应用层(WAF)+ 运行环境(加固)层层兜底
  • 本单元 = 把 M2 暴露面清单的处置建议落地成规则,并度量命中 / 误报

本单元地图(≤2 学时):加固与边界防护

  1. 【道】纵深防御 / 最小暴露 / 规则 vs 误报权衡(核心思维)
  2. 【术】防火墙:iptables / nftables 收敛暴露面(默认拒绝)
  3. 【术】IDS:Snort / Suricata 规则 + 命中 / 误报度量(重放 M3 概念验证(PoC))
  4. 【术】WAF:ModSecurity + OWASP CRS 拦截 M3 攻击载荷(payload)变种(绕过 ↔︎ 反绕过)

本单元地图(续):运行环境与落地

  1. 【术】运行环境加固:debug=False、隐藏指纹、最小权限
  2. 【器】ModSecurity / Suricata / iptables(用器 → 造器)
  3. 【造器】衔接实验 M4:规则集 + 命中 / 误报度量报告

本单元定位(U4)

维度 内容
真实问题 如何用防火墙 + IDS + WAF 联防?
实验(= 综合实践项目(capstone) M4 加固与边界防护(规则集 + 度量)
讲授 ≤2 学时:道 / 术 / 器 / 造器
来源 第 8 章(防火墙)/ 第 9 章(IDS/IPS)/ 第 10 章(运行环境加固,并入实践)
能力点亮 簇 ④·L2 防御与加固

M4 权重 12%;其中「深度 0.30」要求规则集有命中 / 误报度量数字——规则 vs 误报的权衡是本里程碑的核心思维

能力框架对应

  • 簇 ④「防御与加固」· L2(本单元主点亮)
  • L2:配置防火墙 / WAF / IDS 规则 + 运行环境加固 + 命中 / 误报度量(M4
  • L3(延伸):把规则集接进 CI、随部署变更持续调优(M7 复盘 / 进阶方向)

【道】纵深防御与规则权衡

第一原则:纵深防御(Defense in Depth)

  • 假设任何单层都会被突破 → 用多层异构防御叠加
  • 经典四层(由外向内):
    • 网络边界:防火墙——只放行必要端口(最小暴露)
    • 流量检测:IDS/IPS——发现可疑流量并告警 / 阻断
    • 应用层:WAF——拦 SQLi / XSS / 上传等应用攻击
    • 运行环境:加固——关 debug、隐藏指纹、最小权限
  • 每一层都假设前一层已失守;纵深让攻击者每过一层都要付出成本

第二原则:最小暴露(Minimum Exposure)

  • 不开的口,绝不暴露——默认拒绝(default deny),只白名单放行必要端口
  • 落实 M2 暴露面清单里的处置建议:
    • 该关的端口关了吗?(如 5000 只对内 / 仅本机)
    • 管理端口(SSH、DB)是否暴露到公网?
    • 指纹信息是否过度暴露?(Server / Werkzeug 版本号)
  • 暴露面收敛 ≠ 加功能,而是减攻击面——这是 M4 任务 A 的本质

第三原则:规则 vs 误报的权衡(核心思维)

一条规则写得太宽 → 误报(FP)炸了,正常请求被拦,业务受损;写得太窄 → 漏报(FN),攻击溜过去,形同虚设。好的防御工程师不是写得出规则,而是能量化这条权衡曲线。

  • TP(真阳)/ FP(假阳)/ FN(假阴)/ TN(真阴)——规则质量的四象限
  • 派生指标:precision(拦下来的里有多少是真攻击)、recall(真攻击里拦下了多少)
  • M4 任务 B 的核心交付:用 M3 概念验证(PoC)重放 + 正常流量,给出 TP/FP/precision/recall 数字

为什么「度量」比「写规则」更难

  • 写一条命中 ' OR 1=1 -- 的规则 = 5 分钟;证明它在真实流量下不误报、不漏报 = 5 天
  • 度量需要有标签的测试集
    • 正样本:M3 的 PoC 流量(SQLi / XSS / 上传)+ 变种(编码、大小写、注释混淆)
    • 负样本:正常登录 / 查询 / 评论流量(含带特殊字符的合法输入)
  • 规则集的价值不在「挡住了 PoC」,而在「在变种和正常流量之间的边界划得有多准

这就是为什么 M4 量规里「深度 0.30」单独考核「规则严格度 vs 误报的权衡」——它区分了「贴规则」与「会守」。

攻防不对称 → 纵深 + 度量

  • 攻防不对称:攻击者一次成功就赢;防御者必须次次成功
  • 应对:纵深(提高攻击成本)+ 度量(知道自己的盲区在哪)
  • 没有度量的防御 = 信仰:你以为挡住了,其实规则根本没命中变种,或正常流量天天被拦你没看见

M4 的思维升级:从 M3 的「能不能攻破」到 M4 的「我的防御覆盖率是多少、误报率是多少」——这是从攻击者思维到防御者思维的转折点。

【术】防火墙:收敛暴露面

防火墙:网络边界的第一道闸

  • 包过滤(Packet Filtering):按五元组(src/dst IP、src/dst port、协议)逐包放行 / 丢弃
  • 状态检测(Stateful):跟踪连接状态(NEW / ESTABLISHED / RELATED),只放行属于已建立连接的回包
  • 默认拒绝(default deny):最后一条 DROP 所有未显式放行的流量——最小暴露原则的直接实现

iptables:链与表的最小心智模型

  • 表(table)filter(过滤,最常用)/ nat(地址转换)/ mangle(改包)
  • 链(chain)INPUT(入站)/ OUTPUT(出站)/ FORWARD(转发)
  • 规则顺序:自上而下匹配,命中即停——顺序至关重要
  • 动作ACCEPT / DROP(静默丢弃)/ REJECT(拒绝并回包)

默认策略 DROP + 白名单放行 = 收敛暴露面的标准范式。深度理论见 chap0x08.md「防火墙」一章。

iptables 实战:收敛 Flask 靶场暴露面

# 默认拒绝所有入站,允许所有出站
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 的现代继任者

  • nftablesiptables 的统一替代(统一了 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:规则 + 命中/误报度量

IDS vs IPS:告警还是阻断

IDS(入侵检测) IPS(入侵防御)
部署 旁路(镜像流量) 串接(在线)
动作 检测到 → 告警 检测到 → 阻断
风险 漏报无害(只漏告警) 误报会中断业务
课程定位 M4 主线(先看清楚) 进阶(基于 IDS 度量后上 IPS)
  • M4 先做 IDS(旁路 + 度量),把命中 / 误报测准了,再考虑是否升级为 IPS
  • 没度量就上 IPS = 拿业务当小白鼠——这也是「度量优先」思维的体现

检测范式:签名 vs 异常

  • 签名检测(Signature-based):用规则匹配已知攻击模式(如 ' OR 1=1
    • 优点:低误报、可解释、规则可审计
    • 缺点:只能挡已知,变种 / 0-day 漏报
  • 异常检测(Anomaly-based):建立「正常」基线,偏离即告警
    • 优点:可能挡未知
    • 缺点:高误报、难解释、需持续调参

埋伏(M6):异常检测正是 AI / ML 的用武之地——M4 任务 E 用 IsolationForest 给请求 / 日志打异常分,与规则版对比,为 M6「AI 检测组件」铺路。规则 → AI 增强 = 课程螺旋。

Snort / Suricata:开源 IDS 双雄

  • Snort:经典老牌,规则语法事实标准,社区规则库庞大
  • Suricata:现代多线程实现,兼容 Snort 规则语法,支持协议解析 + 文件提取
  • 国产优先视角:两者均为开源、可离线部署;规则可自研,不依赖国外云服务
  • 课程推荐 Suricata(多线程、协议解析更强),规则语法与 Snort 互通

深度理论(IDS/IPS 部署模式、规则语法全集、误报治理)见 https://github.com/c4pr1c3/cuc-ns-ppt/blob/master/chap0x09.md「入侵检测系统」一章。

Suricata 规则语法速览

# 规则 = 动作 协议 源 源端口 -> 目的 目的端口 (选项)
# 经典 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(放行,做白名单)
  • content + nocase:大小写不敏感匹配(变种防御基础)
  • sid:规则唯一 ID(自研规则用 1000000+ 段,避开官方保留段)

命中 / 误报度量:四象限

规则判定:攻击 规则判定:正常
真实:攻击 TP(命中) FN(漏报)
真实:正常 FP(误报) TN(真阴)
  • TP(真阳)/ FP(假阳)/ FN(假阴)/ TN(真阴)——规则质量的四象限
  • 有了这四个数,就能派生出可比较的度量指标(下页)

派生指标:precision / recall / FPR

  • precision = TP / (TP + FP):拦下来的里,有多少是真攻击(越高越不误报)
  • recall = TP / (TP + FN):真攻击里,拦下了多少(越高越不漏报)
  • FPR = FP / (FP + TN):正常流量里,误拦了多少(业务影响指标)

规则调优的本质:在 precision 和 recall 之间找业务可接受的平衡点——M4「深度 0.30」考核的核心。

度量实战:用 M3 PoC 重放

# 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 报告里要的数字。光贴规则无度量 = 深度不合格。

【术】WAF:拦截攻击载荷变种

WAF:应用层的专门防御

  • WAF(Web Application Firewall):工作在 HTTP/HTTPS 应用层,理解请求语义(URL / Header / Body / Cookie)
  • 与网络防火墙的区别:懂应用协议,能识别 SQLi / XSS / 命令注入 / 路径穿越等应用攻击
  • 核心价值:补网络防火墙看不懂应用语义的缺口(如端口 80/443 是必须开的,但里面的内容要 WAF 审)

ModSecurity + OWASP CRS

  • ModSecurity:经典开源 WAF 模块(Apache / Nginx),规则引擎成熟
  • OWASP CRS(Core Rule Set):社区维护的通用规则集,覆盖 OWASP Top 10
  • 工作模式:
    • DetectionOnly(只记录,不拦)——调优期首选,先看误报再决定
    • On(阻断)——调优完成后上线

最佳实践:先 DetectionOnly 跑一周看日志,把误报白名单化,再切阻断——这又是「度量优先于阻断」的思维。

拦截变种:绕过 ↔︎ 反绕过的一轮博弈

  • M3 的原始 PoC(如 ' OR 1=1 --)容易被规则挡;变种才是 WAF 的真正考验
  • 常见绕过手法:
    • 大小写混淆:' Or 1=1 --
    • 注释混淆:'/**/OR/**/1=1
    • 编码绕过:URL 编码、Unicode、Hex
    • 等价变形:' OR '1'='1' OR 2>1
  • 反绕过:CRS 的正则泛化 + nocase + 解码后再匹配 + 语义分析

绕过 ↔︎ 反绕过:实验记录

  • 任务 C 要求记录一轮博弈(不是只挡原 PoC):
    1. 写规则挡住 M3 原 PoC → 命中
    2. 构造变种(大小写 / 编码 / 注释)→ 观察是否绕过
    3. 加固规则(解码 + 泛化)→ 再测变种是否被挡
    4. 再构造更狡猾的变种 → ……(一轮即可,重点是博弈意识
  • 输出:变种表 + 每条的命中/绕过结果 + 规则演进

这就是「规则是活的」——攻击者一直在演化,WAF 规则集也要持续迭代。M7 复盘会回到这一点。

【术】运行环境加固

应用 / 运行环境加固(第 10 章 并入实践)

  • M3 能攻破,往往不只是应用代码漏洞,运行环境裸奔也是帮凶:
    • Flask debug=True → Werkzeug 调试器 → 直接 RCE(pin 可爆破)
    • 响应头暴露 Server: Werkzeug/x.y.z Python/3.x → 攻击者精准选 CVE
    • 进程以 root 跑 → 提权即全盘沦陷
  • 加固 = 消除这些「非应用代码、但放大危害」的环境因素

加固清单(1/2):关 debug · 隐藏指纹

加固动作 落实 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 是量规「安全严谨」的硬门槛

加固清单(2/2):最小权限 · 容器 / SSH

加固动作 落实 M2 暴露面
最小权限 非 root 用户运行;容器 --read-only 减少提权后的爆炸半径
容器 / SSH 最小镜像、SSH 禁 root + 密钥登录 收敛管理面

系统化加固清单(主机加固、服务最小化、SELinux/AppArmor、日志审计)见 chap0x10.md「运行环境加固」一章;本课件只讲「做 M4 所需」最小集。

debug=True 的真实危害(直觉版)

  • Flask/Werkzeug debug=True 开启 Werkzeug 调试器:网页上直接看到堆栈、交互式 Python 控制台
  • 攻击者触发一个异常 → 拿到控制台 → 任意代码执行(无需任何应用漏洞)
  • Werkzeug 调试器有个 PIN(基于机器特征算出),可被离线爆破
  • 结论: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 拦截变种
  • 用器:会用这三个工具写规则、看日志(L1/L2)
  • 造器:把规则集工程化——版本管理、CI 里跑命中 / 误报回归、随部署变更持续调优(L3 延伸)

【造器】规则集的工程化

  • 规则不是一次写好的,是随攻击演化持续迭代的资产
  • 工程化要点:
    • 版本管理:规则集进 Git(docs/m4/ids.rulesdocs/m4/waf/
    • 回归测试:M3 PoC + 变种 + 正常流量做成测试集,规则改动后 CI 自动跑命中 / 误报
    • 可追溯:每条规则标注「挡什么攻击、对应 M2 哪个暴露面、当前 precision/recall」
  • 这正是从簇 ④·L2(会用)走向 L3(能造、能守、能评)的分水岭

【造器】衔接实验 M4

docs/m4/
├── ids.rules / suricata.yaml   # 任务 B:规则 + 命中/误报度量(数字)
├── waf/ 或 modsec/             # 任务 C:拦截变种 + 绕过↔反绕过一轮
├── iptables.rules              # 任务 A:暴露面收敛(对照 M2 清单)
└── report.md                   # 规则集 + 加固 diff + 度量数字 + 自评
  • 分支:从 milestone/m3milestone/m4,MR 目标 = milestone/m3(见 Git 指南
  • 弹药:M3 的 PoC 流量 = IDS/WAF 要命中 / 度量的对象;AI 双向可用国产 LLM 辅助调优规则(注明范围 + 人工复核)

详见 ../labs/lab04-defense.md。完成后在 report.md 自评点亮 簇④·L2

主题 9:收尾

能力自评:本单元点亮簇 ④

簇 × 级 能力描述 自评勾选
④·L2 配置防火墙 / WAF / IDS 规则 + 运行环境加固 + 命中 / 误报度量 ☐ M4 规则集 + 度量交付
④·L3(延伸) 规则集工程化(CI 回归 + 持续调优) ☐ 进阶方向
  • 核心思维:纵深防御 + 最小暴露 + 规则 vs 误报的权衡(度量优先)
  • 从 M3 到 M4 的转变:从「能不能攻破」到「防御覆盖率 / 误报率是多少

⚠️ 红线:防御实验在自己靶场

  • 所有防火墙 / IDS / WAF 实验仅在自己的靶场、127.0.0.1 或明确授权的环境
  • 即便是防御性工具,对他人系统未授权部署检测 / 拦截也可能构成干扰
  • 本单元非纯攻击侧(M3 已过),重点是把 M2/M3 的发现收敛成规则——但红线依旧:只守自己的东西

小结:今天带走的三件事

  1. :纵深防御(层层兜底)+ 最小暴露(默认拒绝)+ 规则 vs 误报的权衡(度量优先)
  2. 术 / 器:iptables 收敛暴露面 · Suricata 规则 + 度量 · ModSecurity 拦变种 · 加固(关 debug)
  3. 造器:规则集工程化(版本管理 + CI 回归 + 持续调优),从 L2 走向 L3

下一单元 U5(M5 日志取证蜜罐):把 IDS/WAF 的告警接入集中日志,复盘一次针对己方的攻击——告警 → 日志 → 取证 → 蜜罐,闭环。经典理论:chap0x08.md / chap0x09.md / chap0x10.md;实验指南见 ../labs/lab04-defense.md