背景※
多维表用户对数据的安全和权限管理有很高的诉求,他们希望能够指定谁可以查看和编辑哪些行和列、数据表;哪些人可以查看仪表盘;甚至哪些人可以创建视图、数据表等。
为了满足用户对多维表权限管理的需求,我们需要在多维表中加入访问控制的能力。
访问控制(Access control)是指对用户访问受保护资源时的控制管理。它可以保证被授权的用户能访问保护资源,而未被授权的用户则不能访问。一般「权限管控」、「数据安全」等指的都是访问控制。
主流的访问控制模型※
ACL 模型※
Access Control List 访问控制列表。
这是最早的访问控制模型,基于资源进行控制,对每个资源和每个用户的访问权限都记录到列表中。普遍用于路由器流量转发、SSH、FTP 等应用上。
一个典型的访问控制列表
# ip access-list
allow 192.168.0.0 255.255.0.0 # ip 是 192.168.x.x 的流量可以转发出去
allow 192.1.0.0 255.255.0.0
deny 192.234.1.0 255.255.255.0 # ip 是 192.234.1.x 的流量不允许转发出去以下图的多维表数据为例,如果多维表要用 ACL 模型实现,「访问控制列表」就成了「访问控制列表列表」

# 订单表 access-list
read write 墨牛
read write delete 蓝伯
read write delete 沾沪
deny 轩云
deny 未槿
# 订单表-全部订单
read 墨牛
read 沾沪
read write 蓝伯
# 订单表-订单号列
read write 墨牛
read delete 蓝伯
# 订单表-销售员列
read write 墨牛
# 订单表-金额列
read 蓝伯
...可以看到 ACL 可以保障资源的「安全性」,也可以「很精细地控制」权限,而且判断权限「性能也很高」。但是资源种类或者用户多的情况下已经无法维护,即便两个人的权限相同,也无法复用,只能在所有的资源访问控制列表中 copy-paste 一份。
DAC 模型※
Discretionary Access Control 自主访问控制
这是 ACL 的一种扩展,在上面 ACL 的基础上,允许用户可以把自己有的权限授权给其他用户。一方面分担了管理员维护 ACL 列表的任务,但另一方便导致权限可以任意传递,难以控制,可能有泄漏信息的风险。常见的文件系统的访问控制模型就是 DAC,Linux(EXT、ZFS)、Mac OS(APFS)、Windows(NTFS)等。

MAL 模型※
Mandatory Access Control 强制访问控制
最初是美国军方为了防止木法攻击和信息机密性的要求而研发。军队、政府等机密机构使用的一种模型。他们的用户的等级属性强,安全策略由安全策略管理员集中控制,用户无法修改。系统中的用户有一套有等级的权限标识,资源也有一套权限等级。用户能否访问资源取决于系统中固化的策略。SELinux 中使用的就是 MAC 模型。
以政府机构为例,公务员的等级中部级>局级>处级>科级,政务文件保密等级为绝密>机密>秘密,系统中访问策略为处级只能访问秘密文件。当某个公务员访问政务文件时,系统会验证用户的等级,同时也验证文件的保密等级,只有两个等级相对应时才可以访问。
优点是保密等级严格,可以确保控制机制能够抵抗记录所有类型的攻击。同时这也是 MAC 模型的限制:控制太严格,缺乏灵活性。
以上 ACL、DAC 和 MAC 模型都是早期的访问控制模型,随着现在互联网的发展,不太能够适应简单、灵活的需求。逐渐发展出了下面的新模型。
RBAC 模型※
Role-Based Access Control 基于角色的访问控制
为了解决上面 DAC 和 MAC 中权限与用户直接绑定导致管理困难,无法维护的问题,1992 年在国家计算机安全大会上提出了 RBAC 访问控制模型,首次引入了「角色」的概念,所谓角色,就是一个或一组权限的集合。核心在于用户只和角色关联,而角色则代表了权限。这样就实现了用户和权限的分离,从而大大简化了授权管理,也跟日常的组织管理规则非常接近,能够实现最小权限原则,实用性强。
RBAC 的三要素:
- 用户:系统中的所有用户,包括个人、用户组、部门、群等
- 角色:一系列权限的集合(比如:老板、销售员、仓库管理员)
- 权限:功能菜单、按钮,对资源的 CRUD 等详细的权限点。

在 RBAC 中,权限与角色相关联,用户通过称为某个角色的成员而获得这个角色中定义的所有权限。用户可以很容易地从一个角色指派到另一个角色。
角色则是为了满足当前业务创建的,系统管理员可以依据新的需求而更改角色或者新建角色。角色之间也可以存在继承关系防止越权的出现。
也有缺点,当需求的权限颗粒度过于详细时,会出现角色爆炸的情况。
ABAC 模型※
Attribute-Based Access Control 基于属性的访问控制
又被称为基于策略的访问控制(Policy-Based Access Control),通过动态计算一个或一组属性是否满足某个条件来授权,是一种很灵活的权限模型,可以按需实现不同颗粒度的权限控制,能够解决细颗粒度下 RBAC 静态和角色爆炸的问题:
- 下午 6:00 前禁止员工刷饭卡
- 当一个文档的所属部门跟用户的部门相同时,用户可以访问这个文档。
在 ABAC 模型中,用户访问某个资源是否被允许取决于用户、资源、操作和环境信息动态计算决定的,其中:
- 用户:与 RBAC 中的用户概念一致
- 资源:与 RBAC 中的资源一致
- 操作:与 RBAC 中的权限一致
- 环境:每个访问请求的上下文,包括当前时间、ip 地址、设备号等。
ABAC 灵活度高,也因为此,规则复杂,不容易看出用户与资源之间的关系,实现起来难,使用起来也难。
AWS 的 IAM 和阿里云的 RAM 访问控制使用了 RBAC 为基础搭配 ABAC的混合模型(我们多维表也是这样的)。这是一个典型的 ABAC 配置。

一些新的访问控制模型※
NGAC 模型※
Next Generation Access Control 下一代访问控制
2019 年的时候,NIST 提出了 NGAC 模型,从名称中可以看出 NIST 认为这个模型就是访问控制模型的终极了。通过一个包含用户、资源、权限和策略的有向无环图来表示整个访问控制模型。只要用户(图中蓝色节点)到资源(黄色节点)又通路,则可以访问。
NIST 表示这是一种新颖的、优雅的、革命性的方式。兼顾了 RBAC 和 ABAC 的优点。作者没有实践过,也没有用过使用了 NGAC 模型的产品,对此观点存疑。

总结※
访问控制是一个自古以来就存在的需求,在计算机系统中访问控制可以说是无处不在。经过多年的实践已经发展出很多类的访问控制模型,不同的模型有其优缺点。自己的系统在引入访问控制的概念时可以根据系统的特点和用户的需求选择最适合的模型。
附录※
美国国家标准与技术委员会对文中提到的访问控制模型的标准化
https://csrc.nist.gov/glossary/term/access_control_list
https://csrc.nist.gov/glossary/term/discretionary_access_control
https://csrc.nist.gov/glossary/term/mandatory_access_control
https://csrc.nist.gov/projects/role-based-access-control
https://csrc.nist.gov/Projects/attribute-based-access-control