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 为主干 + ABAC 做细粒度 + MAC 兜底 + DAC 限内部 RBAC:岗位权限基线 ABAC:动态条件判断 MAC:敏感数据兜底 DAC:内部共享 访问请求决策顺序(示例) ① 请求到达 → ② RBAC 判断角色是否具备基础权限 → ③ ABAC 校验科室/时间/敏感级别等条件 → ④ MAC 检查安全标签是否越级 → ⑤ 全部通过则放行,任一失败则拒绝并记录审计日志

五、四模型对比与医疗适用性判断

把四种模型放在医疗场景的同一张“决策桌”上,可以从授权粒度、管理成本、灵活性、防泄露能力、审计友好度五个维度比较:

维度 DAC MAC RBAC ABAC
授权粒度 文件/对象级 标签级 角色级 属性级(最细)
管理成本 低 高 中 高
灵活性 高但不可控 低 中 高
防泄露能力 弱 强 中 强(依赖策略质量)
审计友好度 差 好 好 中(策略可解释性挑战)
医疗典型用途 内部资料共享 高敏感病历兜底 日常岗位授权 急诊/会诊/科研动态授权

从工程落地角度看,纯 RBAC 是大多数医院 EMR 的起点,因为它能快速覆盖“医生看本科室患者、护士执行医嘱”这类高频场景。但当出现以下三类需求时,必须引入 ABAC 或 MAC 补位:

  • 急诊破例:非值班医师在抢救时需临时读取患者病历。RBAC 无法表达“时间 + 地点 + 紧急标记”的组合条件,ABAC 可以用“环境.紧急状态 == true 且 操作 == 读取”放行,同时强制记录审计。
  • 跨科会诊:肿瘤科医师需要读取影像科报告。RBAC 若为每个跨科组合建角色,角色数量会爆炸;ABAC 用“主体.科室 ∈ 客体.授权会诊科室列表”一条策略即可覆盖。
  • 科研脱敏:科研人员只能读取去标识化数据。这既需要 RBAC 限定“科研人员”角色,又需要 ABAC 校验“客体.脱敏状态 == 已脱敏”,必要时再用 MAC 标签阻止原始数据外流。
实践建议:在医疗数据访问控制工程中,不要试图用单一模型“一招通吃”。推荐以 RBAC 建立岗位权限基线,用 ABAC 处理动态上下文,用 MAC 对高敏感数据做强制兜底,DAC 仅限非敏感内部协作。四者叠加时,务必明确决策顺序(通常先 RBAC 后 ABAC 再 MAC),并保证每次拒绝都写入审计日志,否则事后无法追溯“谁在什么条件下被拒绝”。

最后需要强调:模型选择不是技术偏好问题,而是风险与效率的平衡。精神科、感染科、基因数据等场景应优先保证防泄露能力,倾向 MAC + ABAC;而普通门诊、护理记录等高频低敏场景,应以 RBAC 为主,避免过度管控拖慢临床效率。理解每种模型的“能力边界”,才能在真实医疗系统中做出可落地、可审计、可维护的访问控制设计。