gweber/mocksone
GitHub: gweber/mocksone
一个完全离线、开箱即用的 SentinelOne API v2.1 模拟服务器,让 SOAR、SIEM 和自动化脚本的集成测试不再依赖真实环境。
Stars: 0 | Forks: 0
# SentinelOne 模拟服务器
[](https://github.com/gweber/mocksone/actions/workflows/ci.yml)
[](LICENSE)
[](https://www.python.org/)
[](https://www.typescriptlang.org/)
[](https://vuejs.org/)
[](https://www.docker.com/)
[](https://mypy.readthedocs.io/)
[](https://github.com/astral-sh/ruff)
一个用于开发和测试的自包含 **SentinelOne Singularity Platform API v2.1** 模拟服务器。
SOAR playbooks、SIEM 集成和自动化脚本无需修改即可指向此服务器 — endpoint 路径、请求/响应封装、查询参数和字段名称与真实 API 完全匹配。
## 使用场景
| 角色 | 针对 mocksone 的测试内容 |
| ---------------------------- | ------------------------------------------------------------------------------------------------------- |
| **SOAR 工程师** | 警报分类、威胁 remediation、agent 隔离的 Playbooks — 无需消耗实验室许可证 |
| **SIEM 集成人员** | SentinelOne 日志摄取、字段映射、解析器验证 — 数据确定且可重复 |
| **安全自动化开发人员** | 使用 S1 SDK 的 Python/Go/PowerShell 脚本 — 离线、无 VPN、无速率限制 |
| **渗透测试人员 / 红队成员** | 在接触真实租户之前,针对逼真的 agent/threat/alert 状态验证 EDR 响应工具 |
| **QA 工程师** | S1 集成产品的回归测试 — 每次运行时种子数据重置为已知状态 |
```
flowchart LR
subgraph Your Tooling
A[SOAR Playbook]
B[SIEM Connector]
C[Automation Script]
D[Integration Tests]
end
subgraph mocksone
E[FastAPI · S1 API v2.1]
F[In-Memory Store\n60 agents · 30 threats · 20 alerts]
G[DEV Controls\nscenarios · seed reset]
end
A & B & C & D -->|ApiToken auth\nreal S1 paths| E
E <--> F
G --> F
```
## 快速开始
### 单条命令(无 Docker)
```
./start.sh
```
- 前端:http://localhost:3000
- API:http://localhost:8001/web/api/v2.1
- Swagger:http://localhost:8001/web/api/v2.1/doc
### Docker
```
docker-compose up --build
```
所有内容在单个端口上 — FastAPI 同时提供 API 和构建后的前端:
- 应用:http://localhost:5001
- API:http://localhost:5001/web/api/v2.1
- Swagger:http://localhost:5001/web/api/v2.1/doc
### 手动
```
# Backend
cd backend
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
PYTHONPATH=. .venv/bin/uvicorn main:app --port 8001 --reload
# Frontend (独立终端)
cd frontend
npm install && npm run dev
```
## API 认证
所有 endpoint 都需要 `Authorization: ApiToken `。
| 角色 | Token |
| ----------- | ------------------------------------- |
| Admin | `admin-token-0000-0000-000000000001` |
| Viewer | `viewer-token-0000-0000-000000000002` |
| SOC Analyst | `soc-analyst-token-000-000000000003` |
```
curl -H "Authorization: ApiToken admin-token-0000-0000-000000000001" \
http://localhost:8001/web/api/v2.1/agents
```
## 种子数据
确定性种子(固定随机种子 — 每次冷启动数据相同)。可随时通过 DEV 面板或 `POST /_dev/reset` 重置。
- 1 个 account,3 个 site,9 个 group
- **60 个 agent** — Windows/macOS/Linux;desktop/laptop/server;在线/离线;已标记
- **30 个 threat** — Emotet、TrickBot、Ryuk、WannaCry、LockBit 等;包含所有 mitigation/verdict/incident 状态组合
- **20 个 alert** — STAR/UAM alerts;根据真实 API 合约提供 UPPERCASE 级别的 severity + verdict + incidentStatus
- 15 个 exclusion,10 个 blocklist 条目,8 条防火墙规则,6 条设备控制规则,20 个 IOC
- 跨越 90 天的 120 条活动日志条目
所有数据均为 **内存存储** — 变更在服务器重启或 `/_dev/reset` 之前一直有效。
## DEV 模拟控制
悬浮 Bug 图标(UI 右下角):
| 控件 | 描述 |
| ------------------ | -------------------------------------- |
| 实时统计 | Agent / threat / alert 计数 |
| 角色切换 | 在三个预设 token 之间切换 |
| 🦠 大规模感染 | 感染 20 个随机 agent |
| 🎯 APT 攻击 | 针对 10 个 agent 的定向攻击 |
| 📴 Agent 离线 | 使 30% 的 agent 离线 |
| ✅ 平静的一天 | 解决所有 threat,治愈所有 agent |
| 重置为种子数据 | 清除变更,恢复原始种子 |
| API Token | 将任何预设 token 复制到剪贴板 |
## API 覆盖范围
Endpoint 与真实的 SentinelOne API v2.1 路径、动词和封装格式匹配。
| 域 | Endpoint |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Agent | List, get, count · passphrases (bulk) · tags · processes · applications · `POST /agents/actions/{action}` (connect, disconnect, initiate-scan, abort-scan, shutdown, enable-agent, disable-agent, uninstall, decommission, move-to-site, move-to-group, manage-tags, mark-up-to-date, randomize-uuid, restart-services, fetch-logs, broadcast, restart-machine, fetch-installed-apps, fetch-firewall-rules, reset-local-config) |
| Threat | List, get · timeline · notes · `POST /threats/analyst-verdict` · `POST /threats/incident` · `POST /threats/mitigate/{action}` (kill, quarantine, un-quarantine, remediate, rollback-remediation) · `POST /threats/add-to-blacklist` · fetch-file · dv stubs |
| Alert | `GET /cloud-detection/alerts` · `POST /cloud-detection/alerts/analyst-verdict` · `POST /cloud-detection/alerts/incident` |
| Hash | `GET /hashes/{hash}/verdict` — 检查 blocklist |
| Deep Visibility | init-query, query-status, events (符合 Swagger 规范的字段名), cancel |
| Site | List + get |
| Group | List + get |
| Policy | Get + update (按 site / 按 group) |
| Exclusion | List + create + delete |
| Blocklist | List |
| Firewall Rule | List |
| Device Control | List |
| IOC | List + create + bulk-create + delete |
| User | List + login-by-token |
| Activity | List + types |
| Account | List + get |
| System | Status (public) + info + configuration |
## DEV Endpoint
用于工具和测试自动化的非标准 endpoint:
| Endpoint | 描述 |
| --------------------- | ----------------------------------------------------------------------------------- |
| `POST /_dev/reset` | 重新生成所有数据 |
| `POST /_dev/scenario` | 触发场景(`mass_infection`、`apt_campaign`、`agent_offline`、`quiet_day`) |
| `GET /_dev/stats` | 集合计数 |
| `GET /_dev/tokens` | 所有有效的 API token |
## 架构
```
graph TD
subgraph frontend["Frontend · Vue 3 + TypeScript"]
V[Views] --> S[Pinia Stores]
S --> A[Typed API Client]
end
subgraph backend["Backend · Python 3.12 / FastAPI"]
R[Routers] --> Q[Queries]
R --> C[Commands]
Q & C --> Repo[Repository<T>]
Repo --> Store[InMemoryStore\nthread-safe]
Seed[infrastructure/seed.py\nFaker · deterministic] --> Store
end
A -->|ApiToken\nreal S1 paths| R
```
```
backend/
├── domain/ # Pure dataclasses — no framework deps, field names match S1 API exactly
├── repository/ # Generic Repository[T] + thread-safe InMemoryStore
├── application/
│ └── /
│ ├── queries.py # Read side (CQRS) — filter, strip internal fields, paginate
│ └── commands.py # Write side (CQRS) — mutate store, emit activity log
├── api/
│ ├── auth.py # ApiToken header validation
│ ├── dto/ # Pydantic request models (HTTP boundary only)
│ └── routers/ # Thin FastAPI routers — one file per domain
└── infrastructure/
└── seed.py # Faker-based deterministic data generator (seed 42)
frontend/ # Vue 3 + TypeScript — vue-tsc strict, ESLint zero-warnings
└── src/
├── api/ # Axios client + typed domain API modules
├── stores/ # Pinia stores — auth, agents, threats, dashboard
├── types/ # Shared interfaces mirroring the S1 API contract
├── components/ # Shared UI + DevMockPanel (scenarios, role switcher)
└── views/ # One view per UI page
```
## 质量门禁
每次推送运行五个独立的门禁 — 任何门禁失败都会阻止构建:
| 门禁 | 工具 | 阈值 |
| ---------------- | ------------------------- | ----------------------------------------- |
| Lint | `ruff check` | 违规数为零 |
| 类型安全 | `mypy --strict` | 错误数为零(98 个源文件) |
| 后端测试 | `pytest --cov` | ≥ 85% 覆盖率 · 217 个测试 |
| 关键路径 | `pytest -m critical` | 所有 17 个安全不变量测试必须通过 |
| 依赖审计 | `pip-audit` | 已知 CVE 数为零 |
| 前端 lint | `eslint --max-warnings=0` | 警告数为零 |
| 前端类型 | `vue-tsc --noEmit` | 错误数为零 |
| 前端测试 | `vitest --coverage` | ≥ 80% store 覆盖率 · 62 个测试 |
## 环境变量
| 变量 | 默认值 | 描述 |
| -------------------- | ------- | --------------- |
| `SEED_COUNT_AGENTS` | 60 | 要生成的 Agent 数量 |
| `SEED_COUNT_THREATS` | 30 | 要生成的 Threat 数量 |
| `SEED_COUNT_ALERTS` | 20 | 要生成的 Alert 数量 |
标签:API 测试, Docker, EDR, GWeber, Linter, MIT 协议, Mock Server, mypy, NIDS, Playbook, pptx, Python, Ruff, SDK 开发, SentinelOne, Singularity Platform, SOAR, Threat Hunting, TypeScript, Vue 3, Web 开发, 单元测试, 威胁情报, 安全插件, 安全规则引擎, 安全防御评估, 容器化, 开发环境, 开发者工具, 开源框架, 持续集成, 数据展示, 数据解析, 无后门, 日志采集, 杀毒引擎, 模拟服务器, 离线测试, 端点检测与响应, 红队, 脆弱性评估, 脱壳工具, 请求拦截, 集成测试, 静态类型检查