Files
csm/wiki/index.md
iven 60ee38a3c2 feat: 新增补丁管理和异常检测插件及相关功能
feat(protocol): 添加补丁管理和行为指标协议类型
feat(client): 实现补丁管理插件采集功能
feat(server): 添加补丁管理和异常检测API
feat(database): 新增补丁状态和异常检测相关表
feat(web): 添加补丁管理和异常检测前端页面
fix(security): 增强输入验证和防注入保护
refactor(auth): 重构认证检查逻辑
perf(service): 优化Windows服务恢复策略
style: 统一健康评分显示样式
docs: 更新知识库文档
2026-04-11 15:59:53 +08:00

2.4 KiB
Raw Permalink Blame History

CSM 知识库

项目画像

CSM (Client Security Manager) — 医院终端安全管控平台C/S + Web 三层架构。管理 11 个安全插件覆盖上网拦截、U盘管控、打印审计、剪贴板管控、补丁管理等场景。

关键数字: 3 个 Rust crate + Vue 前端 | 18 个数据库迁移 | 13 个客户端插件 | ~30 个 API 端点 | 自定义 TCP 二进制协议

模块导航树

CSM
├── [[protocol]] — 二进制协议层Frame 编解码、MessageType、payload 定义)
├── [[server]] — 服务端HTTP API + TCP 接入 + WebSocket + SQLite
├── [[client]] — 客户端代理Windows 服务、插件采集、自动重连)
├── [[web-frontend]] — Web 管理面板Vue 3 SPA
├── [[plugins]] — 插件体系(端到端设计、新增插件清单)
└── [[database]] — 数据库层SQLite、迁移、操作方法

核心架构决策

为什么用自定义 TCP 二进制协议而不是 HTTP

内网环境低延迟需求,二进制帧比 HTTP 更省带宽和延迟。帧头仅 10 字节MAGIC+VERSION+TYPE+LENGTHpayload 用 JSON 保持可调试性。

为什么插件配置用 watch channel 而不是 HTTP 轮询?

Server 主动推送配置变更到 Client避免轮询延迟。tokio::watch 保证每个插件总是读到最新配置值,配置下发 → 全链路秒级生效。

为什么嵌入前端而不是独立部署?

include_dir! 编译时打包 web/dist/,部署只需一个 server 二进制文件。SPA fallback 让前端路由(如 /devices)直接返回 index.html

为什么 SQLite 而不是 PostgreSQL

医院内网单机部署场景零外部依赖。WAL 模式 + 64MB 缓存足以支撑数百台终端的并发写入。

为什么三级作用域推送global/group/device

医院按科室分组管理设备。全局策略作为基线,科室策略覆盖特定需求,单设备策略处理例外情况。push_to_targets() 自动解析作用域并过滤在线设备。

技术栈速查

技术
服务端 Rust + Axum + SQLx + SQLite + JWT + Rustls
客户端 Rust + Tokio + sysinfo + windows-rs
协议 自定义 TCP 二进制MAGIC + VERSION + TYPE + LENGTH + JSON payload
前端 Vue 3 + TypeScript + Vite + Element Plus + Pinia + ECharts
构建 Cargo workspace + npm