白名单回答的是「谁」,审计问的是「为什么」。当两者不再是同一个问题,权限模型就该换主键了。
目录
问题
我在一家全球化广告平台做数据合规与架构治理,参与过多轮外部审计。审计官问的问题惊人地一致:这个人为什么能看到这份数据?谁批准的?批了多久?他在这段时间里到底看没看?
而我们的权限系统——无论是早年的 ACL 白名单,还是后来整理过的 RBAC——只能回答第一个问题的一半:「他在名单上」。至于为什么在名单上、什么时候进去的、还该不该在,系统里没有记录,只能翻聊天记录和审批邮件。
这不是工程质量问题,而是模型问题。ACL 和 RBAC 的主键是「人」或「角色」,天然回答「谁能看」;审计问的却是「为什么能看」。两个问题不再是同一个问题,再多的补丁也补不上,得换主键。
这是「架构治理」系列的第一篇,先说权限,因为它是数据治理的入口:连访问理由都说不清,后面的分级、隔离、留痕都会失去锚点。
约束
换模型的想法并不新鲜,难的是约束。我们划了三条底线。
第一,不能拖慢申请。业务同事对权限系统的全部感受就是「要等多久」。一个更严谨但更慢的模型,很快会被绕行方案架空:共享账号、导出表格、口头授权。治理最怕的不是不完美,而是被绕过。
第二,存量不能一刀切。系统里积累了大量历史授权,相当一部分没有申请记录,也没人记得当初为什么开。全部收回再重新申请,业务会停摆,我们也会被补申请的工单淹没。
第三,要能被第三方验证。审计不会相信口头描述的流程,他们要的是从任意一条访问日志出发,能回溯到申请、审批、期限和分级的完整证据链,且不需要工程师在旁边解释。
三条约束互相拉扯:严谨会拖慢申请,兼容存量会削弱可验证性。方案就是在三者之间找那个还能站住的位置。
方案
核心动作只有一个:把「用途」提升为权限的一等公民。
在旧模型里,一条权限是「某人对某资源有读权限」。在新模型里,一条权限是「某人因为某个声明的用途,在某个期限内,经过某级审批,对某类分级数据有读权限」。人仍然在里面,但不再是主键,用途才是。
围绕这个主键,整条链路重新串起来。
flowchart LR A["申请:声明用途与期限"] --> B["数据分级判定"] B --> C["分层审批"] C --> D["带期限授权(凭证)"] D --> E["访问留痕(凭证 ID 进日志)"] E --> F["到期自动回收"] F -. 续期需重新声明 .-> A
申请即声明用途与期限
申请单上不再是「我要某张表的权限」,而是「我要为某个业务目的、在某个时间段内访问哪一类数据」。用途从有限的枚举里选,而不是自由文本,这样后面才能自动判定、审计时才能聚合。期限有上限,默认值偏短。
数据分级决定审批层级
数据在入库时已经打了分级标签。申请进来后,系统按「用途 × 分级」查表,决定要走几层审批、由谁批。低敏数据配常规用途可以自动通过,高敏数据配非常规用途才需要人工介入。这一步是不拖慢申请的关键:大部分申请根本不需要等人。
授权自带期限,访问带凭证留痕
审批通过生成的不是一条永久的 ACL 条目,而是一张带到期时间的凭证,上面写着用途、分级、审批人、有效期,它自己就是一份可以拿给审计看的证据。数据访问层校验凭证而不是名单,每次访问记录凭证 ID,访问日志天然和申请、审批关联,不需要事后拼接。
到期自动回收
凭证过期即失效,续期要重新声明,这也是一次「你还需要这个吗」的强制回顾。回收不是人工清理,而是系统的默认状态。
存量迁移用了一个折中:历史授权自动转换为「历史用途」凭证,给一个较长但有限的宽限期,到期前提醒持有人重新声明真实用途,不声明就自然过期。没有一刀切,但终局一致。
取舍
| 对比维度 | 以人为主键 | 以角色为主键 | 以用途为主键 |
|---|---|---|---|
| 表达力 | 只能表达「谁」 | 能表达「哪类人」 | 能表达「谁、为何、多久」 |
| 审计友好度 | 低:无法解释理由 | 中:角色本身成为黑盒 | 高:凭证即证据链 |
| 申请效率 | 快:加名单即可 | 快:挂角色即可 | 中:需多声明一步,但大部分可自动审批 |
| 存量迁移难度 | 无需迁移 | 需梳理角色 | 高:需宽限期过渡 |
以角色为主键在组织稳定时很好用,可一旦角色膨胀,角色本身就成了新的黑盒:审计问「这个角色为什么有这个权限」,答案往往还是「历史原因」。
结果
最直接的变化是审计的对话方式变了。以前审计官拿着一条访问记录问「这是谁批的」,我们要翻好几个系统;现在他拿着凭证 ID 自己能查完整条链,问题从「解释一下」变成了「确认一下」。可解释性不再靠事后写文档,而是系统的一个属性。
第二个变化是自动化的空间打开了。用途和分级都是结构化的,「哪些组合可以自动审批」就成了一张可以持续调整的策略表,而不是审批人脑子里的经验。我们也能看到哪类申请最多、哪类被拒最多、哪类凭证到期后从未续期,最后一种基本等于「当初就不该开」。
第三个变化比较隐性:申请人开始真的思考「我要这个数据做什么」。用途枚举里的「探索性分析」一开始被大量选用,后来我们把它的默认期限缩得很短,选用率自然下降,因为说清楚用途反而更省事。
代价也有。凭证过期导致的「昨天还能跑今天跑不了」是最多的抱怨来源,提前提醒和一键续期缓解了一部分,但我不打算完全消除,那是模型在正常工作。
可迁移的经验
- 先问审计要什么,再选主键。主键决定了模型能回答什么问题。需要回答「为什么」,主键就不该是「谁」。
- 用枚举换自动化。用途、分级、期限结构化之后,大部分审批可以变成查表。自由文本看似灵活,实际把判断成本推给了审批人,也让审计无法聚合。
- 让证据在访问时产生,而不是事后拼接。凭证进访问日志这一步成本很低,但它决定了证据链是否需要人来解释。
- 存量用「宽限期加自然过期」而不是「一刀切」。给历史授权一个体面的退出方式,终局一致就够了。
- 接受权限变多。可解释性是有体积的。每条权限都能说清来龙去脉,比一张干净但没人敢动的名单更值得维护。
觉得有用?通过 RSS 订阅 获取后续的技术文与案例更新。