myguard-labs/vimbadmin-crs-plugin
GitHub: myguard-labs/vimbadmin-crs-plugin
为 ViMbAdmin 邮件管理后台提供 OWASP CRS 误报排除与可选正向安全白名单的即插即用 ModSecurity/Coraza 插件。
Stars: 0 | Forks: 0
# ViMbAdmin OWASP CRS 插件
     
一个即插即用的 [OWASP CRS](https://coreruleset.org/) 插件,让 Core
Rule Set 能够与 **[ViMbAdmin](https://github.com/eilandert/ViMbAdmin)** 完美配合
—— 并且可以选择将管理面板锁定在严格的 allowlist 之内。
它主要做两件事:
1. **误报排除** (`vimbadmin-before.conf`) — 精确的、
host 作用域内的 `ctl:ruleRemoveTargetByTag` 排除项,以确保合法的输入
(带有符号的密码、CSRF token、逗号分隔的 alias `goto`
列表、自由文本描述、`10GB` 样式的配额)不会触发 CRS。
2. **正向安全 / allowlist** (`vimbadmin-after.conf`,**可选启用**) —
*允许 ViMbAdmin 实际使用的请求,阻止其他一切*。任何其**名称**不属于该应用实际使用的 request argument 都将被拒绝,任何超出 ViMbAdmin 实际 route map 范围的 path 也将被拒绝。这可以阻止 parameter smuggling、mass-assignment probing,以及无论 payload 如何,都能屏蔽常见的 `/.env` / `/wp-login.php` 扫描器噪音。
## 环境要求
- CRS 版本 4.0 或更新
- 兼容 ModSecurity 的 Web Application Firewall
## 安装
将这三个文件复制到你的 CRS `plugins/` 目录中:
```
plugins/vimbadmin-config.conf
plugins/vimbadmin-before.conf
plugins/vimbadmin-after.conf
```
CRS 会自动加载 `plugins/*-config.conf`,然后是 `*-before.conf`(在规则之前),
最后是 `*-after.conf`(在规则之后)。
## 配置
编辑 `vimbadmin-config.conf`:
| 变量 | 默认值 | 含义 |
|---|---|---|
| `tx.vimbadmin-plugin_enabled` | `0` | 主开关。**默认关闭** — 该插件会降低 CRS 在 ViMbAdmin 路由上的防御能力,因此必须按 vhost 启用,而不是全局启用。仅在 ViMbAdmin 的 server/location 块中将其设置为 `1`(参见部署上线)。 |
| `tx.vimbadmin-plugin_positive_security` | `0` | 在测试通过后,将 allowlist 层开启 (`1`)。 |
作用域完全由按 vhost 启用的标志控制 — **没有 Host gate**。仅在提供 ViMbAdmin 服务的地方启用该插件,例如(Angie /
NGINX/Angie + libmodsecurity3):
```
location /vimbadmin/ {
modsecurity on;
modsecurity_rules '
SecAction "id:9529001,phase:1,nolog,pass,setvar:tx.vimbadmin-plugin_enabled=1"
';
# ...
}
```
在 Apache/mod_security2 上,在匹配的
`` / `` 块中设置相同的变量。
## 部署上线
1. 安装后,仅在 ViMbAdmin 的 vhost/location 中启用该插件
(`setvar:tx.vimbadmin-plugin_enabled=1`)。这些排除项是安全的,
并且绝不会影响同一 CRS 引擎上的其他 vhost。
2. 以 **DetectionOnly** 模式运行 CRS,并设置 `tx.vimbadmin-plugin_positive_security=1`,
然后观察审计日志中 `9529220` / `9529230` 的命中情况 — 这些是
allowlist 中缺失的 arguments 或 paths。将你通过自定义插件添加的所有合法项,
添加到 `vimbadmin-after.conf` 中规则
`9529220` 的内联 allowlist 正则表达式中。
3. 将 CRS 切回阻断模式。
Rule ID 范围:**9,529,000 – 9,529,999**(基础块 9,529,000;在
[CRS 插件注册表](https://github.com/coreruleset/plugin-registry)中可用,
等待正式分配)。
## 持续集成
每次 push/PR 都会运行六个 GitHub Actions 工作流(每个工作流在上面都有自己的徽章):
| 工作流 | 功能说明 |
|---|---|
| **Lint** | 本地 rule-ID-range (9529000–9529999) / duplicate-ID / `@pmFromFile` / test-reference 检查,然后是官方的 `coreruleset/crs-plugin-test-action` lint。 |
| **Integration Tests** | 插件结构检查(无 host gate — 作用域由按 vhost 启用的标志控制、可选 allowlist、条件配置默认值、每条规则上的 `ver:`)。 |
| **Apache/v2** | 构建共享的 CRS+插件镜像,并在真实的 Apache httpd + mod_security2 上运行通用的 go-ftw 回归测试 + 安全测试套件(`apache2ctl -t` 检查解析)。 |
| **NGINX/v3** | 在 Angie + libmodsecurity3 3.0.14 上使用相同的共享镜像和相同的套件 — 这是一个生产环境的镜像(`angie -t` 检查解析)。 |
| **NGINX/Coraza** | 在 nginx + `libnginx-mod-http-coraza` / `libcoraza1` 上使用相同的共享镜像和相同的套件(`nginx -t` 检查解析)。 |
| **Security Corpus** | 在 Apache + mod_security2 上运行 [`tests/security/`](tests/security/) 下的对抗性规避和正向安全 payloads,作为一个专注的、确定性的绕过/过度阻断检查关卡。 |
三引擎测试框架位于 [`tests/integration/`](tests/integration/) 下;
所有引擎工作流都在
[`tests/regression/`](tests/regression/) 和 [`tests/security/`](tests/security/) 下运行 go-ftw 测试用例。
## 禁用插件
取消注释 `plugins/vimbadmin-config.conf` 中的规则 `9529010`,或者直接将
插件文件从 `plugins/` 目录中完全删除。
## 报告误报
提交一个新的 issue 或 pull request。对于 issue,请包含:
- CRS 版本
- ModSecurity/Coraza 版本
- modsec 审计日志
- 导致误报的原因
## 另请参阅
- ViMbAdmin fork:
- 加固版的 FPM pool、Angie vhost 以及 Snuffleupagus ruleset 位于该
仓库的 `contrib/` 目录下。
标签:AppImage, ModSecurity, OWASP CRS, WAF规则, Web应用防火墙, 安全防护, 白名单