权限全靠管理员拍脑袋?聊聊数据平台里的ABAC和RBAC到底该怎么落地

举报
Echo_Wish 发表于 2026/06/12 08:15:25 2026/06/12
【摘要】 权限全靠管理员拍脑袋?聊聊数据平台里的ABAC和RBAC到底该怎么落地

权限全靠管理员拍脑袋?聊聊数据平台里的ABAC和RBAC到底该怎么落地

作者:Echo_Wish

很多企业在建设大数据平台的时候,最容易忽略的一个问题,不是计算性能,也不是存储成本,而是——权限管理

我见过不少公司,数据平台已经上百TB了,Hive、Spark、Flink、ClickHouse、Lakehouse全都上了,结果权限体系还停留在Excel表格管理阶段。

张三离职了权限没收回;

李四调岗了还能看原来的数据;

外包人员居然能访问核心经营数据;

更离谱的是,有些企业数据库账号直接共用。

很多数据泄露事件,并不是黑客有多厉害,而是权限设计从一开始就有问题。

今天我们就聊聊数据平台权限控制领域最经典的两种模型:

  • RBAC(Role-Based Access Control)
  • ABAC(Attribute-Based Access Control)

它们到底有什么区别?

为什么越来越多的大厂开始从RBAC走向ABAC?

又该如何在大数据平台中真正落地?


先说个真实场景

假设你们公司有这样几个部门:

  • 财务部
  • 研发部
  • 运营部
  • 市场部

数据平台中有以下数据:

订单数据
用户数据
员工薪资
运营报表
研发日志

传统做法通常是:

给张三开订单权限
给李四开薪资权限
给王五开报表权限

人数少的时候没问题。

当企业发展到:

500人
2000人
10000人

以后会发生什么?

权限爆炸。

管理员每天干的事情变成:

开权限
删权限
查权限
补权限
改权限

根本停不下来。

于是RBAC诞生了。


RBAC:角色决定权限

RBAC全称:

Role-Based Access Control

基于角色的访问控制。

核心思想特别简单:

用户 -> 角色 -> 权限

而不是:

用户 -> 权限

例如:

角色:
    财务经理
    财务专员
    数据分析师
    运维工程师

权限:
    查看订单
    查看薪资
    查看报表

关系如下:

张三 -> 数据分析师

数据分析师:
    查看订单
    查看运营报表

用代码实现一个简单RBAC

class RBAC:

    def __init__(self):
        self.roles = {
            "analyst": ["read_order", "read_report"],
            "finance": ["read_salary", "read_order"],
            "admin": ["*"]
        }

    def has_permission(self, role, permission):

        perms = self.roles.get(role, [])

        return "*" in perms or permission in perms


rbac = RBAC()

print(
    rbac.has_permission(
        "analyst",
        "read_order"
    )
)

print(
    rbac.has_permission(
        "analyst",
        "read_salary"
    )
)

输出:

True
False

逻辑非常清晰。


RBAC为什么受欢迎

原因就两个字:

简单。

例如企业有1000个员工。

实际上可能只有:

10个角色

管理员只需要维护角色。

新员工来了:

赋予角色

员工离职:

移除角色

结束。

运维成本极低。


但RBAC有一个致命问题

现实世界远比角色复杂。

举个例子。

公司有:

华东销售经理
华南销售经理
华北销售经理

要求:

只能看自己区域数据

怎么办?

RBAC通常这样做:

销售经理_华东
销售经理_华南
销售经理_华北

继续增加:

销售经理_华东_一级
销售经理_华东_二级
销售经理_华东_三级

再增加:

白班
夜班
临时工
外包

很快就变成:

几百个角色

这就是著名的:

Role Explosion(角色爆炸)

很多企业做到后期,角色数量比员工还多。

这时候RBAC开始失控。


ABAC登场

ABAC全称:

Attribute-Based Access Control

基于属性的访问控制。

核心思想:

用户属性
+
资源属性
+
环境属性
=
是否允许访问

不再依赖角色。


什么叫属性

用户属性:

{
  "department":"sales",
  "region":"east",
  "level":"manager"
}

资源属性:

{
  "table":"order",
  "region":"east"
}

环境属性:

{
  "time":"09:00",
  "ip":"10.1.1.1"
}

策略:

销售经理
只能访问
自己区域订单

系统自动计算。


一个简单ABAC实现

def check_permission(user, resource):

    if (
        user["department"] == "sales"
        and
        user["region"] == resource["region"]
    ):
        return True

    return False


user = {
    "department": "sales",
    "region": "east"
}

resource = {
    "table": "order",
    "region": "east"
}

print(
    check_permission(
        user,
        resource
    )
)

输出:

True

ABAC为什么越来越火

因为大数据平台越来越复杂。

以前权限控制的是:

库
表
字段

现在控制的是:

行权限
列权限
数据标签
敏感等级
数据血缘

例如:

普通员工
只能看到手机号后4位

主管
看到完整手机号

运营
只能看自己区域用户

这种需求RBAC几乎无法优雅解决。

ABAC却非常适合。


大数据平台中的典型落地方案

很多企业会采用:

RBAC + ABAC

混合模式。

而不是二选一。

架构通常如下:

用户
 ↓
RBAC角色校验
 ↓
ABAC策略校验
 ↓
数据访问

例如:

角色:
    数据分析师

RBAC负责:
    是否允许访问订单表

ABAC负责:
    是否允许查看华东区域数据

这样就把:

粗粒度控制
+
细粒度控制

结合起来。


Spark中的数据过滤

假设用户访问:

select * from order_info

系统自动改写SQL:

select *
from order_info
where region='east'

对应实现:

def rewrite_sql(user_region):

    sql = f"""
    SELECT *
    FROM order_info
    WHERE region='{user_region}'
    """

    return sql

这就是很多数据平台常见的:

Row Level Security
行级权限

字段脱敏也是ABAC的重要应用

例如手机号。

数据库原始数据:

13812345678

普通员工看到:

138****5678

管理员看到:

13812345678

实现示例:

def mask_phone(phone):

    return (
        phone[:3]
        + "****"
        + phone[-4:]
    )


role = "user"

if role == "user":
    print(mask_phone("13812345678"))
else:
    print("13812345678")

这实际上也是属性驱动的权限控制。


Apache Ranger为什么这么受欢迎

现在很多企业级数据平台都会引入:

Apache Ranger

原因很简单。

它天然支持:

RBAC
ABAC
数据脱敏
审计日志
策略中心

并且能够统一管理:

Hive
HBase
Kafka
Spark
Trino
Presto

对于大型数据平台来说,几乎已经成为标配。


我的一个观点:未来权限管理拼的不是角色,而是标签

过去企业管理权限:

人 -> 角色 -> 权限

未来越来越像:

人标签
+
数据标签
+
环境标签
+
风险标签

例如:

员工等级=L3

数据等级=敏感

访问地点=公司内网

时间=工作时间

满足条件:

允许访问

否则:

拒绝访问

这种模式更符合零信任架构的发展方向。


写在最后

很多团队建设数据平台时,总把精力放在:

计算快不快
存储省不省
查询稳不稳

却忽略了最关键的问题:

谁能看数据?
谁不该看数据?
看到了以后能不能追溯?

事实上,一个真正成熟的数据平台,最核心的能力从来不是算得快,而是管得住

RBAC解决的是:

你是谁

ABAC解决的是:

你在什么情况下可以访问什么数据

前者让权限管理变得简单,后者让权限管理变得智能。

对于今天的大数据平台而言,最合理的选择已经不是RBAC还是ABAC,而是:

用RBAC构建骨架,用ABAC填充血肉。

只有这样,数据才能真正做到“可用、可控、可追溯”,而不是成为企业数字化道路上的定时炸弹。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。