3. 访问控制模型基础
访问控制模型回答的是一个看似简单、但在医疗场景中极其复杂的问题:“谁,在什么条件下,可以对哪条数据做什么?” 医疗数据的特殊性在于,它既是高度敏感的个人隐私,又必须在急救、会诊、科研、医保结算等场景中被多方高频访问。因此,没有一种模型能单独解决所有问题,工程上通常是“以某模型为主、其他模型补位”的组合策略。本节先厘清四种经典模型的核心机制,再落到医疗场景的适用性判断上。
一、自主访问控制(DAC):资源所有者说了算
DAC(Discretionary Access Control)的核心思想是:资源的所有者可以自主决定把访问权限授予谁。在类 Unix 系统中,文件属主通过 chmod 设置读、写、执行权限,就是最典型的 DAC 实现。医疗场景中,医生把自己整理的病例文档共享给同科室同事,也属于 DAC 思路。
DAC 的优点是灵活、低管理成本,适合协作频繁、边界模糊的场景。但它的致命弱点在医疗领域被放大:权限可以“传染”。A 医生把含患者身份信息的文件共享给 B,B 又转给 C,原始所有者既无法追踪,也无法收回。此外,DAC 无法表达“即使你是所有者,也不能把精神科病历给非精神科人员看”这类强制约束。因此,DAC 在医疗中通常只用于非敏感、低风险的内部协作资料,绝不能作为电子病历(EMR)主访问控制模型。
二、强制访问控制(MAC):系统规则高于个人意愿
MAC(Mandatory Access Control)的核心思想是:访问决策由系统根据安全标签强制执行,用户和资源所有者都无权绕过。它给主体(用户/进程)和客体(文件/记录)分别打上安全级别标签,如“公开、内部、秘密、机密”,访问必须满足“主体级别 ≥ 客体级别”且“类别集合包含客体类别”。
在医疗中,MAC 的典型映射是数据分级 + 科室/项目类别。例如,一份艾滋病患者病历可标记为“机密 + 感染科”,只有具备“机密”级别且属于感染科或经授权的疾控人员才能读取。MAC 的优势是防泄露能力强、策略不可被普通用户篡改,适合处理高敏感数据。但它的代价是灵活性差、管理成本高:每次新增科室、新增数据类别,都要重新设计标签体系;急诊跨科调阅时,严格的 MAC 可能直接阻断救治。因此,MAC 更适合作为底层兜底策略,而不是日常访问的主要入口。
三、基于角色的访问控制(RBAC):按岗位授权
RBAC(Role-Based Access Control)的核心思想是:权限不直接授予用户,而是授予角色;用户通过被分配角色来获得权限。这解决了 DAC 中“逐人授权”的爆炸式管理问题。医疗场景中,角色天然存在:主治医师、住院医师、护士、药师、检验技师、医保审核员、科研人员等。
一个简化的 RBAC 配置示例(以某医院 EMR 为例):
角色:主治医师
权限:读取本科室患者病历、开具医嘱、查看检验报告
角色:护士
权限:读取本病区患者基本信息、执行医嘱、记录生命体征
角色:科研人员
权限:读取脱敏后的数据集,不可读取患者身份字段
用户-角色分配:
张医生 → 主治医师(心内科)
李护士 → 护士(心内科一病区)
RBAC 的优点是管理清晰、易于审计,能快速回答“谁有权限”。但它也有明显短板:无法表达细粒度条件。例如,“主治医师只能在工作时间、且只能访问自己主管的患者”这一规则,纯 RBAC 很难表达,通常需要引入“角色 + 上下文”的扩展。此外,角色爆炸(role explosion)是大型医院常见问题:每个科室、每个病区都建一套角色,维护成本迅速上升。
四、基于属性的访问控制(ABAC):用属性与策略动态判断
ABAC(Attribute-Based Access Control)的核心思想是:访问决策由主体属性、客体属性、环境属性和操作属性共同决定,通过策略规则动态计算。它不再依赖静态角色,而是用“属性 + 策略”描述条件。例如:
策略:允许访问患者病历
条件:
主体.科室 == 客体.所属科室
或 主体.角色 == "急诊医师" 且 环境.时间 在 值班时段
且 客体.敏感级别 <= 主体.可访问级别
且 操作 == "读取"
ABAC 的表达能力最强,能自然支持“急诊破例”“跨科会诊”“科研脱敏”等复杂医疗规则。它的代价是策略设计复杂、性能开销大、审计难度高:当策略数量达到数百条时,冲突检测和可解释性成为工程难题。因此,ABAC 适合作为精细化补充层,用于处理 RBAC 覆盖不到的动态、上下文相关场景。
五、四模型对比与医疗适用性判断
把四种模型放在医疗场景的同一张“决策桌”上,可以从授权粒度、管理成本、灵活性、防泄露能力、审计友好度五个维度比较:
| 维度 | DAC | MAC | RBAC | ABAC |
|---|---|---|---|---|
| 授权粒度 | 文件/对象级 | 标签级 | 角色级 | 属性级(最细) |
| 管理成本 | 低 | 高 | 中 | 高 |
| 灵活性 | 高但不可控 | 低 | 中 | 高 |
| 防泄露能力 | 弱 | 强 | 中 | 强(依赖策略质量) |
| 审计友好度 | 差 | 好 | 好 | 中(策略可解释性挑战) |
| 医疗典型用途 | 内部资料共享 | 高敏感病历兜底 | 日常岗位授权 | 急诊/会诊/科研动态授权 |
从工程落地角度看,纯 RBAC 是大多数医院 EMR 的起点,因为它能快速覆盖“医生看本科室患者、护士执行医嘱”这类高频场景。但当出现以下三类需求时,必须引入 ABAC 或 MAC 补位:
- 急诊破例:非值班医师在抢救时需临时读取患者病历。RBAC 无法表达“时间 + 地点 + 紧急标记”的组合条件,ABAC 可以用“环境.紧急状态 == true 且 操作 == 读取”放行,同时强制记录审计。
- 跨科会诊:肿瘤科医师需要读取影像科报告。RBAC 若为每个跨科组合建角色,角色数量会爆炸;ABAC 用“主体.科室 ∈ 客体.授权会诊科室列表”一条策略即可覆盖。
- 科研脱敏:科研人员只能读取去标识化数据。这既需要 RBAC 限定“科研人员”角色,又需要 ABAC 校验“客体.脱敏状态 == 已脱敏”,必要时再用 MAC 标签阻止原始数据外流。
最后需要强调:模型选择不是技术偏好问题,而是风险与效率的平衡。精神科、感染科、基因数据等场景应优先保证防泄露能力,倾向 MAC + ABAC;而普通门诊、护理记录等高频低敏场景,应以 RBAC 为主,避免过度管控拖慢临床效率。理解每种模型的“能力边界”,才能在真实医疗系统中做出可落地、可审计、可维护的访问控制设计。