mine_ctf/docs/ctf-platform-plan.md
2026-05-05 21:27:34 +08:00

13 KiB
Raw Blame History

学 / 练 / 考一体化 CTF 平台规划文档

1. 文档目的

本文档用于规划一套基于现有开源项目二次开发的 CTF 平台,目标是支持:

  • 学:课程化学习、知识点引导、实验闯关
  • 练:日常刷题、专题训练、战队训练、靶场实操
  • 考:正式考试、分班分组、限时考核、成绩导出

规划重点不是“从零重写一个 CTF 平台”,而是“基于成熟开源项目快速搭建可持续演进的平台”。

2. 建设目标

2.1 总目标

建设一套统一账号、统一题库、统一成绩、统一运维的 CTF 平台,让同一批题目可以在不同场景下复用:

  • 在学习场景中作为带引导的实验题
  • 在训练场景中作为刷题题或战队训练题
  • 在考试场景中作为正式考核题

2.2 业务目标

  • 降低办赛、带队训练、组织考核的重复配置成本
  • 让题库从“赛事型资产”升级为“教学型资产”
  • 让用户成长路径可追踪:学过什么、练过什么、考得怎样
  • 让平台可以支持学校、培训营、企业内训三类典型场景

2.3 非目标

首期不建议把范围做得过大,以下内容建议暂不作为一期硬目标:

  • 完整 LMS 能力(长视频直播、作业批改、论坛社区)
  • 远程 AI 监考
  • 全量攻防演练平台
  • 完整 OJ / 编程题平台

3. 现有开源项目选型判断

3.1 结论先行

推荐路线:

  • GZCTF 作为题目运行与比赛引擎
  • 以自研“门户层 / 教学层 / 考试层”补齐学练考一体化能力
  • 课程编排、模块化学习路径可借鉴 pwn.college dojo 的组织方式
  • CTFd 适合作为备选方案,尤其适合 Python 团队或轻量活动场景

3.2 选型对比

项目 更适合做什么 优势 短板 结论
GZCTF 比赛引擎、容器题运行、动态环境 原生支持 Docker / K8s、动态容器、动态 Flag、动态分值、分组与写作收集偏实战赛事 学习路径、课程编排、考试流程管理仍需补齐;二开需考虑其授权与品牌要求 作为底座优先
CTFd 轻量比赛平台、插件式扩展、主题定制 社区成熟、插件和主题机制完善、动态分值 / Hint / Unlock 链路成熟 容器题与隔离环境能力通常要依赖插件或外围系统,自带“学练考一体”能力不足 作为备选
pwn.college dojo 学习编排与课程组织参考 课程 / 模块 / 挑战的组织模型清晰,适合“学”的层面借鉴 系统复杂,直接作为底座成本较高 作为设计参考,不建议直接做底座

3.3 为什么更推荐 GZCTF

对于“学、练、考一体”平台,最难的往往不是前台页面,而是下面这些底层能力:

  • 容器题的生命周期管理
  • 动态 Flag 和题目隔离
  • 并发下的稳定性
  • 比赛中的监控、日志、排行榜
  • 后续向靶场 / 实验环境扩展的空间

GZCTF 在这些方面更贴近目标平台的核心诉求。如果后面考试和训练都需要大量 Web / Pwn / Misc 实验环境GZCTF 更容易成为长期底座。

3.4 选型注意事项

  • GZCTF 的官方资料显示其核心基于 AGPLv3同时存在受限组件与商标要求二开前要先确认对外部署方式、代码开放义务、品牌展示要求。
  • CTFd 为 Apache-2.0,更宽松,但平台核心能力更偏“赛事壳子 + 插件扩展”。
  • 如果团队主力是 Python且一期重点是“题库管理 + 课程引导 + 轻考试”CTFd 可更快起步。
  • 如果团队需要中长期支撑容器题、实训、校赛、结课考核GZCTF 更值得投入。

4. 产品定位与场景设计

4.1 平台定位

目标平台不是单纯办赛平台,而是“安全实训操作系统”,至少覆盖三类场景:

  1. 课程学习
  2. 日常训练
  3. 正式考核

4.2 三大模式定义

面向初学者与课程学习过程,强调引导和路径:

  • 按方向组织课程Web、Pwn、Crypto、Reverse、Misc、AWD 基础等
  • 按模块组织知识点:基础、进阶、专题、综合
  • 每个模块绑定题目、附件、题解、讲义、视频或外链资料
  • 支持前置依赖与解锁规则
  • 支持练习记录、学习进度、掌握度统计

面向平时训练和战队培养,强调自由度和强反馈:

  • 公开练习场
  • 专题训练营
  • 限时训练赛
  • 班级 / 战队内部排行榜
  • 靶机或容器环境一键启动、重置、续期

面向正式考试和结业考核,强调过程可控与结果可审计:

  • 题单 / 试卷编排
  • 限时开放、迟到策略、交卷策略
  • 分班 / 分组 / 分考场
  • 随机抽题或 A/B 卷
  • 成绩冻结、申诉复核、成绩导出
  • 操作日志、提交记录、异常行为审计

4.3 统一设计原则

同一题目应当只维护一份“主数据”,在不同场景下用不同策略发布:

  • 学习模式:可见提示、可见知识点、可见题解、可多次重置
  • 训练模式:弱提示、开放时间长、强调排行榜与环境可用性
  • 考试模式:严格限制提示、限制可见性、强调审计与防泄题

5. 核心能力规划

5.1 统一账号与组织体系

  • 用户账号
  • 班级 / 训练营 / 战队 / 学院组织
  • 角色权限:学生、教练、讲师、命题人、管理员、考务
  • 单点登录预留:学校统一认证、企业 AD / OAuth

5.2 统一题库

每道题建议维护以下元数据:

  • 题目名称、方向、难度、标签
  • 题目类型:附件题、静态容器题、动态容器题
  • 知识点、前置知识、学习目标
  • 场景属性:可学习、可训练、可考试
  • 预计用时、建议人群、题解开放策略
  • 附件、容器镜像、Flag 策略、环境依赖
  • 风险等级:是否容易泄题、是否需独立环境、是否适合考试

5.3 学习中心

  • 课程树 / 模块树
  • 学习路径解锁
  • 讲义 / 视频 / 外链资料挂载
  • 分步提示与题解控制
  • 学习进度、完成率、掌握度看板

5.4 训练中心

  • 自由刷题
  • 专题闯关
  • 周赛 / 月赛 / 内部选拔赛
  • 战队协作模式
  • 环境重置、限时续期、实例回收

5.5 考试中心

  • 题库抽题
  • 固定题单组卷
  • 分班分卷
  • 防串题策略
  • 审计日志与导出
  • 成绩单、班级统计、知识点维度分析

5.6 内容运营与运维中心

  • 题目导入导出
  • 镜像构建与发布
  • 附件管理
  • 公告、通知、活动配置
  • 平台监控、容器监控、告警
  • 比赛 / 考试结束后的归档与复盘

6. 推荐总体架构

6.1 架构原则

  • 核心运行能力复用开源项目
  • 业务编排能力自研
  • 题目主数据与运行实例分离
  • 平台门户与比赛内核解耦

6.2 分层架构

flowchart LR
    A[统一门户 Frontend] --> B[业务中台 API]
    B --> C[学习服务]
    B --> D[训练服务]
    B --> E[考试服务]
    B --> F[用户与组织服务]
    C --> G[统一题库服务]
    D --> G
    E --> G
    D --> H[GZCTF 比赛/环境引擎]
    E --> H
    G --> H
    B --> I[统计分析服务]
    H --> J[(PostgreSQL/Redis/Object Storage)]
    B --> J
    H --> K[Docker / K8s]

6.3 模块拆分建议

建议拆成两大域:

A. 平台业务域

  • 门户前端
  • 账号与组织
  • 课程与学习路径
  • 训练计划
  • 考试编排
  • 数据分析

B. 题目运行域

  • 比赛 / 练习实例
  • 动态容器
  • Flag 校验
  • 排行榜
  • 提交记录
  • 环境监控

这样做的好处是:以后即使底层引擎从 GZCTF 调整为别的方案,平台层仍可保留。

7. 一期建议范围MVP

7.1 一期目标

先验证“统一题库 + 训练 + 考试”能跑通,再补“课程化学习”。

原因:

  • 训练和考试更接近 GZCTF / CTFd 的现有能力,落地更快
  • 学习中心需要更多内容运营和教学设计,见效略慢
  • 先把题库、环境、权限、成绩这些硬骨头打通,后续扩展最稳

7.2 一期功能清单

  • 统一登录
  • 统一题库主数据
  • 题目与 GZCTF 实例映射
  • 公开练习场
  • 限时训练赛
  • 基础考试模式
  • 成绩导出
  • 基础统计报表
  • 题目发布审批流

7.3 一期不做或弱化

  • 视频课程
  • 复杂学习画像
  • AI 助教
  • 高级反作弊
  • 多校区多租户强隔离

8. 二期建议范围

二期再把“学”补齐,形成真正的一体化闭环:

  • 课程中心
  • 模块化知识图谱
  • 学习路径解锁
  • 分步提示与题解策略
  • 教师面板
  • 班级画像
  • 训练推荐
  • 题目质量分析

9. 三期建议范围

  • 多租户 / 多院系隔离
  • SSO 与组织同步
  • 高级防作弊策略
  • 题目工厂与 CI/CD
  • 自动化镜像体检
  • 资源预算与弹性扩缩容
  • 区域化部署与灾备

10. 技术实现建议

10.1 底座策略

推荐采用“外包内核”思路:

  • GZCTF 负责比赛、容器、Flag、提交、排行等运行时能力
  • 自研业务服务负责课程、训练编排、考试编排、组织、报表

不要一开始就深改 GZCTF 核心代码,优先采用:

  • API 集成
  • 主题定制
  • 外挂服务
  • 数据同步

只有在 API 明显不够时,再考虑有边界地修改底层项目。

10.2 题目内容流水线

建议从一开始就建立题目标准化流程:

  1. 题目源码和附件放在 Git 仓库
  2. 容器题通过 CI 构建镜像
  3. 题目元数据同步到统一题库
  4. 题目按场景发布到学习 / 训练 / 考试
  5. 结束后回收环境并归档数据

10.3 部署建议

按阶段划分:

  • 本地开发:Docker Compose
  • 测试环境:Docker + 单节点 K3s
  • 生产环境:K8s + PostgreSQL + Redis + MinIO + 监控告警

如果目标规模在校内 100 到 300 人,初期可以从 Docker 起步。 如果目标是长期平台、公开赛事或多班并发考试,尽早上 K8s 更稳。

10.4 数据与审计建议

至少要保留以下数据:

  • 用户学习记录
  • 提交记录
  • 题目 solve / fail 数据
  • 环境启动与销毁日志
  • 成绩变更日志
  • 考试过程日志

这些数据决定了后续是否能做:

  • 成绩复核
  • 异常行为分析
  • 题目难度校准
  • 学习推荐

11. 关键风险与应对

11.1 授权与合规风险

风险:

  • 直接二开 GZCTF 可能涉及 AGPL、受限组件、商标展示要求

应对:

  • 在立项阶段先做开源合规审查
  • 能用 API / 插件方式扩展,就先不深 Fork
  • 对外发布前准备版权说明、源码开放策略和品牌说明

11.2 泄题与场景污染风险

风险:

  • 同一题同时用于学习、训练、考试,容易泄题

应对:

  • 题目增加场景标签与发布策略
  • 题解、Hint、附件按模式隔离
  • 考试题优先使用变体题或同知识点不同载体题

11.3 容器资源与并发风险

风险:

  • Web / Pwn 动态环境消耗大,考试高峰容易打满机器

应对:

  • 题目按资源等级分层
  • 预热热点镜像
  • 配置实例回收策略
  • 提前做压测和限流

11.4 内容生产瓶颈

风险:

  • 平台搭好了,但课程和题库跟不上

应对:

  • 优先做 1 到 2 个方向的精品专题
  • 建立题目模板和审核标准
  • 把命题、讲义、题解形成统一生产规范

12. 建议里程碑

M02 周

  • 完成开源选型确认
  • 梳理授权与合规边界
  • 跑通 GZCTF 本地 PoC
  • 明确统一题库的数据模型

M14 到 6 周

  • 完成统一登录
  • 完成题库后台
  • 完成练习场 MVP
  • 打通题目发布与实例启动

M24 到 6 周

  • 完成训练赛模式
  • 完成基础考试模式
  • 完成成绩导出和基础报表

M34 到 8 周

  • 完成课程中心
  • 完成学习路径与进度跟踪
  • 完成教师 / 教练视角看板

M4持续演进

  • 多租户
  • SSO
  • 监控告警完善
  • 自动化题目流水线
  • 更完整的数据分析

13. 当前建议的落地路径

最务实的落地方案是:

  1. 先把 GZCTF + 统一题库后台 + 练习/考试编排 做出来
  2. 用最小成本跑通一个真实场景,例如“校队训练营 + 结课考核”
  3. 通过一期积累用户、题目、流程数据
  4. 再把课程学习、知识图谱、推荐系统慢慢补上

这样做比“一开始就做一个特别全的平台”更稳,也更容易真正上线。

14. 下一步建议

如果按这个方向继续推进,建议下一份文档直接进入下面三选一:

  1. 一期 PRD:把 MVP 功能拆成页面、角色、流程、字段
  2. 技术架构设计:把服务划分、数据流、部署拓扑画出来
  3. 题库模型设计:把课程、题目、训练、考试之间的数据关系先定死

15. 参考项目与资料

16. 本文档的推荐决策

如果现在就要拍板,我的建议是:

  • 底座选 GZCTF
  • 业务层自研
  • 一期先做“练 + 考”
  • 二期再补“学”
  • 题库从第一天起就按“同题多场景复用”设计

这条路线综合了建设速度、长期扩展性和容器题支撑能力,整体风险最低。