防御技术与工具
防火墙、IDS/IPS、SIEM、EDR。
纵深防御:WAF、IDS 与接口防刷
这一课你将能做到
- 给 Spring Boot 平台的登录与核心接口加上多层限流(Nginx + 应用内 Bucket4j)
- 部署 ModSecurity + OWASP CRS 感受 WAF 的拦截与绕过博弈
- 用 Suricata 在自建靶场检测一次端口扫描,理解 IDS 的规则机制
为什么要学
代码修复是根本,但线上环境永远有改不完的旧代码和躲不开的 0day。WAF、IDS、限流是挡在业务前面的缓冲层:限流保证「被刷不死」,WAF 拦截「已知攻击模式」,IDS 负责「发现有人在踩点」。三者加上代码修复,才构成纵深防御。
本站平台的真实场景:登录接口被脚本撞库、详情页被爬虫打挂、注册接口被批量薅羊毛——第一响应手段全是限流,而不是等代码排期。
先建立图像
攻击流量 ▼
┌────────────────────────────────────────────┐
│ CDN/高防:吸收大流量 DDoS │ ← 流量层
│ WAF(Nginx+ModSecurity/云WAF):拦注入、扫描器 │ ← 应用层规则
│ 网关限流:按 IP/用户/接口 限速 │ ← 行为控制
│ IDS(Suricata):旁路检测,告警不拦截 │ ← 感知层
│ Spring Boot:业务校验 + 应用内限流兜底 │ ← 最后一道
└────────────────────────────────────────────┘
日志 ↑ 每一层都输出,SIEM 汇聚分析
跟着做
步骤 1:Nginx 层限流(连接数 + 请求速率)
# nginx.conf http 段
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m; # 每IP登录5次/分
limit_conn_zone $binary_remote_addr zone=conn:10m;
server {
location /api/auth/login {
limit_req zone=login burst=3 nodelay; # 突发只放3个
limit_conn conn 5;
proxy_pass http://127.0.0.1:8080;
}
}
# 压测验证(打本机)
ab -n 100 -c 10 http://localhost/api/auth/login
# 观察 503 响应比例
步骤 2:应用内限流(Bucket4j,按用户维度)
// Maven: com.bucket4j:bucket4j-core
Bucket bucket = Bucket.builder()
.addLimit(Bandwidth.classic(30, Refill.greedy(30, Duration.ofMinutes(1))))
.build();
@PostMapping("/api/comment")
public ResponseEntity<?> comment(@RequestBody CommentReq req, Authentication auth) {
if (!bucket.tryConsume(1)) { // 以 userId 维度建桶更准确
return ResponseEntity.status(429)
.header("Retry-After", "60").body("操作过于频繁");
}
return ResponseEntity.ok(service.save(req));
}
多实例部署把桶放进 Redis(Bucket4j-Redis),全局一致计数。
步骤 3:WAF——ModSecurity + OWASP CRS
# Ubuntu 上给 Nginx 装 ModSecurity v3
sudo apt install libmodsecurity3 modsecurity-nginx
# 拉取 OWASP 核心规则集
git clone https://github.com/coreruleset/coreruleset.git /etc/nginx/crs
cp /etc/nginx/crs/crs-setup.conf.example /etc/nginx/crs/crs-setup.conf
# nginx.conf 加载规则后,发一个探测请求验证:
curl "http://localhost/?id=1%20UNION%20SELECT%201,2,3--"
# 期望返回 403,error.log 出现 [id "942100"] 拦截记录