Files
wecom_it_smart_desk/docs/安全/secret-管理.md
T
Claude 3735dc0367 feat(security): P0 安全止血 - WS token 改 header + 坐席本地密码
【workbuddy 推送 2026-06-14,任务 #10】

修复:
- P0-#4 WS token 泄露:服务端 ws.py 优先从 Authorization: Bearer header 取,
  query param 仅作向后兼容降级路径(h5_websocket_endpoint 同)
- P0-#5 坐席本地密码:Agent 模型加 password_hash 字段(bcrypt),
  坐席登录增加 password 字段(企微验证失败时备用),
  新增 POST /agents/password 端点修改密码,
  alembic 008 迁移脚本

新增/变更:
M  backend/app/api/agents.py              (+67 行,登录 password 验证 + 改密端点)
M  backend/app/api/ws.py                  (~+30 行,header 优先 + query 降级)
M  backend/app/models/agent.py            (+10 行,password_hash 字段)
M  backend/app/schemas/agent.py           (+7 行,password 字段)
M  frontend-agent/.../useWebSocket.ts     (+5 行,Authorization header)
A  backend/alembic/versions/008_add_agent_password.py
A  docs/安全/secret-管理.md               (P0-#1 长期方案规划)

【评审遗留 5 项,详见 docs/评审报告/workbuddy-2026-06-14-P0安全.md】
- [P0-#4-ws.ts] 浏览器 WebSocket API 不支持自定义 header,需改 Sec-WebSocket-Protocol
- [P0-#4-nginx] nginx access_log 没关闭,token 仍可能经 access_log 泄露
- [P0-#5-type] model Mapped[str] 严格模式下为 None 会报错,应改 Optional
- [P0-#5-fall] 企微降级放行路径不强制 password 验证,反削弱 P0-#5
- [P0-#5-dep]  requirements.txt 缺 passlib 依赖,部署会 ImportError

【推 Gitea】
卡 #8: MariaDB 套件未装,Gitea 未启动。本次 commit 暂存本地,
Gitea 起来后一次 git push -u origin main 推送供 workbuddy 二次评审。
2026-06-14 19:32:36 +08:00

82 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# IT智能服务台 - Secret 管理方案
**版本**: 1.0
**更新日期**: 2026-06-14
**状态**: 规划中
---
## 一、背景
当前 `.env` 文件中存储了敏感信息:
- WECOM_SECRET(企微应用密钥)
- WECOM_ENCODING_AES_KEY(消息加密密钥)
- DIFY_API_KEYDify API 密钥)
- POSTGRES_PASSWORD(数据库密码)
- REDIS_PASSWORDRedis 密码)
**风险**
- `.env` 文件在 Git 仓库中(虽然被 .gitignore 排除,但部署时需手动复制)
- 服务器上 `.env` 文件可能被未授权访问
- 密钥轮换需要手动修改文件和重启服务
---
## 二、长期方案
### 方案对比
| 方案 | 复杂度 | 安全性 | 适用场景 |
|------|--------|--------|----------|
| **NAS Vault** | 低 | 中 | 有 NAS设备 |
| **Server Keyring** | 低 | 中 | Linux 服务器 |
| **Docker Secrets** | 中 | 高 | K8s/ Swarm |
| **HashiCorp Vault** | 高 | 高 | 企业级 |
### 推荐:NAS Vault + Server Keyring
#### 方案1NAS Vault(当前可用)
```bash
# 在 NAS 上创建加密文件
/volume1/docker/wecom-it-desk/secrets/.env.encrypted
# 启动时解密
docker run --env-file <(gpg -d /volume1/docker/wecom-it-desk/secrets/.env.encrypted) ...
```
#### 方案2Server KeyringLinux
```bash
# 使用 keyring 工具
keyring set wecom-it-desk WECOM_SECRET
keyring get wecom-it-desk WECOM_SECRET
```
---
## 三、短期止血
| 操作 | 说明 |
|------|------|
| 限制 .env 文件权限 | `chmod 600 .env` |
| 不在 URL 中暴露 token | 已完成(P0-#4 |
| 定期轮换密钥 | 建议每季度 |
| 审计日志 | 规划中 |
---
## 四、实施计划
| 阶段 | 内容 | 优先级 |
|------|------|--------|
| MVP | 当前方案 + 限制文件权限 | P0 |
| V1 | 迁移到 NAS Vault | P2 |
| V2 | 迁移到 HashiCorp Vault | P3 |
---
## 五、相关文档
- `.env.example` - 环境变量模板(含 TODO 注释)
- `docs/安全审计报告.md` - 安全审计记录