haeretici/IbexaFirewallBundle

GitHub: haeretici/IbexaFirewallBundle

这是一个为 Ibexa CMS 构建的可配置 Web 应用防火墙包,用于防御 SQL 注入、XSS 和恶意流量等常见网络攻击。

Stars: 1 | Forks: 0

# Ibexa 的异端防火墙捆绑包 一个为 [Ibexa CMS](https://ibexa.co/) (前身 eZ Platform) 设计的健壮、可配置的防火墙捆绑包,旨在防御机器人、DDoS 攻击和恶意流量。它结合了机器人验证 (通过 DNS 检查已知爬虫)、速率限制以及客户端 JavaScript 工作量证明 (PoW) 质询系统,确保只有合法的浏览器才能继续访问。 此捆绑包轻量级、使用 Redis 进行缓存,并与 Ibexa 的管理 UI 无缝集成,以便进行监控和配置。 ## 特性 | 特性 | 描述 | 是否可配置? | |---------------------------|------------------------------------------------------------------------------|--------------| | **机器人验证** | 使用正向/反向 DNS 检查验证流行机器人 (Googlebot, Twitterbot, Facebookbot, Bingbot, LinkedInBot)。虚假机器人将被全局封禁。 | 是 (针对每个机器人启用/禁用) | | **速率限制** | 滑动窗口速率限制,使用分桶计数器防止滥用。超出限制?IP 将被临时封禁。 | 是 (窗口大小、最大请求数、分桶数) | | **JS 质询 (PoW)** | 模糊化的 JavaScript 质询 (破坏的 Base64 反转 + 虚拟字符),具备反调试功能 (WebDriver、Canvas 指纹识别)。通过 localStorage/cookies 解决。 | 是 (TTL、密钥长度、虚拟字符比例) | | **管理仪表板** | 实时指标、请求日志、服务器状态 (CPU、内存、磁盘)。由 Doctrine 和 Redis 驱动。 | 不适用 | | **豁免规则** | 使用 fnmatch 模式跳过对静态资源 (例如 `/media/*`、CSS/JS 文件) 的质询。 | 是 | | **数据持久化** | 将请求和指标记录到数据库;定期清理任务。使用 Redis 进行快速检查。 | 不适用 | | **安全策略** | Ibexa 策略集成,用于管理访问控制。 | 不适用 | ## 要求 - Ibexa CMS ^4.0 (或兼容的 Symfony 6/7) - PHP ^8.1 - Redis (用于缓存和速率限制) - Doctrine DBAL (用于日志记录) - Node.js (可选,用于通过 `javascript-obfuscator` 进行 JS 模糊化) - Composer ## 安装 1. **通过 Composer 安装捆绑包**: ```bash composer require haeretici/firewall-bundle ``` 2. **启用捆绑包** (如果未自动注册): 更新 `composer.json` 的 "autoload" 部分为: ```json "autoload": { "psr-4": { "App\\": "src/", "": "bundles/" } }, ``` 创建 `./bundles` 目录。 将捆绑包文件夹复制到 `./bundles/Ne0Heretic/`。 将 `ne0heretic_firewall.yaml.sample` 复制到 `./config/routes/ne0heretic_firewall.yaml`。 然后更新 `./config/bundles.php`,在 `config/bundles.php` 中添加: ```php return [ // ... Ne0Heretic\FirewallBundle\Ne0HereticFirewallBundle::class => ['all' => true], ]; ``` 3. **安装依赖项**: - 确保 Redis 正在运行并在 `config/packages/cache.yaml` 中配置 (使用 `cache.app` 池)。 - 全局安装 JS 模糊器 (可选但推荐): ```bash yarn add javascript-obfuscator ``` - 安装其他 yarn 依赖项: ```bash yarn add chart.js ``` 4. **数据库设置**: 执行以下 SQL 创建所需表: ```sql CREATE TABLE http_request_logs ( id INT AUTO_INCREMENT PRIMARY KEY, ip VARCHAR(45) NOT NULL, path VARCHAR(255) NOT NULL, query TEXT, agent TEXT, firewallTime DECIMAL(10,6), responseTime DECIMAL(10,6), isBotAgent TINYINT(1) DEFAULT 0, isBannedBot TINYINT(1) DEFAULT 0, isChallenge TINYINT(1) DEFAULT 0, isRateLimited TINYINT(1) DEFAULT 0, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE server_metrics ( id INT AUTO_INCREMENT PRIMARY KEY, cpu DECIMAL(5,2), memory DECIMAL(5,2), redis_mem DECIMAL(5,2), apache2_mem DECIMAL(5,2), varnish_mem DECIMAL(5,2), mysql_mem DECIMAL(5,2), os_disk DECIMAL(5,2), data_disk DECIMAL(5,2), timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE firewall_config ( id INT PRIMARY KEY DEFAULT 1, config JSON NOT NULL ); ``` 插入默认配置行: ```sql INSERT INTO firewall_config (id, config) VALUES (1, '{}'); ``` 5. **配置策略**: 捆绑包通过 `PolicyProvider` 自动注册策略。授予管理员访问权限: - 在 Ibexa 管理后台:内容 > 角色 > [您的角色] > 策略 > 添加策略 > 模块:`ne0heretic_firewall`,功能:`admin`。 6. **设置数据持久化的 Cron 任务**: 添加到 crontab (每分钟运行一次): ``` * * * * * php bin/console ibexa:firewall:store ``` 7. **清除缓存并重启**: ```bash php bin/console cache:clear # 如果需要,重启 Web 服务器 (例如 Apache/Nginx) ``` 8. **访问仪表板**: 登录 Ibexa 管理后台 > 导航到 "内容" 菜单 > "防火墙" (左侧边栏)。 ## 配置 在 `config/packages/ne0heretic_firewall.yaml` 中发布并自定义配置: ``` ne0heretic_firewall: rate_limiting: window: 121 # Seconds max_requests: 30 bucket_size: 11 bucket_count: 11 ban_duration: 3600 # Seconds challenge: ttl: 300 # Challenge expiration verified_ttl: 1800 # Verified IP TTL secret_length: 16 # Bytes dummy_ratio: 0.2 # Dummy insertion rate dummy_char: '!' # Invalid Base64 char enabled_for_non_bots: true bots: google_enabled: true twitter_enabled: true facebook_enabled: true bing_enabled: true linkedin_enabled: true exemptions: paths: - '/media/*' - '/assets/*' - '*.css' - '*.js' - '*.png' - '*.jpg' enable_rate_limiting: true ``` 针对环境的覆盖配置:`config/packages/prod/ne0heretic_firewall.yaml`。 **设置界面**:使用管理后台的 "防火墙 > 设置" 页面调整运行时选项 (这些选项会持久化到数据库)。 ## 使用 - **监控**:仪表板显示实时统计、最近请求和图表 (通过 AJAX 指标端点)。 - **自定义**:扩展 `KernelListener` 以添加自定义机器人模式或质询逻辑。 - **Cron 维护**:`ibexa:firewall:store` 命令将 Redis 日志刷新到数据库,并修剪旧数据 (请求数据保留 7 天,指标数据保留 90 天)。 ## 截图 ![仪表板概述](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8ea76ba95d153119.png) *防火墙仪表板:指标与最近请求* ![设置表单](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/cf162e20f3153120.png) *管理员设置:配置速率限制与质询* ![质询运行中](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/9c3fb6eeb2153121.png) *客户端 JS 质询界面* ## 贡献 1. Fork 仓库。 2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)。 3. 提交更改 (`git commit -m '添加某个 AmazingFeature'`)。 4. 推送到分支 (`git push origin feature/AmazingFeature`)。 5. 开启 Pull Request。 ## 许可证 MIT 许可证。详情请见 [LICENSE](LICENSE)。 ## 支持 - 问题:[GitHub Issues](https://github.com/haeretici/IbexaFirewallBundle/issues) - 文档:内联代码注释。 - Twitter:[Thiago Campos Viana (@haeretici)](https://twitter.com/haeretici) 获取更新。 为 Ibexa 社区用心构建 ❤️。欢迎贡献!
标签:CSRF防护, Doctrine, ffuf, Ibexa CMS, JavaScript挑战, MITM代理, OpenVAS, PHP, Proof-of-Work, Redis, SQL注入防护, Symfony, TypeScript, WAF, Web安全, XSS防护, 内容管理系统安全, 安全插件, 应用防火墙, 搜索引擎查询, 数字体验平台, 机器人验证, 管理仪表板, 网络安全, 蓝队分析, 隐私保护