必须使用 v1.10.0+ ingress-nginx 镜像启用 modsecurity,通过 configmap 开启全局 waf 并配置注解控制 detectiononly 或拦截模式,结合日志与 metrics 验证防护生效。

在 Kubernetes 集群中,通过 Ingress-nginx 启用 WAF 防护插件来拦截 SQL 注入、XSS、路径遍历等恶意请求,是保障应用入口安全的刚需操作——它不依赖修改业务代码,也不需要额外部署 sidecar,只要正确启用 ModSecurity 模块并加载 OWASP CRS 规则集,就能让所有经由 Ingress 流入的 HTTP 请求自动接受语义级检测。
确认 Ingress-nginx 版本与 ModSecurity 支持状态
执行 kubectl get pods -n kube-system -l app.kubernetes.io/name=ingress-nginx 查看控制器 Pod 名称,再运行 kubectl exec -n kube-system <pod-name> -- nginx -V 2>&1 | grep -o modsecurity</pod-name>;若输出为空,说明当前镜像未编译 ModSecurity 模块,必须升级到 v1.10.0+ 官方镜像或使用 F5 提供的 nginx-ingress-controller:app-protect 变体镜像。
旧版(如 v1.8.x)即使开启注解也不会生效,【强制要求使用 v1.10.0 或更高版本】。
启用全局 ModSecurity 和 OWASP CRS
编辑 ingress-nginx 的 ConfigMap:
kubectl edit cm ingress-nginx-controller -n kube-system
在 data 下添加或修改以下三项:
enable-modsecurity: "true"enable-owasp-modsecurity-crs: "true"allow-snippet-annotations: "true"
保存退出后,Ingress Controller 会自动 reload 配置。此时所有新创建的 Ingress 资源默认继承该防护能力,但已有 Ingress 不会自动生效,需手动补加注解或重建。
为指定 Ingress 开启并微调 WAF 行为
方法一:基础启用(推荐首次上线)
在目标 Ingress 的 metadata.annotations 中加入:
nginx.ingress.kubernetes.io/enable-modsecurity: "true"
这一步会让 ModSecurity 进入 DetectionOnly 模式,只记录攻击日志不拦截请求,适合灰度观察误报率。
方法二:强制拦截模式(生产环境启用)
追加注解:
nginx.ingress.kubernetes.io/modsecurity-snippet: |<br> SecRuleEngine On<br> SecRequestBodyAccess On
⚠️ 注意:【SecRuleEngine On 必须显式声明,否则即使 enable-modsecurity=true,实际仍为 Off 状态】。该配置将触发真实拦截,返回 403 并写入审计日志。
验证拦截是否生效
第一步:确认日志输出路径
Ingress-nginx 默认将 ModSecurity 日志输出到容器 stdout,可通过 kubectl logs -n kube-system <ingress-pod></ingress-pod> 实时查看,搜索关键词 "XSS"、"SQLi"、"access denied"。
第二步:发起测试请求
执行 curl "https://your-domain.com/?q=%3Cscript%3Ealert(1)%3C/script%3E",预期响应状态码为 403,且日志中出现类似 Matched "Operator `Pm' with parameter... 的记录。
第三步:检查规则命中统计
进入 Pod 执行 curl localhost:10246/nginx_status(默认 metrics 端口),确认 modsec_requests_total 计数器已增长。











