必须先启用ModSecurity引擎(nginx.ingress.kubernetes.io/enable-modsecurity="true"),否则OWASP规则等所有WAF注解均无效;CRS规则仅在enable-owasp-core-rules="true"且容器内存在可读/etc/nginx/owasp-modsecurity-crs/目录时生效。

能直接配,但必须确认 Ingress Controller 已启用 ModSecurity 且加载了 OWASP CRS 规则集,否则所有 WAF 注解都无效。
nginx.ingress.kubernetes.io/enable-modsecurity 必须设为 "true"
这是整个 WAF 防御链的开关。仅设置 enable-owasp-core-rules 不起作用 —— ModSecurity 引擎本身没启动,规则根本不会加载。
- 值必须是字符串
"true"(带引号),不是布尔值true或数字1 - 该注解只对当前
Ingress资源生效,不继承全局配置 - 如果集群中多个 Ingress Controller 共存,需确保目标控制器启用了 ModSecurity 编译选项(如
--enable-dynamic-modules+modsecurity.so)
nginx.ingress.kubernetes.io/modsecurity-snippet 用于精细规则干预
当你发现默认规则误杀业务请求(比如 POST 表单含 select 字段被拦截),需要用它临时绕过或调整规则行为。
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- 避免直接用
SecRuleRemoveById粗暴关闭高危 ID(如942100SQLi 核心规则),优先用SecRuleUpdateTargetById排除特定参数 - 示例中
SecRule ARGS "@contains select"是自定义规则,ID 必须唯一且大于 1000,否则会被 CRS 覆盖 - 注意缩进:YAML 中
modsecurity-snippet值用|定义多行时,每行开头不能有空格,否则 Nginx 解析失败
nginx.ingress.kubernetes.io/enable-owasp-core-rules 控制规则集启用状态
设为 "true" 才会加载完整的 OWASP ModSecurity Core Rule Set(CRS),包括 SQLi、XSS、RCE 等检测逻辑。
- 设为
"false"时,即使enable-modsecurity为 true,也只运行空规则集 —— 相当于开着引擎但没装弹药 - CRS 版本取决于 ingress-nginx 镜像内置版本(v1.10+ 默认 CRS v3.3+),无法通过注解指定 CRS 版本号
- 生产环境首次启用建议先设为
"false",配合modsecurity-snippet加一条SecRuleEngine DetectionOnly,观察日志再切到On
modsecurity-transaction-id 注解影响日志追踪粒度
默认事务 ID 是随机字符串,设为 $request_id 后,WAF 日志、Nginx access log、后端应用日志就能用同一 ID 关联完整请求链路。
- 必须搭配
log-format-upstreamConfigMap 配置使用,确保$request_id被写入 access log - 若未启用
modsecurity,该注解完全无效果 - 注意:
$request_id在 Nginx 中是内置变量,不能写成"$request_id"(加引号会当字面量处理)
真正容易被忽略的是规则生效前提:Ingress Controller Pod 的容器内必须存在 /etc/nginx/owasp-modsecurity-crs/ 目录且规则文件可读,否则即使所有注解都正确,error.log 里会出现 Failed to load rules file —— 这个路径和权限问题,比注解写错更难排查。

















