首页/安全/安全设备配置速查/ModSecurity SecRule 语法
WAF 防护73 条

ModSecurity SecRule 语法

SecRule 由「变量 + 运算符 + 动作」组成,动作里指定规则 ID、阶段与处置方式,是自定义防护的基础。

安全设备配置速查安全更新于 2026-10-13

ModSecurity SecRule 是什么

SecRule 是 ModSecurity 自定义防护规则的基本单位,结构固定为「变量 + 运算符 + 动作」三段:变量指明检测哪部分数据,运算符描述匹配方式(正则、包含、长度等),动作定义规则标识、执行阶段与处置方式。理解这三段之后,读 OWASP CRS 官方规则与排错都会容易很多。写自定义规则最容易出问题的地方是规则标识冲突与阶段选错,前者让升级后规则被覆盖,后者让规则根本不执行。

基本信息

结构SecRule VARIABLES OPERATOR ACTIONS
常用变量ARGS、ARGS_NAMES、REQUEST_URI、REQUEST_HEADERS、REQUEST_METHOD
常用运算符@rx 正则、@contains 包含、@streq 相等、@pm 多模式匹配
执行阶段phase:1 请求头、phase:2 请求体、phase:3 响应头、phase:4 响应体、phase:5 日志
常用动作id、phase、deny、pass、status、log、msg、severity、tag

典型使用场景

  • 补充业务专有防护:官方规则未覆盖的自研接口参数校验
  • 拦截特定攻击特征:如某类扫描器的固定请求头
  • 误报调优:用更精确的规则替换被关闭的官方规则
  • 临时封堵:某接口存在已披露漏洞且无法立即修补时先拦特征
  • 验证检测效果:写一条告警规则配合日志,观察是否按预期命中
  • 规则版本管理:自定义规则独立文件存放,便于随版本升级迁移

规则结构示意

规则结构示意
# 结构:SecRule 变量 运算符 "动作列表"
# 示例为教学结构,检测模式需按实际业务填写
SecRule REQUEST_HEADERS:User-Agent "@contains <可疑标识>" \
    "id:100001,phase:1,deny,status:403,log,msg:'可疑客户端标识'"

# 说明:id 需在自定义区间内唯一,避免与官方规则冲突
# phase:1 在请求头阶段即可判定,比 phase:2 更早拦截
# 只用 deny 不做 log 时,排查问题时没有任何记录可查

动作与用途

动作作用注意点
id规则唯一标识使用项目或厂商分配区间,避免冲突
phase指定检测阶段响应体检测需在对应阶段声明并开启缓冲
deny / pass阻断或仅检测切换模式时应保留可回退的规则版本
log / msg记录日志与规则说明缺 msg 时日志难以理解
severity / tag分级与分类便于后续统计与告警归并
自定义规则尽量写独立文件并与官方规则集分开,升级官方规则时不会被覆盖,也便于按版本管理自己的规则。
正则在请求体上运行的性能开销明显高于请求头阶段,能用简单运算符(@contains、@streq)解决就不要用复杂正则。

易错点

  • 规则标识与官方规则冲突,升级后被覆盖或出现不可预期的动作
  • 阶段选择错误,规则永远不执行,且没有任何报错提示
  • 变量选择过宽(如全量 ARGS)导致误报与性能下降
  • 只写 deny 不写 log 与 msg,出问题无法回溯是哪条规则拦的
  • 自定义规则散落在官方规则文件中,升级一次全部丢失

数据来源与参考

  • ModSecurity 参考手册:SecRule 指令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌