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 的安装、规则启用、攻击验证、日志审计与误报处理闭环。