3、访问控制模型:RBAC、ABAC、MAC、DAC

访问控制模型,说白了就是「谁在什么条件下能碰什么数据」的一套规则。我这些年做数据湖项目,见过太多因为模型选错导致权限炸裂的案例。今天咱们把这四种模型掰开揉碎讲清楚。

核心观点:没有银弹。每种模型都有自己的适用场景,混搭才是常态。

3.1 自主访问控制(DAC)

DAC 是最古老也最直观的模型。数据的所有者自己决定谁能访问。就像你买了套房,钥匙想给谁就给谁。

在文件系统里很常见——Linux 的 chmod、Windows 的 NTFS 权限,都是 DAC 的体现。我记得刚入行时,公司用 NFS 共享数据,每个部门自己设权限,结果乱成一锅粥。

优点:灵活、简单、用户自主权高。

缺点:权限分散、难以审计、容易泄露。

我曾经见过一个金融客户,分析师为了图方便,把整个 Hive 表设成 777 权限。结果实习生误删了分区表,三天数据恢复不回来。DAC 在数据湖里,我建议只用在个人沙箱环境。

3.2 强制访问控制(MAC)

MAC 走的是另一个极端——系统说了算,用户没得选。每个主体(用户/进程)和客体(数据/文件)都有安全标签,系统根据预定义规则决定是否放行。

典型的例子是 SELinux 和军事系统的多级安全(MLS)。标签分等级:绝密、机密、秘密、公开。用户只能读比自己等级低的数据,写只能往同级或更高级写。

操作 主体等级 客体等级 结果
读 机密 秘密 ✅ 允许(向下读)
读 机密 绝密 ❌ 拒绝(向上读)
写 机密 秘密 ❌ 拒绝(向下写)
写 机密 绝密 ✅ 允许(向上写)

MAC 安全,但太死板。数据湖场景下,我很少见到纯 MAC 的落地。除非是政府、军工这类对数据流向有严格管控的行业。

3.3 基于角色的访问控制(RBAC)

RBAC 是目前企业里最主流的模型。核心思路是:用户不直接关联权限,而是通过「角色」这个中间层来间接获得权限。

你想想看,一个数据湖里可能有几百个用户,如果每个人单独配权限,运维人员会疯掉。RBAC 把权限抽象成角色——比如「数据工程师」「数据分析师」「数据科学家」——然后把人塞进角色里。

# 伪代码示例:RBAC 权限判断
user = get_user("张三")
roles = user.get_roles()  # ["data_engineer", "lake_admin"]
for role in roles:
    permissions = role.get_permissions()
    if "s3://data-lake/raw/*" in permissions:
        return True
return False

RBAC 的三个核心原则:

  • 角色继承:高级角色包含低级角色的权限
  • 最小权限:角色只给完成工作所需的最小权限集
  • 职责分离:敏感操作需要多个角色共同完成

我个人习惯在数据湖里先建 5-7 个基础角色:lake_admin、data_owner、data_engineer、data_analyst、data_scientist、auditor、guest。然后根据业务需求微调。角色太多反而难管理。

RBAC 的缺点也很明显——角色爆炸。当业务复杂到一定程度,角色数量会失控。我在一个电商客户那里见过 200 多个角色,连管理员都搞不清每个角色到底能干啥。

3.4 基于属性的访问控制(ABAC)

ABAC 是解决 RBAC 角色爆炸的利器。它不再依赖固定的角色,而是根据一组「属性」动态计算权限。

属性分四类:

  • 主体属性:用户部门、职级、地理位置、认证方式
  • 客体属性:数据敏感等级、数据域、创建时间、存储位置
  • 环境属性:访问时间、网络 IP、设备类型、风险等级
  • 操作属性:读、写、删除、导出、共享
# ABAC 策略示例(类 AWS IAM Policy 语法)
{
  "Effect": "Allow",
  "Action": ["s3:GetObject"],
  "Resource": "arn:aws:s3:::data-lake/",
  "Condition": {
    "StringEquals": {
      "aws:PrincipalTag/Department": "Finance",
      "s3:ExistingObjectTag/DataClass": "Confidential"
    },
    "IpAddress": {
      "aws:SourceIp": "10.0.0.0/8"
    },
    "DateGreaterThan": {
      "aws:CurrentTime": "2024-01-01T00:00:00Z"
    }
  }
}

ABAC 的威力在于「细粒度」和「动态性」。同样是财务部的员工,在办公室内网能看机密数据,连了 VPN 就只能看公开数据——策略不用改,属性变了权限自动变。

避坑指南:ABAC 虽然灵活,但性能开销大。每次访问都要计算属性、匹配策略。我曾经在客户那里遇到 ABAC 策略超过 1000 条的情况,每次鉴权延迟飙到 500ms 以上。后来做了策略缓存和属性预计算才解决。

3.5 四种模型对比

维度 DAC MAC RBAC ABAC
控制粒度 粗 中 中 细
灵活性 高 低 中 高
管理成本 低 高 中 高
安全性 低 高 中 高
适用场景 个人文件、沙箱 军工、政府 企业通用 多云、微服务
数据湖适配度 ⭐ ⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐

3.6 模型选择与混搭策略

实际项目中,我很少只用一种模型。数据湖的权限设计,通常是 RBAC + ABAC 的组合拳。

我的推荐架构:

  • 基础层:RBAC 定义大权限边界(谁可以进哪个数据域)
  • 精细层:ABAC 做行级/列级控制(什么条件下能看哪些字段)
  • 兜底层:MAC 做数据流出管控(防止高敏数据被导出到低安全域)
  • 沙箱层:DAC 给数据科学家做探索用(但严格审计)

嗯,这里要注意:混搭模型时,策略评估顺序很重要。我一般按「Deny 优先」原则——先检查所有拒绝策略,再检查允许策略。这样可以避免权限意外放行。

数据湖访问控制模型混搭架构 用户 / 应用 策略决策点(PDP) Deny 优先 → Allow 匹配 策略存储(PAP) RBAC + ABAC + MAC 属性引擎(PIP) 用户/资源/环境属性 数据湖存储层 S3 / ADLS / HDFS 公开数据(DAC) 内部数据(RBAC) 机密数据(ABAC+MAC) 审计与合规日志 💡 混搭策略要点: 1. RBAC 做粗粒度域隔离,ABAC 做细粒度行/列控制 2. MAC 兜底防止数据跨安全域流动,DAC 仅限沙箱环境

3.7 落地建议

最后,给几个我在实战中总结的落地建议:

  1. 先做 RBAC,再上 ABAC。 别一上来就搞 ABAC,属性定义和策略编写的工作量远超想象。
  2. 角色数量控制在 20 个以内。 超过这个数,说明你的角色设计有问题,该考虑 ABAC 了。
  3. ABAC 属性要标准化。 部门、数据分类、环境标签这些属性,必须在全公司统一,否则策略会自相矛盾。
  4. 定期做权限审计。 我见过太多「僵尸权限」——人走了、角色变了,但权限还在。每季度跑一次权限清单,清理无效策略。
  5. 测试环境先验证。 权限策略改动了,先在测试湖跑一遍,别直接上生产。我曾经因为一条 ABAC 策略写错条件,导致整个财务部门三天没法看报表。

重要提醒:无论选哪种模型,权限管理的「最小权限原则」永远是第一位的。给出去的权限就像泼出去的水,收回来比给出去难十倍。