sandroeric/shield-panel

GitHub: sandroeric/shield-panel

ShieldPanel 是一个 Docker 化的安全集成演示平台,用 PHP 面板配合 Go 后台 worker 对 Web 日志做实时启发式威胁分析,展示多服务异步安全管道的工程实现。

Stars: 0 | Forks: 0

ShieldPanel 是一个达到作品集级别的安全集成平台,旨在展示将基于 PHP 的主机面板(模拟 cPanel)与使用 Go 编写的可扩展后端安全服务相连接的能力。 它展示了异步日志解析、威胁检测启发式算法,以及通过 Docker 化的多服务拓扑实现的事件驱动自动化。 ## 架构概述 ``` graph TD Client[Browser / User] -->|HTTP:8089| Nginx[Nginx Reverse Proxy] Nginx -->|FastCGI| PHP[PHP cPanel Plugin] PHP -->|PDO| DB[(PostgreSQL)] PHP -->|AMQP| MQ[RabbitMQ Broker] MQ -->|Security Events & Jobs| Go[Go Security Worker] Go -->|Read/Write| DB %% Shared Volume Log Streams PHP -.->|Mock Attack Generator| Logs[(Apache Access/Error Logs)] Go -.->|Tail & Parse Log Entries| Logs ``` 系统由以下服务组成: 1. **Nginx Web 服务器 (`nginx`)**:作为反向代理暴露端口 `8089`,直接提供静态资源服务,并将 PHP 请求转发给 PHP-FPM 守护进程。 2. **PHP 控制层 (`php-app`)**:模拟 cPanel 插件环境。它负责处理数据库的 CRUD 操作,渲染毛玻璃效果的 Dashboard/Settings UI,并将任务分发给 RabbitMQ。 3. **RabbitMQ Broker (`rabbitmq`)**:管理 `shieldpanel.events` 主题交换机和 `security.jobs` 队列,负责路由如 `scan.requested`、`domain.created` 和 `protection.disabled` 等事件。 4. **Go 安全 Worker (`go-worker`)**:一个高性能、异步的后台 worker,负责消费 RabbitMQ 事件,从共享目录中解析原始的 Apache 访问/错误日志,运行启发式规则,并将分析结果持久化到数据库中。 5. **PostgreSQL 数据库 (`postgres`)**:存储已注册域名的持久化配置、已执行的扫描、事件日志以及结构化的安全分析结果。 6. **共享卷 (`./shared/logs`)**:在各个容器间绑定原始日志文件(`access.log`、`error.log`),以模拟服务器日志的生成与摄取。 ## 展示的技术特性 - **异步任务架构**:避免阻塞面板请求。扫描执行和域名事件会被 PHP 立即确认并排队发送到 RabbitMQ,随后交由 Go worker 消费。 - **弹性的启动循环**:在 PHP(PDO 助手)和 Go(amqp/sql 连接拨号器)端均实现了带有指数退避机制的稳健重试循环,以防止在 Compose 并行启动期间发生容器崩溃循环。 - **优雅关闭**:Go worker 会捕获终止信号(`SIGINT`、`SIGTERM`),取消消费上下文以拒绝新任务,排空正在进行的日志分析,并确保在不丢失消息的情况下干净地退出。 - **安全启发式算法 MVP**: - **爬虫流量**:匹配可疑的 user-agent 字符串(例如 `SemrushBot`、`AhrefsBot`),并对请求速率异常发出警报。 - **撞库攻击**:检测针对 `/wp-login.php` 的快速身份验证激增,并从 `error.log` 中解析来自同一 IP 的密码不匹配消息。 - **XMLRPC 滥用**:扫描发往 `xmlrpc.php` 的 POST 请求突发(常见的 WordPress DDoS 和 pingback 目标)。 - **API 爬取**:追踪激进的路径枚举模式和自动化抓取库(例如 `Python-urllib`、`Scrapy`)。 - **黑曜石毛玻璃 UI**:采用定制的 CSS 变量、悬停效果、用于威胁仪表盘的圆锥渐变,以及用于实时状态更新的 AJAX 轮询,打造出时尚的毛玻璃风格仪表盘。 ## 安装与入门 ### 前置条件 - Docker 和 Docker Compose(推荐 v2.x 版本) ### 步骤 1:克隆并设置日志权限 由于容器会绑定挂载 `./shared/logs/` 目录来写入模拟攻击并解析日志,请确保该目录对全局可写,以便容器内的 Web 用户(`www-data`)拥有访问权限: ``` chmod -R 777 shared/ ``` ### 步骤 2:启动服务 在 detached 模式下初始化并启动所有容器: ``` docker compose up --build -d ``` 确认所有服务处于健康并运行的状态: ``` docker compose ps ``` ### 步骤 3:访问平台 - **ShieldPanel UI**:在 Web 浏览器中打开 `http://localhost:8089`。 - **RabbitMQ 管理界面**:打开 `http://localhost:15672`(凭据:在 `.env` 中配置的 `shieldpanel_mq` / `shieldpanel_mq_pass`)。 ## 手动演练 1. **Dashboard 概览**:查看黑曜石毛玻璃面板。你会看到加载了针对 `example.com`、`myshop.com` 和 `blog.dev` 的种子数据。 2. **生成攻击向量**:选择 `example.com` 并点击 **"Generate Attack Traffic"**。这会将模拟的攻击字符串追加到 `shared/logs/access.log` 和 `shared/logs/error.log` 中。 3. **触发分析**:点击 **"Trigger Security Scan"**。此时会出现一个进度指示器,任务将被发布到 RabbitMQ,交由 Go worker 处理,并更新数据库状态。 4. **检查分析结果**:完成后,圆形的威胁评分会发生变化,详细的条目将填充到 **Incident & Event Logs** 中,显示严重程度、类型和源 IP。 5. **设置页面**:切换到 **Policy Settings** 选项卡。尝试注册一个新的域名资料(例如 `my-new-domain.com`),切换其保护状态(这将触发生命周期事件钩子),或删除某个域名。 ## 数据库 Schema 注册的数据存储在 PostgreSQL 中,定义于 `db/init.sql` 文件: - **`domains`**:域名元数据、活跃生命周期状态及保护状态。 - **`scans`**:扫描运行的历史日志,跟踪开始/完成时间戳、总体威胁评分和风险分类。 - **`findings`**:每次扫描中识别出的特定威胁的细粒度记录,映射元数据、源 IP、类别和严重程度。 - **`events`**:生命周期钩子请求的日志(`domain.created`、`domain.deleted`、`account.suspended`),记录 worker 是否成功对它们进行了协调。
标签:AMSI绕过, Docker, ffuf, Go, OpenVAS, PB级数据处理, PHP, PostgreSQL, RabbitMQ, Ruby工具, 威胁检测, 安全运维, 安全防御评估, 日志审计, 测试用例, 版权保护, 请求拦截