364e688382
主要改动: backend 业务: - feat(error-codes): 统一错误码表 E1011/E1012 拆码 - E1011 AUTH_PASSWORD_WRONG: 本地密码错误 - E1012 AUTH_FIRST_LOGIN_PASSWORD_REQUIRED: 首次登录请先设置密码 - E1015 AUTH_OLD_PASSWORD_REQUIRED: 改密需要旧密码 - E1016 AUTH_OLD_PASSWORD_WRONG: 旧密码错误 - fix(agents): P0 降级放行时,如坐席已注册但未设密码,正确 raise 1012 (修复前会撞 1011 本地密码错误,与场景不符) - feat(approval): 审批模块 (T审批/A审批) - feat(config): approval_template_resource / approval_template_device 配置 - feat(main): /ready, /metrics, /version 端点(K8s 友好) backend 测试: - test(agents): 新增 test_agents.py — 3 个 Fix-4 降级登录测试 - 错误密码拒绝 - 缺密码拒绝 - 正确密码通过 pytest tests/test_agents.py → 3/3 通过 - test(conftest): 模块级 mock + slowapi 限流重置 + UTF-8 patch 解决 Windows pytest GBK 读 .env 失败 + 降级路径无法测试 仓库治理: - chore(gitignore): 排除 .workbuddy/memory/(workbuddy 本地记忆) - chore(docs): 重命名两份 IT 文档(前缀加智能区分版本) 部署与文档: - docs: RELEASE_NOTES_v0.5.0-beta.md / dashboard.html / 需求-发版预览页面 - docs: 部署、架构、PRD、安全、评审报告等同步 v0.5.0-beta - deploy-server: 打包脚本、nginx、docker-compose 版本号 bump 前端 (frontend-h5 / frontend-agent / frontend-admin / frontend-portal): - index.html / package.json 版本号与构建号 bump 自动验收(RELEASE_NOTES L100-104): - [x] pytest tests/test_agents.py -v → 3 passed - [x] grep Bs7ucT backend frontend-h5 frontend-agent → 无输出 - [x] grep AppException(101[123]) backend → 仅 1 处(登录场景 1012) - [ ] npm run build (frontend-h5 / frontend-agent) → 合并后跑 后续: 合并 feature/t-1-t4-merge → main,tag v0.5.0-beta
5.8 KiB
5.8 KiB
智能IT支持服务台 — 安全审计报告
编制日期: 2026-06-14 版本: v1.0
1. 系统概述
| 项目 | 说明 |
|---|---|
| 系统名称 | 智能IT支持服务台 |
| 部署环境 | 企业内网 (10.90.5.110) |
| 访问方式 | 企微工作台应用 / HTTPS |
| 用户规模 | ~6000人 |
2. 安全架构
2.1 认证与授权
| 特性 | 实现方式 | 状态 |
|---|---|---|
| 身份认证 | 企微OAuth2 + JWT Token | ✅ 已实现 |
| OTP双因素 | TOTP (Google Authenticator) | ✅ 已实现 |
| 角色权限 | RBAC (user/agent/admin) | ✅ 已实现 |
| 会话管理 | Redis Token + 过期时间 | ✅ 已实现 |
| 密码策略 | 企微账户策略 | ✅ 依赖企微 |
2.2 网络安全
| 特性 | 实现方式 | 状态 |
|---|---|---|
| HTTPS | Nginx SSL终止 | ✅ 已配置 |
| CORS | 白名单域名 | ✅ 已配置 |
| IP白名单 | Nginx allow/deny | ⚠️ 待配置 |
| API限流 | Nginx rate_limit | ⚠️ 待配置 |
| WAF | 腾讯WAF | ✅ 已接入 |
2.3 数据安全
| 特性 | 实现方式 | 状态 |
|---|---|---|
| 数据库 | PostgreSQL (内网) | ✅ 已实现 |
| 传输加密 | TLS 1.2+ | ✅ 已配置 |
| 敏感脱敏 | 日志脱敏 | ⚠️ 待实现 |
| 备份策略 | 定时备份 | ⚠️ 待配置 |
| 加密存储 | 字段加密 | ❌ MVP不考虑 |
2.4 应用安全
| 特性 | 实现方式 | 状态 |
|---|---|---|
| SQL注入 | SQLAlchemy ORM | ✅ 已防护 |
| XSS | 前端转义 | ✅ 已实现 |
| CSRF | JWT Token | ✅ 已防护 |
| 文件上传 | 类型限制 + 存储隔离 | ✅ 已实现 |
| API认证 | Token验证 | ✅ 已实现 |
3. 审计日志
3.1 已记录事件
| 事件 | 记录位置 | 状态 |
|---|---|---|
| 登录/登出 | 日志 | ✅ |
| 消息发送 | 数据库 + 日志 | ✅ |
| 会话创建/关闭 | 数据库 + 日志 | ✅ |
| 管理员操作 | 日志 | ✅ |
| 配置变更 | 数据库 | ✅ |
3.2 待记录事件
| 事件 | 优先级 | 说明 |
|---|---|---|
| 敏感数据查询 | P1 | 查询用户信息、联系方式 |
| 角色变更 | P1 | 管理员分配权限 |
| 系统配置变更 | P1 | 功能开关、集成配置 |
| API调用统计 | P2 | 接口调用频率 |
| 异常登录 | P1 | 异地登录、频繁失败 |
4. 安全检查项
4.1 MVP必须通过
| # | 检查项 | 当前状态 | 建议 |
|---|---|---|---|
| 1 | 企微OAuth2认证 | ✅ | - |
| 2 | JWT Token有效期 | ✅ 2小时 | - |
| 3 | OTP绑定/验证 | ✅ | - |
| 4 | 角色权限控制 | ✅ | - |
| 5 | 数据库内网访问 | ✅ | - |
| 6 | HTTPS全站加密 | ✅ | - |
| 7 | 日志脱敏 | ⚠️ | 上线前完成 |
| 8 | IP访问限制 | ⚠️ | 上线前完成 |
4.2 生产建议项
| # | 检查项 | 优先级 | 说明 |
|---|---|---|---|
| 9 | API限流 | P2 | 防DDoS |
| 10 | 操作审计日志 | P2 | 合规要求 |
| 11 | 数据库定时备份 | P2 | 灾备 |
| 12 | 入侵检测 | P3 | 长期 |
5. 消息状态功能(待实现)
5.1 需求
| 功能 | 说明 | 优先级 |
|---|---|---|
| 已读未读状态 | 每条消息独立跟踪已读/未读 | P2 |
| 已读时间戳 | 记录何时已读 | P2 |
| 已读回执推送 | WS实时推送已读状态 | P2 |
| 未读计数 | 会话未读消息数 | P2 |
5.2 现有代码
# 当前 Message 模型
is_read: bool # 单字段,只能记录"是否已读"
问题:多用户场景下无法区分用户独立已读状态
5.3 实现方案
# 新增 MessageStatus 表
class MessageStatus(Base):
message_id: str
user_id: str # 读取者ID
user_type: str # employee/agent
status: Enum # sent/delivered/read
read_at: datetime
5.4 API设计
| API | 方法 | 说明 |
|---|---|---|
/api/messages/{id}/read |
PUT | 标记消息已读 |
/api/messages/{id}/status |
GET | 获取消息状态 |
/api/conversations/{id}/unread-count |
GET | 未读计数 |
6. 风险评估
| 风险 | 等级 | 缓解措施 |
|---|---|---|
| 企微API限制 | 中 | 保持降级通道 |
| 内网暴露面 | 中 | IP白名单 |
| 社工攻击 | 低 | OTP + 安全培训 |
| 数据泄露 | 低 | 内网 + HTTPS |
7. 架构优化(2026-06-14 讨论)
7.1 高可用方案
| 特性 | 状态 | 说明 |
|---|---|---|
| restart: unless-stopped | ✅ 已配置 | 容器崩溃自动重启 |
| healthcheck 后端 | ✅ 已配置 | curl /health |
| healthcheck nginx | ✅ 已配置 | curl /itdesk/health |
| healthcheck postgres | ✅ 已配置 | pg_isready |
| healthcheck redis | ✅ 已配置 | redis-cli ping |
7.2 AI Gateway 设计
| 特性 | 状态 | 说明 |
|---|---|---|
| 内部抽象 | ⚠️ 待实现 | 抽离 AI 层为 Gateway |
| 多模型支持 | ⚠️ 待实现 | dify/wingman/其他 |
| 热切换 | ⚠️ 待实现 | 配置化切换 |
| 降级机制 | ⚠️ 待实现 | 失败自动切换 |
设计目标:
- 统一入口,支持 dify/wingman/其他模型
- 配置化启用/禁用,无需改代码
- 失败自动降级到备用模型
8. 结论
8.1 MVP可上线条件
- 企微OAuth2认证
- OTP双因素
- 角色权限
- HTTPS
- Docker健康检查+自动重启
- 日志脱敏(上线前完成)
- IP访问限制(上线前完成)
- AI Gateway(V2前完成)
8.2 下一步行动
| 行动 | 负责人 | 截止 | 状态 |
|---|---|---|---|
| 日志脱敏 | 开发 | 上线前 | pending |
| IP白名单 | 运维 | 上线前 | pending |
| AI Gateway | 开发 | V2前 | pending |
| 消息状态功能 | 开发 | V2 | pending |
编制人: 宋献 审核人: 待定 更新日期: 2026-06-14