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工具, 威胁检测, 安全运维, 安全防御评估, 日志审计, 测试用例, 版权保护, 请求拦截