docs: redact Redis 凭据明文 + 系统分析报告 + wiki 关键数字校正

PP-03 凭据泄露处置:
- 清除 wiki + 2 份历史文档中的 Redis 明文密码与公网 IP(4 文件 5 处)
- wiki 新增安全告警 + 症状导航条目
- 核实降级:泄露旧密码已失效,HMS 连本地 Redis,云端闲置;公网已关闭

系统深度分析(9 维度 + 6 主题多专家组):
- docs/discussions/2026-06-25-analysis/ 新增 7 文件
- 综合 6.8/10,4 CRITICAL,TOP 12 痛点,4 阶段路线图

wiki 关键数字校正(PP-02/05a fix 触发):
- 迁移数 175→176(m20260626_000170)
- 症状导航新增 device_readings 分区硬截止 + claim_next 注入修复条目
This commit is contained in:
iven
2026-06-26 09:07:35 +08:00
parent 57192b2ec0
commit 3351c68d10
11 changed files with 1162 additions and 7 deletions

View File

@@ -4,14 +4,14 @@
## 关键数字
> 最后更新: 2026-06-05 | 数据截止: feat/media-library-banner 分支(用户管理过滤 + 患者摘要过滤 + 微信限流修复
> 最后更新: 2026-06-25 | 数据截止: feat/media-library-banner 分支(Redis 凭据泄露修复 + 系统深度分析多专家组
| 指标 | 值 |
|------|-----|
| Rust crate | 17 个erp-core + 5 基础业务 + erp-health + erp-ai + erp-dialysis + erp-plugin + 7 插件/原型) |
| Rust 源文件 | **726 个**~134,000 行) |
| 数据库表 | 30 基础表 + 49 健康业务表 + 15 AI 表(+4 会话/消息/tool_log/user_profile + 2 知识库 V2 + 3 媒体库/轮播图表 |
| 数据库迁移 | **175**(最新 m20260529_000169 |
| 数据库迁移 | **176**(最新 m20260626_000170 |
| 后端路由 | **385+ 个**11 公开 + 14 FHIR + 2 网关 + ~358 受保护) |
| 核心模块 | 5 基础 (auth/config/workflow/message/plugin) + 3 业务 (health + ai + dialysis) |
| erp-health 实体 | **59 个** Entity33 handler / 57 service / 22 DTO217 文件) |
@@ -159,6 +159,9 @@
| wx_* 患者混入用户管理 | [[erp-auth]] wechat_service | 微信登录创建 `users` 记录 + `patient` 角色,与内部员工混在一起 | **已修复:** `list_users` 新增 `exclude_only_roles` 参数前端默认排除纯患者用户2026-06-05 |
| 小程序上传数据看不到 | [[erp-health]] patient_service | `list_summaries` 无 user_id 过滤,小程序取到别人的 patient 作为 currentPatient | **已修复:** `list_summaries` 增加 `user_id` 参数,小程序传入当前用户 ID 过滤2026-06-05 |
| 真机微信登录"请求过于频繁" | [[erp-server]] rate_limit | 微信登录与密码登录共享 5 次/分限制 + `extract_client_ip` 无代理头返回 "unknown" 导致所有真机共享同一个 key | **已修复:** 微信登录路由独立为 `wechat_routes`30 次/分钟宽松限流2026-06-05 |
| Redis 凭据泄露(明文密码进 git | [[infrastructure]] 凭据管理 | wiki 历史版本明文写 Redis 密码+公网 IP已进 main 主干+origin/main最早 2026-04-18 | **核实降级**:泄露旧密码已失效(当前 requirepass 为另一弱密码未泄露入仓库HMS 当前连 localhost 本地 Redisdev.ps1云端实例闲置无数据无入侵**已处理**:明文 redact 4 处 + 公网访问已关闭2026-06-25**待办(上线前)**:云端换强密码 + compose 配置对齐;**不重写主干历史**(轮换后历史密码无效);**真问题**doc-code driftwiki 说云端实际本地) |
| device_readings 分区硬截止 2026-09 | [[database]] 分区维护 | m000073 只静态建到 2026_08 分区,无 pg_partman/cron 创建未来分区2026-09-01 起 INSERT 抛错 | **已修复:** m20260626_000170 补建 2026_09~2027_06 共 10 个月分区2026-06-26中期需 pg_partman 自动维护 |
| AI 分析队列 claim_next SQL 注入 | [[erp-ai]] analysis_queue | `claim_next``format!` 拼 tenant_id + SELECT/UPDATE 不在事务内无 SKIP LOCKED | **已修复:** 参数化 `$1` + 事务内 `FOR UPDATE SKIP LOCKED` 原子 claim2026-06-26 |
## 模块导航

View File

@@ -32,7 +32,7 @@ tags: [infrastructure, dev-environment, windows, postgresql]
| 服务 | 地址 | 用途 |
|------|------|------|
| PostgreSQL 16 | `postgres://postgres:123123@localhost:5432/erp` | 主数据库 |
| Redis 7 | `redis://:redis_KBCYJk@129.204.154.246:6379` (云端) | 缓存 + 限流 |
| Redis 7 | 连接串通过 `ERP__REDIS__URL` 环境变量注入(云端 Redis**禁止硬编码 host/密码** | 缓存 + 限流 |
| 后端 API | `http://localhost:3000/api/v1` | Axum 服务 |
| 前端 SPA | `http://localhost:5174` | Vite 开发服务器 |
| 微信小程序 | 微信开发者工具 | 患者端小程序(`apps/miniprogram/dist/` |
@@ -54,7 +54,9 @@ psql: `D:\postgreSQL\bin\psql.exe -U postgres -h localhost -d erp`
| `ERP__DATABASE__URL` | `postgres://postgres:123123@localhost:5432/erp` |
| `ERP__JWT__SECRET` | `dev-secret-key-change-in-prod` |
| `ERP__AUTH__SUPER_ADMIN_PASSWORD` | `Admin@2026` |
| `ERP__REDIS__URL` | `redis://:redis_KBCYJk@129.204.154.246:6379` |
| `ERP__REDIS__URL` | `redis://:<密码>@<云端 host>:6379`(开发用 `redis://localhost:6379` 无密码;生产密码经密钥管理注入,**禁止入仓库** |
> ⚠️ **安全告警2026-06-25 凭据泄露事件,已降级)**:本页历史版本曾明文写入 Redis 密码与公网 IP仓库明文已清除。**核实结论**:① 泄露的旧密码 `redis_KBCYJk` 当前已失效(实际 requirepass 为另一值,未在仓库出现);② HMS 运行时连**本地** `localhost:6379``dev.ps1`),云端 Redis 实例闲置、数据为空、无入侵征兆,**公网访问已于 2026-06-25 关闭**。**剩余待办(上线前)**:云端 Redis 换强密码(当前为弱密码)+ `docker-compose.production.yml` 的 `@redis` 假设需对齐「外部云端 Redis」实际架构。历史 commit 仍含旧密码但已无效。详见 [[index]] 症状导航「Redis 凭据泄露」。
| `ERP__WECHAT__APPID` | `wx20f4ef9cc2ec66c5` |
| `ERP__WECHAT__SECRET` | 微信小程序 Secret |
| `ERP__WECHAT__DEV_MODE` | `true`(开发时跳过 jscode2session允许 DevTools 模拟器登录) |