Files
lingniu-vehicle-ingest/vehicle-data-platform/docs/oneos-production-audit-report.md

136 lines
6.0 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.
# OneOS 生产数据库只读审计报告
审计时间2026-07-14
## 1. 执行边界
- 连接路径:本机 → SSH 加密隧道 → 当前车辆中台 ECS → 阿里云 RDS 内网地址。
- 所有查询会话均执行 `SET SESSION TRANSACTION READ ONLY`
- 单条查询设置 `MAX_EXECUTION_TIME=10000`10 秒)。
- 仅执行元数据和聚合查询,未读取密码、客户姓名、手机号、银行账号等明细。
- 未执行任何 INSERT、UPDATE、DELETE、DDL 或权限变更。
## 2. 账号权限核验
当前从 `ln-bi` 部署配置取得的 RDS 账号并不是账号级只读:
-`ln_asset_management``ry-cloud` 等多个业务库拥有 `ALL PRIVILEGES`
- 还拥有 `PROCESS``REPLICATION SLAVE``REPLICATION CLIENT``XA_RECOVER_ADMIN` 等全局权限。
本次审计依靠会话只读保护,没有使用这些写权限。但该账号不适合作为车辆数据中台的生产同步账号,也不应继续以“只读账号”管理。
建议另建独立账号,只授予必要表的 `SELECT`;如需最小到列级,优先建立脱敏只读视图并仅授权视图。权限调整属于数据库写操作,需另行审批。
## 3. 数据质量基线
### 车辆档案
| 指标 | 结果 |
| --- | ---: |
| 有效车辆 | 1,209 |
| VIN 缺失 | 0 |
| VIN 重复组 | 0 |
| 车牌缺失 | 0 |
车辆身份基础质量良好,当前 1,209 台有效车辆均有 VIN 和车牌,标准化 VIN 后无重复。
生产库尚未给 `vehicle_info.vin` 建立索引或唯一约束。当前数据满足增加唯一索引的前置条件,但正式 DDL 前仍要确认历史/逻辑删除记录及业务兼容性。
### 客户账号
| 指标 | 结果 |
| --- | ---: |
| 有效客户 | 335 |
| `customer_info.id = sys_user.user_id` 的账号 | 0 |
| `user_type=customer` 的账号 | 0 |
| 客户编码与系统用户名匹配 | 0 |
| 联系手机号与系统账号手机号匹配 | 4 |
| 客户编码缺失 | 7 |
结论客户账号体系尚未形成不能通过“补角色”直接开放。4 个手机号匹配仅能作为待人工核验线索,不能自动认定为客户账号或覆盖现有用户。
两个库的字符排序规则不同:
- `customer_info.customer_code/contact_mobile``utf8mb4_unicode_ci`
- `sys_user.user_name/phonenumber``utf8mb4_0900_ai_ci`
跨库字符串直接等值 JOIN 会报 collation 冲突。正式关联应优先使用稳定 ID补偿审计若按编码/手机号匹配,需要显式统一 collation。
### 当前客户车辆候选范围(事务事实口径)
候选条件:每车最新有效交车单已完成(`delivery_status IN (2,3)`),且该交车单不存在正式完成的还车任务(`status IN (2,3,5)`)。聚合表仅用于客户归属交叉校验,不使用可能被还车草稿提前写入的 `last_return_time` 判断生命周期。
| 指标 | 结果 |
| --- | ---: |
| 候选记录 | 639 |
| 候选车辆 | 639 |
| 可安全发布记录 | 613 |
| 应隔离记录 | 26 |
隔离原因(可能重叠):
| 原因 | 数量 |
| --- | ---: |
| 聚合记录或客户 ID 缺失 | 17 |
| 聚合客户与合同有效客户不一致 | 9 |
| 车辆档案不可用 | 0 |
| VIN 缺失 | 0 |
因此第一版客户车辆 Scope 最多只能发布 613 条已校验关系,其余 26 条必须隔离,不能为了数量完整而放宽权限。
与旧聚合时间口径相比,事务事实口径排除 16 台12 台已有正式还车事实、3 台最新交车尚未完成、1 台没有交车事实;另有 8 台进入事务候选但不在旧聚合候选,其中 4 台缺聚合记录并会继续 fail-closed 隔离。该差异证明 `last_delivery_time/last_return_time` 不适合作为外部授权生命周期真值。
### 租赁聚合与历史一致性
| 指标 | 结果 |
| --- | ---: |
| 有效当前聚合记录 | 831 |
| 无任何交还车时间 | 13 |
| 已交车、无还车时间 | 617 |
| 还车后再次交车 | 30 |
| 已还车 | 171 |
| 聚合表与最新历史关键字段不一致 | 325 |
| 违反“一车一条聚合记录”的车辆组 | 1 |
| 当前候选范围内重复车辆 | 0 |
325 条差异说明 `vehicle_lease_order_record_log` 不能简单取最大 ID 当作当前真值1 组重复聚合记录也意味着现有 `selectOne(vehicle_id)` 存在运行时异常风险。正式修复前需要对异常组做明细复核,但明细不写入本报告。
## 4. 索引结论
生产库已有车牌、vehicleId 和部分状态索引,但缺少:
- `vehicle_info.vin` 索引/唯一约束;
- `vehicle_lease_order_record.customer_id` 的客户范围查询索引;
- `vehicle_lease_order_record.vehicle_id` 唯一约束;
- `vehicle_status.vehicle_id` 唯一约束;
- 合同有效客户查询所需索引。
当前数据量不大。2026-07-14 事务事实影子查询耗时约 93 ms主交车表预估扫描 2,320 行,其余关联均使用 `eq_ref/ref`;两分钟一次的单次批量查询压力可控。后续数据增长后仍需监控执行时间,索引 DDL 必须单独审批并用 `EXPLAIN`、影子查询和回滚方案验证。
## 5. 当前可采用的权限口径
在业务确认和异常修复前,外部客户范围必须同时满足:
```text
车辆有效且 VIN 非空
聚合记录有效
最新有效交车单已完成
该交车单不存在正式完成的还车任务
客户档案有效
合同有效
聚合客户 ID 非空
合同有效客户非空
聚合客户 = COALESCE(合同丙方客户, 合同主客户)
同一车辆不存在多客户冲突
```
不满足任一条件的记录进入隔离清单,外部查询失败关闭。
## 6. 下一步
1. 创建真正的最小权限 RDS 只读账号,替换当前高权限账号。
2. 由业务人员复核 26 条隔离关系和 1 组重复聚合记录。
3. 不修改 `ln-asset-management`;将还车草稿提前写聚合字段记录为上游风险,数据中台只读取正式交还车任务状态。
4. 以 613 条可发布关系运行影子 Scope与合同和交还车样本对账。
5. 完成客户身份入口与所有客户 API 的 Scope 强制校验后,再审批上线外部客户入口。