DrDeathLabs/cybertabletop
GitHub: DrDeathLabs/cybertabletop
一个自托管的网络安全桌面演练平台,提供实时引导、角色决策、评分和 NIST CSF 事后总结,帮助安全团队用交互式演练替代静态幻灯片演示。
Stars: 0 | Forks: 0
# CyberTabletop
CyberTabletop 是一个用于运行基于角色的、带评分的网络安全事件响应桌面演练的 Web 应用程序。
它专为希望用交互式演练替代幻灯片演示的安全团队而构建:提供实时引导会议、支持从个人设备作出玩家决策、实时评分、可复用场景以及结构化的事后总结。

## 许可证
CyberTabletop 采用商业源代码许可证 1.1 (Business Source License 1.1) 进行源码可用授权。
公共许可证允许组织(包括商业组织)将其用于内部桌面演练、安全准备、评估、开发、测试、教育和研究。
除非获得维护者的单独书面许可,否则您不得将 CyberTabletop 作为托管服务、托管管理服务、SaaS 产品、付费商业产品、白标产品、其他商业工具的重要功能,或付费咨询/培训/服务交付平台来提供。
参见 [LICENSE](LICENSE) 和 [COMMERCIAL.md](COMMERCIAL.md)。
由于该许可证在变更日期前限制了某些生产/商业用途,根据 OSI 的开源定义,本项目不属于“开源”。每个特定版本在首次公开发布四年后,将自动更改为 MIT 许可证。
## 功能
- 支持大厅、加入码和角色分配的实时引导桌面演练会议
- 针对事件响应团队、基于角色的玩家决策
- 内置勒索软件、数据泄露和内部威胁场景
- 用于自定义阶段、注入事件和决策选项的场景构建器
- 实时评分、排行榜、脚本化反馈和总结视图
- 基于 NIST CSF 的事后总结和差距分析输出
- 本地身份验证及可选的 OIDC/SSO
- 为特权角色强制执行 TOTP MFA,并为玩家提供可选的 MFA
- 使用脚本化响应、Anthropic 或 Ollama 的 AI 辅助内容路径
- 用于运行态势检查的管理员安全仪表盘
- 包含 PostgreSQL, Redis, frontend, backend 和 Nginx 的 Docker Compose 部署
## 安全态势
CyberTabletop 在配置正确的情况下适合自托管的面向互联网的部署,但操作人员仍需对其托管环境、身份提供商、TLS 证书、备份、监控和事件响应负责。
当前的强化措施包括:
- bcrypt 密码哈希
- 短期 JWT 访问令牌
- 带有轮换的服务器端哈希刷新令牌
- 受邀请码限制的注册支持
- 对 `SUPER_ADMIN`, `ORG_ADMIN` 和 `FACILITATOR` 强制执行 TOTP MFA
- 对存储的 TOTP 密钥使用 AES-256-GCM 加密
- bcrypt 哈希的 MFA 恢复代码
- 基于角色的授权
- 路由级别的输入验证
- 速率限制
- 审计日志
- Nginx 安全标头和 CSP,包括点击劫持保护,
跨域隔离标头,以及 HTTPS 响应上的 HSTS。
- 默认情况下仅绑定本地回环地址的 Docker 端口
- PostgreSQL 或 Redis 没有直接的主机暴露
- 针对组织网站获取的 SSRF 保护
已知的残余风险和部署要求记录在 [SECURITY.md](SECURITY.md) 中。
SBOM 制品以 CycloneDX JSON 和 SPDX JSON 格式发布在 [sbom/](sbom/) 中。最新的发布安全审查说明位于 [docs/RELEASE_SECURITY_REVIEW.md](docs/RELEASE_SECURITY_REVIEW.md)。
[docs/](docs/) 中的文档是 NIST SP 800-53 Rev. 5 的对齐和评估支持材料。它们不是认证、运行授权或独立的合规性证明。
## 快速开始
有关完整的设置选项,请参见 [docs/INSTALLATION.md](docs/INSTALLATION.md)。
有关完整的产品演练,请参见 [docs/USER_GUIDE.md](docs/USER_GUIDE.md)。
### 前置条件
- Windows/macOS 上的 Docker Desktop,或 Linux 上的 Docker Engine
- 仅在不使用 Docker 进行开发时需要 Node.js 20+
CyberTabletop 并非仅限 Windows。生产环境栈运行 Linux 容器
并旨在通过 Docker 在 Windows, macOS 和 Linux 主机上运行。代码仓库
包含适用于 Windows 的 `install.ps1` 和适用于 Linux/macOS 的 `install.sh`。
### 1. 配置环境
复制示例环境文件并替换所有 `CHANGE_ME` 的值:
```
cp .env.example .env
```
重要的生产环境值:
- `JWT_SECRET`
- `JWT_REFRESH_SECRET`
- `SESSION_SECRET`
- `MFA_ENCRYPTION_KEY`
- `POSTGRES_PASSWORD`
- `REDIS_PASSWORD`
- `INVITE_CODE`
对于本地测试,安装脚本可以生成本地密钥和自签名证书。
### 2. 启动服务栈
使用来自 GitHub Container Registry 的预构建镜像:
```
docker compose -p cybertabletop -f docker-compose.pull.yml pull
docker compose -p cybertabletop -f docker-compose.pull.yml up -d
```
或者从源代码在本地构建:
```
docker compose -p cybertabletop up -d --build
```
默认情况下,Nginx 仅绑定到 localhost:
- `https://localhost`
- `http://localhost`
要在受信任的反向代理或边缘负载均衡器后暴露应用,请刻意配置 `HTTP_BIND`, `HTTPS_BIND`, `FRONTEND_URL`, `CORS_ORIGINS` 和 TLS 设置。
### 3. 内置场景
后端容器在启动前会自动运行 Prisma 迁移并刷新内置的脚本化
场景库。对于正常的 Docker 安装,不需要单独的 seed 命令。
### 4. 打开应用
打开 [https://localhost](https://localhost) 并接受本地自签名证书警告(如果您使用的是开发证书)。
当 `REQUIRE_INVITE=true` 时,注册默认受邀请码限制。请使用您配置的 `INVITE_CODE` 来创建账户。
第一个非系统账户将成为 `SUPER_ADMIN`。`SUPER_ADMIN`, `ORG_ADMIN`
和 `FACILITATOR` 用户在使用受保护的应用功能之前,需要注册 TOTP MFA。
## 用户角色
| 角色 | 权限 |
| --- | --- |
| `SUPER_ADMIN` | 完整的平台管理权限 |
| `ORG_ADMIN` | 组织级别的用户和会话管理权限 |
| `FACILITATOR` | 创建场景和运行会话 |
| `PLAYER` | 加入会话并作出决策 |
## 运行演练
有关详细的引导者/玩家工作流程,请参见 [docs/USER_GUIDE.md](docs/USER_GUIDE.md)。
引导者:
1. 使用引导者或管理员账户登录。
2. 打开场景并选择内置或自定义场景。
3. 创建会话并配置演练选项。
4. 与参与者分享加入码。
5. 在大厅中分配角色。
6. 启动会话,推进注入事件,并进行事后总结。
玩家:
1. 打开 `/join`。
2. 输入加入码。
3. 选择或确认分配的角色。
4. 在每个注入事件期间作出决策。
5. 查看反馈和事后总结输出。
## 开发
后端:
```
cd backend
npm install
npx prisma generate
npm run build
npm run dev
```
前端:
```
cd frontend
npm install
npm run build
npm run dev
```
实用检查:
```
cd backend && npm audit
cd frontend && npm audit
```
## 项目结构
```
cybertabletop/
backend/ Node.js, Express, Socket.io, Prisma
frontend/ React, Vite, Tailwind
nginx/ Reverse proxy and TLS configuration
docs/ Security and assessment-support documentation
deployment/ Cloud deployment notes
scenarios/ Scenario-related assets
docker-compose.yml Self-hosted Docker stack
docker-compose.pull.yml
Self-hosted stack using prebuilt GHCR images
SECURITY.md Vulnerability reporting and hardening notes
LICENSE Business Source License 1.1
```
## 容器镜像
预构建的镜像发布在 GitHub Container Registry:
- `ghcr.io/drdeathlabs/cybertabletop-backend:latest`
- `ghcr.io/drdeathlabs/cybertabletop-frontend:latest`
- `ghcr.io/drdeathlabs/cybertabletop-nginx:latest`
`latest` 标签从 `main` 分支发布。同时也会发布带有 `sha-` 标签的
特定提交镜像。
如果 `docker pull` 报告授权错误,请在 GitHub 中打开仓库的 Packages
页面并将这些包设为公开。
## 文档
- [安装指南](docs/INSTALLATION.md)
- [用户指南](docs/USER_GUIDE.md)
- [生产就绪](docs/PRODUCTION.md)
- [安全策略](SECURITY.md)
- [商业使用条款](COMMERCIAL.md)
- [贡献](CONTRIBUTING.md)
- [支持](SUPPORT.md)
## GitHub 安全注意事项
请勿提交:
- `.env`
- TLS 私钥或生成的证书
- Docker 卷
- 日志
- `node_modules`
- frontend/backend 的 `dist` 文件夹
包含的 `.gitignore` 已为这些默认选项进行了配置,但在推送前请务必检查 `git status`。
## 密钥处理
Docker Compose 栈会从 `.env` 读取密钥,并将其作为环境变量传递到
容器中。这对于自托管的 Docker Compose 部署很常见,但它与加密的密钥存储
并不相同。
`docker-compose.yml` 中的 `DATABASE_URL` 值是一个模板,在运行时由
`POSTGRES_USER`, `POSTGRES_PASSWORD` 和 `POSTGRES_DB` 展开。它不是
代码仓库中硬编码的数据库密码。请保持 `.env` 文件私密,使用长随机
值,并限制对 Docker 主机和部署目录的访问。
对于有更严格要求的生产环境,请使用您平台的密钥管理器或 Docker secrets,
并在部署时注入生成的值。
标签:AI辅助, Anthropic, CIS基准, Docker Compose, LLM评估, MITM代理, NIST CSF, OIDC, Ollama, RBAC, SaaS替代, SSO, TOTP MFA, 内部威胁, 勒索软件, 安全团队, 安全态势评估, 安全教育, 实时评分, 差距分析, 开源自部署, 搜索引擎查询, 桌面演练, 测试用例, 网络安全, 网络演习, 网络靶场, 自动化攻击, 自托管, 请求拦截, 隐私保护, 靶场平台