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)解决就不要用复杂正则。