DLL0x/CFlagger

GitHub: DLL0x/CFlagger

面向 SOC、DFIR 和 CTI 团队的综合网络安全训练平台,提供 CTF 挑战、学习路径和团队竞赛功能。

Stars: 0 | Forks: 0

CFlagger Logo

Cyber Security Training Platform

Version React Node.js PostgreSQL Docker

面向 SOCDFIRCTI 团队的综合训练平台。
CTF 挑战 · 学习路径 · 团队竞赛 · 基于角色的访问控制

## 目录 - [功能特性](#features) - [技术栈](#tech-stack) - [系统架构](#architecture) - [快速安装](#quick-install) - [选项 1:内部部署](#option-1-internal-deployment) - [选项 2:云端部署](#option-2-cloud-deployment) - [本地开发](#local-development) - [默认凭据](#default-credentials) - [项目结构](#project-structure) - [安全特性](#security-features) - [团队方向](#team-sectors) - [截图与演示](#screenshots--demo) - [环境变量](#environment-variables) - [API 概览](#api-overview) - [故障排除](#troubleshooting) - [开发说明](#development-notes) - [更新日志](#changelog) - [支持](#support) - [许可证](#license) ## 功能特性 ### 核心训练 - **团队训练** — 为 SOC、DFIR 和 CTI 团队提供专门的训练方向 - **CTF 挑战** — 真实的调查场景,支持证据下载、单题尝试次数限制及分数追踪 - **学习路径** — 结构化课程,包含阶段学习、测验(70% 及格线)、进度追踪和用户评分 - **团队竞赛 (CTF 活动)** — 限时活动,包含场景、证据文件、排行榜及团队封禁功能 - **进度追踪** — 基于积分的系统,提供排行榜、提交历史和成就 ### 平台功能 - **基于角色的访问控制** — 包含管理员、团队负责人和分析师角色,并实行严格的团队隔离 - **会话管理** — 支持会话版本控制、设备追踪和远程会话终止的 JWT 机制 - **双重认证 (2FA) 支持** — 基于 TOTP 的双重认证 - **用户资料** — 头像选择、社交链接(Twitter、Discord、LinkedIn、GitHub)、密码管理 - **更新与日志** — 管理员管理的平台更新,带有实时 SSE 通知 - **公告** — 管理员发布的公告,支持类别过滤 - **审计日志** — 全面的操作记录,包含 IP 追踪和时间戳 ### 管理员功能 - **挑战构建器** — 创建和编辑包含问题、提示、Flag 和证据的挑战 - **学习路径构建器** — 基于阶段的课程创建,带有内置测验构建器 - **CTF 构建器** — 创建包含场景、证据文件和单题尝试次数限制的 CTF 活动 - **CTF 控制面板** — 实时参赛者监控、团队封禁/解封、提交追踪、活动锁定 - **用户管理** — 密码重置、角色分配、账户激活 ## 技术栈 | 层级 | 技术 | |-------|------------| | **Frontend** | React 19, Vite 7, Tailwind CSS, shadcn/ui | | **Middleware / API 网关** | Nginx (反向代理, SSL 终结, 静态资源分发) | | **Backend** | Node.js 20+, Express, JWT, bcryptjs | | **Database** | PostgreSQL 15, Sequelize ORM | | **容器化** | Docker & Docker Compose | | **安全** | Helmet.js, express-rate-limit, CORS, 安全 Cookie | ## 系统架构 ``` ┌─────────────────────────────────────────────────────────────────┐ │ CLIENT BROWSER │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ HTTPS Request │ │ │ └──────────────────────┬───────────────────────────────────┘ │ └─────────────────────────┼───────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ FRONTEND — NGINX (Container: 8080 / 8443) │ │ Host Mapping: 8080→8080 | 8443→8443 │ │ (React SPA + Reverse Proxy) │ │ │ │ ┌──────────────────────────┐ ┌──────────────────────────────┐ │ │ │ Static React SPA │ │ API Proxy (/api/*) │ │ │ │ index.html / assets │ │ → Backend:5000 │ │ │ └──────────────────────────┘ └──────────────────────────────┘ │ └─────────────────────────┬───────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ BACKEND API (Port 5000) │ │ Internal Docker Network Only │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ Express.js Application │ │ │ │ • Authentication (JWT + Sessions) │ │ │ │ • Authorization (Role-based access) │ │ │ │ • Rate Limiting (Per-client IP) │ │ │ │ • Input Validation (express-validator) │ │ │ │ • Security Headers (Helmet.js) │ │ │ └──────────────────────┬───────────────────────────────────┘ │ └─────────────────────────┼───────────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ DATABASE (Port 5432) │ │ Internal Docker Network Only │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ PostgreSQL 15 │ │ │ │ • Users, Teams, Challenges │ │ │ │ • Progress, Competitions, Audit Logs │ │ │ │ • Sessions, Achievements, Announcements │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` ### 数据流 ``` User Request │ ▼ ┌─────────────────┐ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐ │ Frontend/Nginx │──▶ │ Express │──▶│ Sequelize │──▶│ PostgreSQ │ │ (Static + API │ │ (Auth + │ │ (ORM + │ │ (Data │ │ Proxy) │◄───│ Business) │◄───│ Models) │◄───│ Storage) │ └─────────────────┘ └─────────────┘ └─────────────┘ └──────────────┘ │ ▼ React SPA Response ``` ## 快速安装 ``` git clone https://github.com/DLL0x/CFlagger.git cd CFlagger ``` ### 选项 1:内部部署 用于内部网络部署。服务器可以连接互联网,但应用程序不对外网公开。 #### 前置条件 - Linux 服务器(推荐 Ubuntu 22.04+) - Docker & Docker Compose - 内部 DNS 或基于 IP 的访问 #### 快速安装 ``` # 1. 复制应用文件到服务器 # (通过 USB、SCP 或内部文件共享) cp -r CFlagger /opt/CFlagger cd /opt/CFlagger # 2. 运行安装程序 sudo bash install-offline.sh ``` 安装程序将自动执行以下操作: - 验证 Docker & Docker Compose 是否已安装 - 生成安全的数据库和 JWT 密钥 - 使用您的内部 IP 创建 `.env` 文件 - 配置防火墙(仅限 HTTP) - 部署应用程序 - 运行健康检查 #### 手动步骤(如需) ``` # 1. Clone 仓库 git clone https://github.com/DLL0x/CFlagger.git /opt/CFlagger cd /opt/CFlagger # 2. 生成环境文件 cp .env.example .env DB_PASS=$(openssl rand -base64 32) JWT_SEC=$(openssl rand -hex 64) sed -i "s#^DB_PASSWORD=.*#DB_PASSWORD=$DB_PASS#" .env sed -i "s#^POSTGRES_PASSWORD=.*#POSTGRES_PASSWORD=$DB_PASS#" .env sed -i "s#^JWT_SECRET=.*#JWT_SECRET=$JWT_SEC#" .env sed -i "s#^CORS_ORIGIN=.*#CORS_ORIGIN=http://192.168.1.100#" .env # 检查生成的文件 cat .env ``` ``` # 3. Deploy docker compose -f docker-compose.prod.yml up -d --build # 4. Verify docker compose ps curl http://192.168.1.100:8080/api/health ``` #### 内部网络说明 - 在内部使用 HTTP(无需 SSL) - 仅绑定到内部网络接口 - 防火墙:阻止对端口 5000 和 5432 的外部访问 - 只有端口 8080(或自定义端口)需要允许内部访问 ### 选项 2:云端部署 用于带有 HTTPS 和全面安全加固的公网部署。 #### 前置条件 - 云端 VPS(最低 2 vCPU,2GB RAM) - 公网 IP 地址 - 域名(推荐用于 SSL) - Docker & Docker Compose #### 快速安装 ``` # 单行命令(在您的云服务器上以 root 身份运行) curl -fsSL https://raw.githubusercontent.com/DLL0x/CFlagger/main/install-cloud.sh | sudo bash ``` 或者先克隆并在本地运行: ``` git clone https://github.com/DLL0x/CFlagger.git /opt/CFlagger cd /opt/CFlagger sudo bash install-cloud.sh ``` 安装程序将自动执行以下操作: - 安装 Docker & Docker Compose - 生成安全的数据库和 JWT 密钥 - 创建 `.env` 文件 - 配置防火墙(端口 22、8080、8443) - 部署应用程序 - 使用 Let's Encrypt 设置 SSL/TLS(可选) - 配置每日数据库备份 - 运行健康检查 #### 手动步骤(如需) ``` # 1. 准备服务器 ssh root@your-server-ip curl -fsSL https://get.docker.com | sh # 2. Clone 并配置 mkdir -p /opt/CFlagger cd /opt/CFlagger git clone https://github.com/DLL0x/CFlagger.git . # 3. 生成环境文件 cp .env.example .env DB_PASS=$(openssl rand -base64 32) JWT_SEC=$(openssl rand -hex 64) sed -i "s#^DB_PASSWORD=.*#DB_PASSWORD=$DB_PASS#" .env sed -i "s#^POSTGRES_PASSWORD=.*#POSTGRES_PASSWORD=$DB_PASS#" .env sed -i "s#^JWT_SECRET=.*#JWT_SECRET=$JWT_SEC#" .env sed -i "s#^CORS_ORIGIN=.*#CORS_ORIGIN=https://cflagger.yourdomain.com#" .env # 检查生成的文件 cat .env ``` ``` # 4. Deploy docker compose -f docker-compose.prod.yml up -d --build # 5. Verify curl -I https://cflagger.yourdomain.com:8443 ``` #### 云端安全清单 - [ ] 仅将端口 8080 和 8443 暴露到互联网 - [ ] SSH(端口 22)仅限制为您的 IP 访问 - [ ] 数据库端口 5432 未对外暴露 - [ ] 后端端口 5000 未对外暴露 - [ ] 使用有效的 SSL 证书强制执行 HTTPS - [ ] 已生成强 `JWT_SECRET` - [ ] 首次登录后已更改管理员密码 - [ ] 已配置定期的数据库备份 #### 防火墙配置 (UFW) ``` ufw default deny incoming ufw allow 8080/tcp ufw allow 8443/tcp ufw allow from YOUR_IP to any port 22 ufw enable ``` ## 本地开发 ### 前置条件 - Node.js 20+ - PostgreSQL 15 - npm 或 yarn ### Windows 开发 ``` # 1. 安装依赖 cd backend; npm install cd ../frontend; npm install # 2. 配置环境 cd backend copy .env.example .env # 使用本地数据库凭据编辑 .env # 3. 启动 PostgreSQL 服务 (Windows) # 确保 PostgreSQL 正在 localhost:5432 上运行 # 4. 启动后端(专用终端) cd backend; node server.js # 5. 启动前端(专用终端) cd frontend; cmd /c "npm run dev" ``` **注意**:在 Windows 上,PowerShell 执行策略会阻止 npm 脚本。请始终使用 `cmd /c "npm run ..."`。 ### Docker 开发 ``` # 使用支持热重载的自定义开发 Dockerfiles docker compose -f docker-compose.dev.yml up --build -d ``` ### 访问端点 | 环境 | URL | |-------------|-----| | Frontend (开发) | http://localhost:5173 | | Frontend (生产) | https://yourdomain.com:8443 | | Backend API (开发) | http://localhost:5000 | | Backend API (生产) | 仅限内部(通过 nginx 代理) | | Database (开发) | localhost:5432 | ## 默认凭据 在首次部署时,数据库会自动填充默认用户。**请检查后端日志以获取随机生成的管理员密码:** ``` docker compose logs backend | grep "ADMIN USER CREATED" ``` | 角色 | 用户名 | 默认团队 | |------|----------|--------------| | Admin | `admin` | SOC | | Team Lead | `soc-lead` | SOC | | Team Lead | `dfir-lead` | DFIR | | Team Lead | `cti-lead` | CTI | | Analyst | `analyst1` | SOC | | Analyst | `analyst2` | DFIR | | Analyst | `analyst3` | CTI | ## 项目结构 ``` CFlagger/ ├── docker-compose.yml # Production orchestration ├── docker-compose.prod.yml # Production config ├── docker-compose.dev.yml # Development with hot-reload ├── docker-compose.override.yml # Dev port mappings ├── backend/ # Node.js API │ ├── server.js # Entry point │ ├── Dockerfile # Production image │ ├── Dockerfile.dev # Development image │ ├── src/ │ │ ├── models/ # Sequelize ORM models │ │ ├── routes/ # API route handlers │ │ ├── middleware/ # Auth, authorization, validation │ │ └── utils/ # Seed data and helpers │ └── uploads/ # Challenge artifact storage ├── frontend/ # React SPA │ ├── Dockerfile # Production nginx build │ ├── Dockerfile.dev # Development Vite server │ ├── nginx.conf # Default nginx config │ ├── nginx.prod.conf # Production SSL config │ └── src/ │ ├── pages/ # Route pages │ ├── components/ # Reusable UI components │ ├── hooks/ # React hooks (auth, data) │ └── types/ # TypeScript definitions ├── db/init/ # Database initialization scripts ├── install-cloud.sh # Cloud / online automated installer ├── install-offline.sh # Internal network automated installer ├── ssl/ # SSL certificates (production) └── company-logo/ # Platform branding assets ``` ## 安全特性 - **JWT 认证**,带有会话版本控制和设备追踪 - **Bcrypt 密码哈希**,带有自适应开销因子 - **基于团队的资源隔离** — 团队之间实行严格的边界控制 - **审计日志** — 所有操作均记录 IP 地址和时间戳 - **Helmet.js 安全头** — HSTS、CSP、X-Frame-Options、X-Content-Type-Options - **速率限制** — 对所有端点进行基于客户端 IP 的限制 - **输入验证** — 在所有路由上使用 express-validator - **安全 Cookie** — `httpOnly`、`secure` (HTTPS)、`SameSite=strict` - **文件上传安全** — 扩展名验证 + 强制下载处理 - **CORS 限制** — 带有凭据的单源策略 ## 团队方向 ### SOC — 安全运营中心 - 可疑的 PowerShell 执行 - 暴力破解攻击检测 - 通过 SMB 的横向移动 ### DFIR — 数字取证与事件响应 - 内存转储分析 - 勒索软件调查 - 浏览器取证 ### CTI — 网络威胁情报 - APT 活动归因 - 暗网情报 - 恶意软件 TTP 分析 ## 截图与演示 ## 环境变量 将 `.env.example` 复制到 `.env` 并配置以下变量: | 变量 | 必填 | 描述 | |----------|----------|-------------| | `DB_USER` | 是 | PostgreSQL 用户名 | | `DB_PASSWORD` | 是 | PostgreSQL 密码(由安装程序自动生成) | | `DB_NAME` | 是 | 数据库名称 | | `DB_HOST` | 是 | 数据库主机(Docker 环境下为 `db`) | | `DB_PORT` | 是 | 数据库端口(`5432`) | | `POSTGRES_PASSWORD` | 是 | PostgreSQL 超级用户密码 | | `JWT_SECRET` | 是 | 用于 JWT 签名的密钥(自动生成) | | `ADMIN_SEED_PASSWORD` | 否 | 可选的管理员初始密码 | | `NODE_ENV` | 是 | `production` 或 `development` | | `CORS_ORIGIN` | 是 | 允许的源 URL | ## API 概览 后端在 `/api/*` 下提供 REST API。主要端点组包括: | 端点 | 描述 | |----------|-------------| | `POST /api/auth/login` | 用户认证 | | `POST /api/auth/register` | 用户注册(仅限管理员) | | `GET /api/auth/me` | 当前用户资料 | | `GET /api/challenges` | 挑战列表 | | `POST /api/submissions` | 提交 Flag | | `GET /api/leaderboard` | 积分排行榜 | | `GET /api/progress` | 用户进度 | | `GET /api/achievements` | 用户成就 | | `GET /api/notifications` | 通知流 | | `GET /api/audit` | 审计日志(管理员) | | `GET /api/health` | 健康检查端点 | ## 故障排除 ### 安装问题 | 问题 | 解决方案 | |-------|----------| | 找不到 Docker | 确保 Docker 和 Docker Compose 已安装。使用 `install-cloud.sh` 自动安装。 | | 后端启动失败 | 检查 `.env` 配置。确保已设置 `JWT_SECRET` 和 `DB_PASSWORD`。 | | 数据库连接错误 | 使用 Docker 时验证 `DB_HOST=db`。通过 `docker compose ps` 检查数据库是否健康。 | | 端口 8080 已被占用 | 停止占用 8080 端口的现有服务,或在 `docker-compose.prod.yml` 中更改前端端口映射。 | ### 获取管理员密码 ``` docker compose logs backend | grep "ADMIN USER CREATED" ``` ### 重置数据库 ``` docker compose -f docker-compose.prod.yml down -v docker compose -f docker-compose.prod.yml up -d --build ``` ## 开发说明 - **PowerShell npm 脚本**:被执行策略阻止 — 请使用 `cmd /c "npm run ..."` - **后台任务**:请勿用于长时间运行的服务器(1 小时后超时)— 请使用专用终端窗口 - **Sequelize sync**:在开发环境中使用 `alter: true` 会自动处理模型变更 - **数据库列**:请使用 `user_rating` / `user_comment`(而非 `rating` / `review`) - **TypeScript 构建**:如果 `tsc -b` 失败,请使用 `npx vite build` 进行生产构建 ## 更新日志 有关最新的更新和版本历史,请查看 [Releases](https://github.com/DLL0x/CFlagger/releases)。 **当前版本:1.1.0** ## 支持 如有问题、疑问或功能请求,请在 [GitHub Issues](https://github.com/DLL0x/CFlagger/issues) 页面提交 issue。 ## 许可证 仅供内部使用 — CFlagger Platform
标签:CISA项目, CTF平台, CTI培训, DFIR培训, Docker, GNU通用公共许可证, IP 地址批量处理, Node.js, OPA, PostgreSQL, React, SOC培训, Syscalls, Web安全, XXE攻击, 云部署, 企业安全培训, 内部部署, 团队管理, 基于角色的访问控制, 威胁情报, 子域名变形, 学习路径, 安全教育, 安全竞赛, 安全防御评估, 实战演练, 库, 应急响应, 开发者工具, 开源安全工具, 数字取证, 无线安全, 漏洞攻防, 网络安全培训平台, 网络安全教育, 网络靶场, 自动化攻击, 自动化脚本, 蓝队分析, 蓝队培训, 请求拦截, 逆向工程平台, 靶场