Nginx 安全加固与轻量 WAF 实践:10 分钟提升一线防护

基础加固

  • 关闭版本泄露server_tokens off;
  • 最小暴露面:仅监听必要端口/域名,禁用默认站点。
  • TLS:启用 HTTPS,使用现代套件(ECDHE),强制 HSTS;使用 ACME 自动续期证书。
  • 请求体限制client_max_body_sizeclient_body_timeout 防大包慢传。

访问控制与限速

  • IP 级封禁/白名单:对管理路径或私有接口做 allow/deny
  • 限速
    1
    2
    3
    4
    5
    6
    limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
    server {
    location /api/ {
    limit_req zone=req burst=20 nodelay;
    }
    }
  • 连接数限制limit_conn_zone/limit_conn 防并发耗尽。

轻量 WAF 规则(示例)

  • 拦截常见探测:(?i)(select\\s+.*from|union\\s+select|/etc/passwd|\\.\\./)
  • 阻断恶意 UA/扫描器:匹配常见扫描 UA 直接 403。
  • 对管理路径加基本认证或 IP 白名单。
  • 建议用 ngx_http_lua_moduleModSecurity(OWASP CRS) 做可维护规则集。

防暴破与登录保护

  • 登录接口加 limit_req + 图形/短信验证码。
  • 加强 Cookie/Session:HttpOnlySecureSameSite
  • 记录失败次数,触发临时封禁。

日志与可观测性

  • 结构化日志:输出 JSON 便于集中收集与检索(EFK/Loki)。
  • 关键字段:客户端 IP、UA、Referer、请求体大小、上游状态、耗时。
  • 告警:对 4xx/5xx 激增、限速命中、WAF 拦截设阈值告警。

示例片段(精简)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server_tokens off;
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;

server {
listen 443 ssl http2;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
add_header Strict-Transport-Security "max-age=31536000" always;

location /admin/ {
allow 1.2.3.4;
deny all;
}

location /api/ {
limit_req zone=req burst=20 nodelay;
if ($request_uri ~* "(select\\s+.*from|union\\s+select|\\.\\./|/etc/passwd)") {
return 403;
}
}
}

运维建议

  • 定期更新 Nginx 与 OpenSSL,避免已知 CVE。
  • 回源鉴权:对后端启用 JWT/签名校验,Nginx 只做粗筛。
  • 压测规则:上线前用 ab/wrk/locust 验证限速与 WAF 不影响关键路径。
  • 旁路模式观察:复杂规则先旁路记录,再切换阻断。

结论

简单可落地的 Nginx 加固和轻量 WAF,可以显著降低暴露面、阻断通用漏洞与爆破。保持最小暴露、限速、基础规则、日志告警四件套,就能在 10 分钟内把防护水位拉高一截。***