# 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 强制校验后,再审批上线外部客户入口。