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

6.0 KiB
Raw Blame History

OneOS 生产数据库只读审计报告

审计时间2026-07-14

1. 执行边界

  • 连接路径:本机 → SSH 加密隧道 → 当前车辆中台 ECS → 阿里云 RDS 内网地址。
  • 所有查询会话均执行 SET SESSION TRANSACTION READ ONLY
  • 单条查询设置 MAX_EXECUTION_TIME=1000010 秒)。
  • 仅执行元数据和聚合查询,未读取密码、客户姓名、手机号、银行账号等明细。
  • 未执行任何 INSERT、UPDATE、DELETE、DDL 或权限变更。

2. 账号权限核验

当前从 ln-bi 部署配置取得的 RDS 账号并不是账号级只读:

  • ln_asset_managementry-cloud 等多个业务库拥有 ALL PRIVILEGES
  • 还拥有 PROCESSREPLICATION SLAVEREPLICATION CLIENTXA_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_mobileutf8mb4_unicode_ci
  • sys_user.user_name/phonenumberutf8mb4_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. 当前可采用的权限口径

在业务确认和异常修复前,外部客户范围必须同时满足:

车辆有效且 VIN 非空
聚合记录有效
最新有效交车单已完成
该交车单不存在正式完成的还车任务
客户档案有效
合同有效
聚合客户 ID 非空
合同有效客户非空
聚合客户 = COALESCE(合同丙方客户, 合同主客户)
同一车辆不存在多客户冲突

不满足任一条件的记录进入隔离清单,外部查询失败关闭。

6. 下一步

  1. 创建真正的最小权限 RDS 只读账号,替换当前高权限账号。
  2. 由业务人员复核 26 条隔离关系和 1 组重复聚合记录。
  3. 不修改 ln-asset-management;将还车草稿提前写聚合字段记录为上游风险,数据中台只读取正式交还车任务状态。
  4. 以 613 条可发布关系运行影子 Scope与合同和交还车样本对账。
  5. 完成客户身份入口与所有客户 API 的 Scope 强制校验后,再审批上线外部客户入口。