7.5.7 WAF基础与常见攻击防护

WAF(Web应用防火墙)用于在应用层过滤恶意请求。常见形态有反向代理型、透明桥接型与主机内置型。与 Nginx 结合时可通过云 WAF 或本地模块化方案(如 ModSecurity+OWASP CRS)实现规则检测与拦截。核心要点:部署位置、拦截模式(仅告警/阻断)、日志链路、白名单与误报管理。

原理草图(Nginx+WAF 串联):

文章图片

一、安装与基础集成(ModSecurity + OWASP CRS)#

以 Ubuntu 为例(Nginx + libmodsecurity3 + ModSecurity-nginx + CRS):

# 1) 安装依赖与 Nginx(已安装可跳过)
sudo apt update
sudo apt install -y nginx git curl build-essential libpcre3 libpcre3-dev \
  libssl-dev zlib1g-dev libxml2 libxml2-dev libyajl-dev pkgconf

# 2) 安装 libmodsecurity3
git clone --depth=1 https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
git submodule init && git submodule update
./build.sh
./configure
make -j"$(nproc)"
sudo make install

# 3) 构建 ModSecurity-nginx 模块
cd /usr/local/src
git clone --depth=1 https://github.com/SpiderLabs/ModSecurity-nginx
# 确认 nginx 编译参数
nginx -V 2>&1 | grep configure
# 需要从源码编译 Nginx 或带上动态模块编译
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx
make modules
sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules/

# 4) 启用模块并加载规则
sudo tee /etc/nginx/modules-enabled/modsecurity.conf >/dev/null <<'EOF'
load_module modules/ngx_http_modsecurity_module.so;
EOF

# 5) 复制 ModSecurity 配置并启用
sudo mkdir -p /etc/modsecurity
sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/modsecurity/

# 6) 拉取 OWASP CRS
sudo git clone --depth=1 https://github.com/coreruleset/coreruleset /etc/modsecurity/crs
sudo cp /etc/modsecurity/crs/crs-setup.conf.example /etc/modsecurity/crs/crs-setup.conf

Nginx 站点中启用 WAF(阻断模式):

# /etc/nginx/nginx.conf
include /etc/nginx/modules-enabled/*.conf;

http {
  modsecurity on;
  modsecurity_rules_file /etc/modsecurity/main.conf;
  ...
}

# /etc/modsecurity/main.conf
Include /etc/modsecurity/modsecurity.conf
Include /etc/modsecurity/crs/crs-setup.conf
Include /etc/modsecurity/crs/rules/*.conf

# 关键:从检测模式切换到阻断
# /etc/modsecurity/modsecurity.conf 中
SecRuleEngine On

重载并验证:

sudo nginx -t
sudo systemctl reload nginx

验证拦截(SQL 注入示例):

curl -i "http://your.domain/?id=1%20or%201=1"
# 预期:HTTP/1.1 403 Forbidden 或 406,WAF 日志有拦截记录

二、常见攻击与防护示例(含命令说明)#

1) SQL 注入检测(WAF 默认规则命中)

curl -i "http://your.domain/search?q=1%27%20OR%20%271%27=%271"
# 命令说明:curl 发起带注入 payload 的请求,观察 403 与 WAF 日志

2) XSS 过滤(检测脚本注入)

curl -i "http://your.domain/?q=<script>alert(1)</script>"

3) CSRF 防护(Nginx 辅助限制 Referer/Origin)

# /etc/nginx/conf.d/csrf.conf
map $http_origin $csrf_allowed {
  default 0;
  "~^https://your\.domain$" 1;
}
server {
  location /api/ {
    if ($csrf_allowed = 0) { return 403; }
  }
}

4) 暴力破解与扫描(Nginx 侧限速)

# /etc/nginx/conf.d/limit.conf
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/s;
server {
  location /login {
    limit_req zone=login burst=10 nodelay;
  }
}

5) 文件上传安全(Nginx 限制 + 后端二次校验)

server {
  location /upload {
    client_max_body_size 5m;
    # 拒绝可执行脚本直传
    if ($request_uri ~* "\.(php|jsp|sh)$") { return 403; }
  }
}

三、日志与审计(关键文件与字段)#

ModSecurity 默认审计日志路径(配置项决定):

# /etc/modsecurity/modsecurity.conf
SecAuditEngine RelevantOnly
SecAuditLog /var/log/modsecurity/audit.log

查看最近拦截:

sudo tail -n 50 /var/log/modsecurity/audit.log
# 关注:id、msg、uri、severity、matched_data

四、与 Nginx 协同实践(分级策略示例)#

# /etc/nginx/conf.d/waf-policy.conf
server {
  location /api/pay {
    # 关键接口:严格规则
    modsecurity on;
  }
  location /static/ {
    # 静态资源可降低审计级别或关闭
    modsecurity off;
  }
}

五、排错与常见问题#

1) Nginx 启动失败:

sudo nginx -t
# 若提示 unknown directive "modsecurity",说明模块未正确加载

解决:确认 load_module 路径正确且模块与 Nginx 版本兼容。

2) 规则误报导致业务异常:
- 临时放行特定 URI 或参数

location /api/order {
  modsecurity_rules '
    SecRuleRemoveById 942100
  ';
}

3) WAF 日志无记录:
检查 SecAuditEngine 是否开启,路径是否可写:

sudo ls -l /var/log/modsecurity/
sudo journalctl -u nginx -n 50

六、练习与验证#

1) 练习 1:开启检测模式
- 将 SecRuleEngine DetectionOnly
- 访问注入 URL,观察只记录不阻断。
- 切换为 On 再对比。

2) 练习 2:自定义规则
创建规则文件并引入:

sudo tee /etc/modsecurity/custom.rules >/dev/null <<'EOF'
SecRule REQUEST_URI "@contains /admin" "id:10001,phase:2,deny,status:403,msg:'Block admin path'"
EOF

引入规则并验证:

# /etc/modsecurity/main.conf
Include /etc/modsecurity/custom.rules
sudo nginx -t && sudo systemctl reload nginx
curl -i http://your.domain/admin
# 预期:403

3) 练习 3:性能影响评估
使用压测对比开启/关闭 WAF 的吞吐:

ab -n 1000 -c 50 http://your.domain/
# 记录 Requests per second 与 95% latency

通过以上示例可完成 WAF 的安装、规则启用、攻击验证、日志审计与误报处理闭环。