PentestOPS 渗透测试操作仪表板技术分析
一、项目概述
1. 项目简介
PentestOPS 是一个综合性的渗透测试操作仪表板,专为管理渗透测试项目、任务、漏洞发现、客户和资产而设计。该项目采用前后端分离架构,使用现代化的全栈技术栈构建。
2. 核心功能
- 项目管理:组织渗透测试项目,支持任务分配和团队协作
- 任务管理:看板视图、表格视图和卡片视图,支持筛选、搜索和子任务
- 漏洞管理:跟踪安全漏洞发现,集成 CWE 数据库
- 客户管理:管理客户信息,支持照片、链接和元数据
- 资产管理:跟踪和管理与项目及任务关联的资产
- 富文本编辑:类似 Notion 的页面编辑器,支持标题、段落、代码、表格等
- 检查清单:创建可重用的检查清单并关联到任务
- 评论功能:在任务和漏洞发现上进行线程化评论
- 文件附件:上传 PDF、DOCX、XLSX、CSV、ZIP 和图片
- 版本历史:跟踪更改,支持差异查看和恢复
- 全局搜索:跨所有实体的全文搜索
- 暗色模式:为技术工作流程优化的暗色主题
- 单容器部署:通过 Docker 简化部署
3. 技术亮点
- 单容器架构:MongoDB、后端和前端打包在一个 Docker 容器中
- 现代化前端:Next.js 14 App Router + React + TypeScript
- RESTful API:Express 后端提供完整的 CRUD 操作
- JWT 认证:支持访问令牌和刷新令牌机制
- 富文本编辑:集成 Editor.js 提供类似 Notion 的编辑体验
二、系统架构
1. 整体架构
graph TB
subgraph 客户端
Browser[浏览器]
end
subgraph 反向代理层
Nginx[Nginx<br/>SSL终止]
end
subgraph 应用层
Frontend[Next.js Frontend<br/>端口:3000]
Backend[Express Backend<br/>端口:4000]
end
subgraph 数据层
MongoDB[(MongoDB<br/>端口:27017)]
FileSystem[文件系统<br/>uploads/]
end
Browser -->|HTTPS| Nginx
Nginx -->|静态资源| Frontend
Nginx -->|API代理| Backend
Frontend -->|REST API| Backend
Backend -->|Mongoose| MongoDB
Backend -->|文件存储| FileSystem2. 技术栈
前端技术栈
- Next.js 14(App Router):React 框架,提供服务端渲染和路由
- React 18:UI 库
- TypeScript:类型安全的 JavaScript
- TailwindCSS:实用优先的 CSS 框架
后端技术栈
- Node.js 18+:JavaScript 运行时
- Express:Web 应用框架
- TypeScript:类型安全
- Mongoose:MongoDB ODM
数据存储
- MongoDB 5.0+:NoSQL 文档数据库
- 本地文件系统:使用 multer 处理文件上传
认证与授权
- JWT:JSON Web Token 认证
- 刷新令牌:支持令牌刷新机制
富文本编辑
- Editor.js:块状编辑器
- 多种插件:标题、段落、代码、表格、标注、折叠等
容器化
- Docker:单容器部署
- docker-compose:开发环境编排
三、核心模块分析
1. 认证模块
认证流程
sequenceDiagram
participant C as 客户端
participant F as 前端
participant B as 后端API
participant M as MongoDB
C->>F: 注册/登录
F->>B: POST /api/auth/register<br/>POST /api/auth/login
B->>M: 查询/创建用户
M-->>B: 用户数据
B->>B: 生成JWT令牌
B-->>F: accessToken + refreshToken
F->>F: 存储令牌
F->>B: 携带令牌请求API
B->>B: 验证JWT
B-->>F: 返回数据
Note over C,B: 令牌过期时
F->>B: POST /api/auth/refresh
B-->>F: 新的accessTokenAPI 端点
| 端点 | 方法 | 描述 |
|---|---|---|
| /api/auth/register | POST | 注册新用户 |
| /api/auth/login | POST | 用户登录 |
| /api/auth/refresh | POST | 刷新访问令牌 |
| /api/auth/profile | GET | 获取用户资料 |
| /api/auth/profile | PUT | 更新用户资料 |
2. 项目管理模块
项目关联关系
graph LR
Project[项目] --> Task[任务]
Project --> Finding[漏洞发现]
Project --> Asset[资产]
Task --> SubTask[子任务]
Task --> Comment[评论]
Finding --> CWE[CWE引用]
Client[客户] --> Project项目 API
| 端点 | 方法 | 描述 |
|---|---|---|
| /api/projects | GET | 获取所有项目 |
| /api/projects | POST | 创建项目 |
| /api/projects/:id | GET | 获取项目详情 |
| /api/projects/:id | PUT | 更新项目 |
| /api/projects/:id | DELETE | 删除项目 |
3. 任务管理模块
任务状态流转
stateDiagram-v2
[*] --> 待办: 创建任务
待办 --> 进行中: 开始处理
进行中 --> 已完成: 完成任务
进行中 --> 阻塞: 遇到问题
阻塞 --> 进行中: 问题解决
已完成 --> 待办: 重新打开
已完成 --> [*]任务视图类型
- 看板视图:类似 Trello 的卡片拖拽界面
- 表格视图:类似 Excel 的数据表格
- 卡片视图:优化的卡片展示
4. 漏洞管理模块
漏洞报告结构
graph TB
Finding[漏洞发现] --> Severity[严重程度]
Finding --> CWENumber[CWE编号]
Finding --> Description[漏洞描述]
Finding --> Proof[证明材料]
Finding --> Recommendation[修复建议]
Finding --> Status[状态]
CWENumber --> CWEDatabase[CWE数据库]
Status --> Open[待处理]
Status --> InProgress[修复中]
Status --> Resolved[已解决]
Status --> WontFix[不修复]漏洞 API
| 端点 | 方法 | 描述 |
|---|---|---|
| /api/findings | GET | 获取所有漏洞 |
| /api/findings | POST | 创建漏洞记录 |
| /api/findings/:id | GET | 获取漏洞详情 |
| /api/findings/:id | PUT | 更新漏洞 |
| /api/findings/:id | DELETE | 删除漏洞 |
| /api/cwes | GET | 获取 CWE 列表 |
| /api/cwes/:id | GET | 获取 CWE 详情 |
| /api/cwes/import | POST | 从 CSV 导入 CWE |
四、部署架构
1. 单容器部署
容器内部架构
graph TB
subgraph Docker Container
subgraph MongoDB服务
Mongod[(mongod<br/>27017)]
end
subgraph Backend服务
PM2[PM2进程管理器]
Node[Node.js<br/>Express<br/>4000]
end
subgraph Frontend服务
Next[Next.js<br/>3000]
end
subgraph 共享存储
Uploads[/app/uploads]
DB[/data/db]
end
end
Mongod --> DB
Node --> Uploads
Node --> Mongod
Next --> Node
External[外部访问] -->|3000| Next
External -->|4000| Node
External -->|27017| Mongod部署流程
flowchart TD
Start[开始部署] --> Clone[克隆代码仓库]
Clone --> Build[构建Docker镜像]
Build --> Config[配置环境变量]
Config --> Run[运行容器]
Run --> Nginx[配置Nginx反向代理]
Nginx --> SSL[申请SSL证书]
SSL --> Complete[部署完成]2. VPS 部署架构
完整部署架构
graph TB
subgraph 互联网
User[用户浏览器]
end
subgraph VPS服务器
subgraph 网络层
UFW[UFW防火墙<br/>22,80,443]
end
subgraph Web层
Nginx[Nginx<br/>反向代理+SSL]
end
subgraph 应用层
Container[PentestOPS容器]
end
end
User -->|HTTPS| UFW
UFW --> Nginx
Nginx -->|代理| Container安全加固措施
- 防火墙配置:仅开放 22、80、443 端口
- SSH 加固:禁用 root 登录
- SSL/TLS:使用 Let's Encrypt 证书
- 自动备份:定时备份 MongoDB 和上传文件
五、数据模型
1. 核心数据模型
用户模型
{
username: String,
email: String,
password: String, // 哈希存储
role: String, // admin/user
createdAt: Date,
updatedAt: Date
}项目模型
{
name: String,
description: String,
status: String, // active/completed/archived
clientId: ObjectId,
startDate: Date,
endDate: Date,
createdAt: Date,
updatedAt: Date
}任务模型
{
title: String,
description: String,
status: String, // todo/in-progress/done/blocked
priority: String, // low/medium/high/critical
projectId: ObjectId,
assigneeId: ObjectId,
dueDate: Date,
subtasks: [{ObjectId}],
createdAt: Date,
updatedAt: Date
}漏洞模型
{
title: String,
description: String,
severity: String, // low/medium/high/critical
cweId: String,
status: String, // open/in-progress/resolved/wont-fix
projectId: ObjectId,
taskId: ObjectId,
proof: [ObjectId], // 文件引用
recommendation: String,
createdAt: Date,
updatedAt: Date
}2. 数据关系
erDiagram
USER ||--o{ PROJECT : creates
USER ||--o{ TASK : assigns
USER ||--o{ COMMENT : writes
CLIENT ||--o{ PROJECT : has
PROJECT ||--o{ TASK : contains
PROJECT ||--o{ FINDING : contains
PROJECT ||--o{ ASSET : contains
TASK ||--o{ SUBTASK : has
TASK ||--o{ COMMENT : has
TASK ||--o{ ATTACHMENT : has
FINDING ||--|| CWE : references
FINDING ||--o{ ATTACHMENT : has
PAGE ||--o{ TASK : links六、安全考虑
1. 认证安全
- JWT 令牌:短期访问令牌(15分钟)
- 刷新令牌:长期有效(7天)
- 密码哈希:使用 bcrypt
- HTTPS 强制:生产环境要求 SSL
2. 授权控制
- 基于角色的访问控制(RBAC)
- 项目级权限隔离
- API 端点认证中间件
3. 数据安全
- 输入验证:防止注入攻击
- 文件上传限制:类型和大小检查
- CORS 配置:限制跨域访问
- 环境变量:敏感配置不写入代码
4. 部署安全
- 容器隔离:Docker 提供进程隔离
- 最小权限:非 root 用户运行
- 防火墙规则:限制入站流量
- 自动备份:防止数据丢失
七、性能优化
1. 前端优化
- Next.js 服务端渲染:减少首屏加载时间
- 代码分割:按路由拆分代码
- 图片优化:Next.js Image 组件
- 缓存策略:静态资源缓存
2. 后端优化
- 数据库索引:常用查询字段索引
- 分页查询:限制单次返回数量
- 连接池:复用数据库连接
- 异步处理:文件上传等耗时操作
3. 部署优化
- 单容器架构:减少网络延迟
- 静态资源缓存:Nginx 缓存配置
- Gzip 压缩:减少传输大小
八、扩展性分析
1. 水平扩展
当前单容器架构不利于水平扩展。改进方案:
graph TB
subgraph 改进架构
LB[负载均衡器]
FE1[前端实例1]
FE2[前端实例2]
BE1[后端实例1]
BE2[后端实例2]
MongoS[(MongoDB副本集)]
Redis[(Redis缓存)]
end
LB --> FE1
LB --> FE2
FE1 --> BE1
FE1 --> BE2
FE2 --> BE1
FE2 --> BE2
BE1 --> MongoS
BE2 --> MongoS
BE1 --> Redis
BE2 --> Redis2. 垂直扩展
- 增加容器资源配额
- 优化数据库查询
- 使用 Redis 缓存热点数据
3. 功能扩展
- 插件系统:支持自定义功能模块
- Webhook:集成第三方工具
- API 速率限制:防止滥用
- 审计日志:操作追踪
九、适用场景
1. 目标用户
- 渗透测试团队
- 红队成员
- 安全咨询公司
- 内部安全团队
2. 典型工作流
- 创建客户信息
- 为客户创建渗透测试项目
- 创建任务和检查清单
- 执行测试并记录漏洞
- 生成报告并交付
- 跟踪修复进度
3. 与同类工具对比
| 特性 | PentestOPS | Dradis | Serpico |
|---|---|---|---|
| 开源 | 是 | 商业 | 开源 |
| 部署难度 | 低 | 中 | 高 |
| 现代化UI | 是 | 否 | 否 |
| 检查清单 | 是 | 是 | 是 |
| 协作功能 | 是 | 是 | 有限 |
| CWE集成 | 是 | 否 | 否 |
十、总结
PentestOPS 是一个功能全面的渗透测试操作仪表板,具有以下优势:
技术优势
- 现代化技术栈:Next.js 14 + Express + MongoDB
- 单容器部署:简化运维复杂度
- 类型安全:全栈 TypeScript
- 丰富的功能:覆盖渗透测试全流程
架构优势
- 前后端分离:独立开发和部署
- RESTful API:易于集成
- JWT 认证:无状态认证
- 文件存储:支持多种格式
改进空间
- 扩展性:当前架构不利于水平扩展
- 实时协作:缺少 WebSocket 支持
- 报告生成:需要更强的报告模板功能
- 移动端:需要优化移动体验
该项目为渗透测试团队提供了一个实用的协作平台,特别适合中小型团队的日常项目管理需求。