rob-pasc/Innovationsprojekt
GitHub: rob-pasc/Innovationsprojekt
一个基于浏览器的游戏化安全意识培训平台,通过真实的钓鱼模拟 pipeline 和即时补救教学帮助用户识别钓鱼攻击。
Stars: 1 | Forks: 1
#
DeKoi • 不要中招。
一个基于浏览器的游戏化安全意识平台,通过互动模拟和即时的教学反馈,训练用户识别钓鱼攻击。
## 关于
传统的安全意识培训通常被认为是单调、过于理论化且脱离实际场景的。本平台通过将真实的钓鱼模拟 pipeline 与游戏化的补救训练相结合,弥补了这一空白,让用户体验受控的“抓包!”环节,随后引导他们确切了解自己为何会被欺骗。
核心循环:**管理员(或自动化调度程序)发送个性化钓鱼邮件 → 用户点击诱饵 → 用户被重定向到教育提醒页面 → 标签匹配选择最相关的培训模块 → 用户完成一个小游戏或 SCORM 课程以恢复积分。**
钓鱼活动可以通过管理员仪表板手动触发,也可以由基于 Hangfire 的每日调度程序自动发送。该调度程序使用按组划分的策略来控制时间、难度和模板选择。
## 用户流程
### 新用户引导
1. 用户注册 → 完成简短的引导欢迎界面
2. 审核员在“用户管理”中将他们分配到某个组
3. 填充 `NextPhishingAt` → 用户进入自动化钓鱼轮换队列
### 管理员发送模拟
1. 管理员打开 **Dashboard → Simulations**,选择邮件模板和目标邮箱
2. 后端创建 `PhishingAttempt`,个性化邮件(姓名、代词),注入追踪链接和打开追踪像素,并通过 sender-api 发送
3. 确认面板显示追踪链接和发送时间戳
### 用户上钩钓鱼邮件
1. 用户点击追踪链接 → 扣除 XP,记录 `ClickedAt`,管理员仪表板接收实时 SignalR 通知
2. 用户跳转至提醒页面——展示原始邮件,并突出显示钓鱼手法和 XP 惩罚
3. 平台将模板的标签与最佳可用培训实例进行标签匹配
4. 用户完成培训游戏 → 发放 XP → 尝试标记为 `Remediated`(已补救)
### 自适应钓鱼调度程序
1. 审核员打开 **Dashboard → Phishing Scheduler**,选择一个组
2. 配置策略:频率倍数、难度范围、所需模板标签,或完全禁用该组的钓鱼功能
3. 每日 Hangfire 任务(08:00 UTC)筛选出 `NextPhishingAt ≤ now` 的用户,并为每个用户调度经标签和难度筛选的模板,每个模板都带有随机的发送时间偏移量,从而确保邮件在一天中陆续到达,而不是一次性集中发送
4. 根据用户最近的点击记录和组策略,重新计算每个用户的下次发送间隔
### 管理员创建邮件模板
1. 管理员打开 **Dashboard → Templates**,点击 **New Template**
2. 填写主题、发件人姓名、HTML 正文(包含 `{{TRACKING_LINK}}` 占位符)、钓鱼手法标签以及难度(1–5)
3. 该模板立即可用于手动发送和自动化调度程序
### 审核员创建培训模块
1. 审核员打开 **Dashboard → Training Library**,点击 **New Module → Build from a game type**
2. 从下拉菜单中选择游戏类型(例如:*Phishing Quiz*、*URL Detective*、*Social Engineering Chat*)
3. 填写结构化表单:标题、标签、难度、回合数以及可选的内容过滤器
4. 该模块立即可用于在钓鱼尝试失败后的自动化路径调度,以及独立的库内游玩。(审核员也可以选择 **Upload a SCORM package**,以引入来自外部创作工具的模块。)
### 将培训模块导出至外部 LMS
1. 管理员在 Training Library 中找到一个模块并点击 **Export**
2. 后端解析配置,从 R2 获取 SCORM shell,并将 `config.json` 封装进一个 ZIP 文件
3. 下载的 `.zip` 文件是独立的——可直接上传至 Moodle、Cornerstone、SCORM Cloud 等平台
### 监控实时活动
1. 管理员打开 **Dashboard → Simulations**——**Live Activity** 面板位于发送表单旁
2. 该面板连接到 SignalR hub,并在打开和点击事件到达时实时推送流数据
3. 每个事件卡片显示目标邮箱、模板名称、事件类型和时间戳——无需轮询或刷新页面
### 查看活动统计
1. 管理员或审核员打开 **Dashboard → Statistics**
2. 查看概览指标、活动时间线、模板表现、各组细分数据、用户排行榜、风险概览以及 **培训效能**(培训前后按手法分类的点击率)
3. 将所有数据导出为 CSV 以供离线分析
### 用户从游戏库中游玩
1. 用户打开 **Dashboard → Library** 并浏览可用的培训实例
2. 完成游戏 → 得分和 XP 被记录为独立的 `SaveGame`(不关联任何钓鱼尝试)
### 用户挑战同事 (Phish a Coworker)
1. 升级时,用户将获得一个 **Challenge Token**(最多持有 3 个)
2. 在 **Dashboard → Phish a Coworker** 中,他们使用受限构建器设计诱饵(结构化字段,不支持原始 HTML),并选择目标:一个相互接受的 **friend** 或 **random** 同事(匿名)
3. 发送将消耗一个 token;之后的流程就是标准的钓鱼 pipeline——点击惩罚 → 提醒页面 → 标签匹配的培训
4. 当收件人完成培训后,**发送者将获得按比例发放的额外 XP**——奖励与同事的学习情况挂钩,而不是与他们被骗挂钩
5. 管理员可以在全组织范围内禁用此功能(**Dashboard → Settings**);任何用户都可以选择退出被作为目标的列表。参见 [`docs/workflows/peer-challenge-lifecycle.md`](docs/workflows/peer-challenge-lifecycle.md)
## 技术栈
| 层级 | 技术 |
| :--- | :--- |
| 前端框架 | React 19 + TypeScript (Vite) |
| 样式设计 | Tailwind CSS 4 + Shadcn UI |
| 状态管理 | Zustand |
| 动画 | Framer Motion |
| 图表 | Recharts |
| 图标 | Lucide React |
| 实时通信 | SignalR (`@microsoft/signalr`) |
| HTTP 客户端 | Axios |
| 表单验证 | React Hook Form + Zod |
| 后端框架 | ASP.NET Core Web API (.NET 10, C#) |
| ORM | Entity Framework Core |
| 数据库 | PostgreSQL |
| 身份验证 | JWT + BCrypt |
| 后台任务 | Hangfire (PostgreSQL 存储) |
| 邮件发送 (开发环境) | Mailpit – 带有浏览器 UI 的本地模拟 SMTP |
| 邮件发送 (生产环境) | 通过 sender-api 在白名单 VPS 上运行的 Postfix |
| 对象存储 | Cloudflare R2 (兼容 S3,用于 SCORM 包) |
| API 文档 | Scalar (OpenAPI) |
## 快速开始
### 前置条件
- [.NET 10 SDK](https://dotnet.microsoft.com/download)
- [Node.js 20+](https://nodejs.org/)
- [Docker](https://www.docker.com/)(用于数据库和本地邮件堆栈)
- Cloudflare R2 存储桶(用于存储 SCORM 包)
### 1. 数据库 (开发环境)
Database 文件夹中的 `docker-compose.yml` 会启动一个 PostgreSQL 17 容器。
`.env.example` 中的默认配置已经与这些凭据相匹配,因此在进行本地开发时
无需进行任何修改。
```
cd backend/Database
docker compose up -d
# PostgreSQL: localhost:5432 (db: innovationsprojekt, user: postgres, password: postgres)
```
### 2. 邮件堆栈 (开发环境)
在运行后端之前,请启动 Mailpit 和 sender-api。所有外发邮件都将被
本地拦截——不会发送到真实的收件箱中。
```
cd backend/MailService
docker compose up -d
# Mailpit Web UI: http://localhost:8025
# sender-api: http://localhost:8080
```
### 3. 后端
```
cd backend/Api
# 复制示例 env 文件(dev 默认值开箱即用)
cp .env.example .env
dotnet restore
dotnet ef database update # apply migrations
dotnet run
# API 可通过 http://localhost:5000 访问
# Scalar UI 可通过 http://localhost:5000/scalar 访问
```
### 4. 前端
```
cd frontend
npm install
# 复制示例 env 文件并填写您的值
cp .env.example .env
npm run dev
# App 可通过 http://localhost:5173 访问
```
### 5. R2 – 上传游戏模块模板
七个培训游戏模块(Phishing Quiz、URL Detective 等)是存储在 Cloudflare R2 中的 SCORM 包。
后端的数据填充程序在首次启动时会自动为每个模板创建数据库行,但实际文件必须单独构建并上传。
#### 5a. 配置 R2
创建一个 Cloudflare R2 存储桶(免费额度足以满足开发需求),生成一个具有 *Object Read & Write* 权限的 API token,
然后在 `backend/Api/.env` 中填写这四个 R2 变量:
```
R2__AccountId=
R2__AccessKeyId=
R2__SecretAccessKey=
R2__BucketName=
```
编辑 `.env` 后请重启后端,以使新凭据生效。
#### 5b. 构建每个模板
`scorm-templates/` 是一个 npm 工作区,因此只需安装一次即可覆盖所有模板:
```
cd scorm-templates
npm install
npm run build --workspaces --if-present
```
每次构建都会在模板目录内生成一个 `dist/` 文件夹。如果要重新构建单个
模板,请使用 `npm run build --workspace `。
#### 5c. 上传到 R2
上传 endpoint (`POST /api/admin/template-scorm/templates/{slug}/upload`) 接受
模板 `dist/` 内容的 ZIP 压缩包,并且需要管理员 JWT。
首先,获取 token(后端数据填充程序会在首次运行时创建管理员账户):
```
TOKEN=$(curl -s -X POST http://localhost:5000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@Innovationsprojekt.com","password":""}' \
| grep -o '"token":"[^"]*"' | cut -d'"' -f4)
```
然后通过一次操作构建并上传每个模板:
```
for slug in phishing-quiz url-detective social-engineering-chat \
red-flag-spotter office-risk-spotter before-you-click-send data-sorter; do
# ZIP the dist/ contents (not the dist/ folder itself)
(cd scorm-templates/$slug/dist && zip -r /tmp/$slug.zip .)
curl -s -X POST http://localhost:5000/api/admin/template-scorm/templates/$slug/upload \
-H "Authorization: Bearer $TOKEN" \
-F "file=@/tmp/$slug.zip" \
| grep -o '"filesUploaded":[0-9]*'
echo " ← $slug"
done
```
上传成功后,每个模板都会打印出 `"filesUploaded":`。在所有七个模板都
上传完毕后,仪表板中的 Training Library 将完全正常运作,并且
钓鱼警报补救流程可以将用户引导至正确的游戏模块。
## 项目结构
```
├── .github/workflows/ # CI: backend, frontend, SCORM, mail service
├── scripts/ # smoke.sh / smoke.ps1 – end-to-end smoke test
├── backend/
│ ├── Innovationsprojekt.slnx # Solution: Api + Api.Tests
│ ├── Api/ # ASP.NET Core Web API
│ │ ├── Controllers/ # HTTP endpoints
│ │ ├── Domain/ # Entities and domain logic
│ │ ├── Application/ # Services, DTOs, configuration, SignalR hub (Hubs/)
│ │ ├── Infrastructure/ # EF Core, R2 storage, Hangfire, SignalR adapter
│ │ ├── Extensions/ # Grouped DI & startup wiring (Program.cs helpers)
│ │ └── Migrations/ # EF Core migrations
│ ├── Api.Tests/ # xUnit tests (Domain/ = pure-domain tier)
│ ├── Database/ # Local database stack
│ │ └── docker-compose.yml # PostgreSQL
│ └── MailService/ # Local email delivery stack
│ ├── docker-compose.yml # Mailpit + sender-api
│ └── sender-api/ # Node/Express SMTP bridge (+ header validation & tests)
├── frontend/
│ ├── src/
│ │ ├── pages/ # Route-level components
│ │ ├── components/ # Shared UI components
│ │ ├── features/ # Feature-scoped modules (SCORM bridge, etc.)
│ │ ├── layouts/ # Layout wrapper components
│ │ ├── store/ # Zustand state stores
│ │ ├── hooks/ # Custom React hooks
│ │ ├── lib/ # Utilities and domain-sliced API client (api/)
│ │ └── styles/ # Global CSS & Tailwind tokens (globals.css)
│ └── public/
├── scorm-templates/ # npm workspace: SCORM 2004 game modules (React + Vite)
│ ├── package.json # Workspace root (single lockfile for all members)
│ ├── shared/scorm-bridge/ # @dekoi/scorm-bridge – SCORM API + config loader (+ tests)
│ ├── phishing-quiz/ # Multiple-choice phishing email quiz
│ ├── url-detective/ # Click the malicious URL segment
│ ├── social-engineering-chat/# Chat-based social engineering scenarios
│ ├── red-flag-spotter/ # Find every red flag in a full phishing email
│ ├── office-risk-spotter/ # Spot physical and digital risks in an office scene
│ ├── before-you-click-send/ # Decide whether outgoing messages are safe to send
│ └── data-sorter/ # Classify documents into the correct data categories
└── docs/ # Architecture and workflow documentation
├── adr/ # Architecture Decision Records (000–027)
├── architecture/ # Patterns, error handling, entity reference
├── audits/ # Point-in-time audits (security)
├── guides/ # Admin, SCORM catalogue, frontend UI conventions
├── reference/ # Generated reference data (reserved lure paths)
├── systems/ # Email, scheduler, XP, security notes
└── workflows/ # Campaign lifecycle, SCORM template system
```
标签:Web平台, 安全教育与游戏化, 测试用例, 自动化攻击