1.立项背景:高校网络安全专业与战队在组织校内外 CTF(Capture The Flag,夺旗赛)和 AWD(Attack WithDefense,攻防对抗赛)时,长期依赖开源平台或第三方在线靶场。现有方案普遍存在三类痛点:一是开源平台功能割裂,传统解题赛(Jeopardy)与攻防对抗赛需要两套系统分别部署,数据与选手账号无法打通;二是容器靶场编排能力弱,题目环境需人工搭建,动态Flag、按队伍隔离、过期回收等能力缺失或需要大量二次开发;三是缺少面向国内高校赛事的定制化能力,如队伍审核、报名审批、真实身份核验、邮箱验证码注册、作弊检测等。本项目立项目标即自研一套统一支持 CTF 与 AWD 双赛制、全流程线上化的网络安全竞赛平台。
2.建设目标。 (1)覆盖竞赛全生命周期:建赛、出题、报名审核、选手参赛、答题计分、容器下发、排行榜、作弊检测、Writeup评审、日志审计;(2)支持三种 CTF 题型(静态题、动态附件题、容器题)与完整的 AWD 攻防对抗机制(OpenVPN靶场接入、双网络隔离、自动 Check、分池计分、靶机重置);(3)工程上做到高可用、可运维:容器/附件/轮次全自动调度与过期回收、多级日志与审计、滑动窗口限流、启动自愈清理脏数据。目前平台已完成主体功能开发并在真实比赛环境中投入使用。
整体架构和设计思路,不同模块使用的技术栈整体架构。 单体 Go 服务,按功能横向分层:main.go 入口负责初始化与路由注册 → handler/admin/game 三层 handler 处理 HTTP请求 → docker/config/tools 承载容器编排与基础设施能力 → model 承载 GORM 数据模型 → PostgreSQL 为权威数据源、Redis为缓存与限流层。设计上强调数据一致性与自动化运维:排行榜、动态 Flag、限流缓存均由 Redis 支撑并以 Lua 脚本保证原子性;容器过期、动态附件过期、AWD轮次全部采用零轮询的一次性精确 cron 调度,配合每日兜底对账,避免常驻定时器带来的资源空耗与跨重启状态丢失。各模块技术栈。 语言框架 Go 1.25 + Gin v1.11;ORM 用 GORM v1.31(PostgreSQL 驱动,支持事务、advisory lock、JSONB、触发器);数据库 PostgreSQL(ctfdb,含枚举、触发器、物化累计表 contest_rankings);缓存/限流用 Redis(滑动窗口限流 Lua、Token 黑名单、邮箱验证码、排行榜缓存);容器编排用 Docker Engine SDK v28 + Harbor私有镜像仓库认证,网络隔离用 iptables + bridge 网桥;鉴权用 JWT HS256 + bcrypt(cost 12);动态 Flag 用 AES-256-GCM密文绑定「比赛/队伍/题目/邀请码」四元身份;日志用 zap + lumberjack 滚动 + JSON Lines 系统日志 + 数据库审计日志;邮件用SMTP(TLS 465,内嵌 HTML 模板);文件上传用 http.MaxBytesReader + 白名单双校验 + MD5 去重。