查看原文
其他

Linux的ACL权限实现原理及实现详解

SunnyZhang 数据存储张 2024-04-26
前文回顾:
1. 一篇文章了解Linux操作系统的权限管理
2. Linux安全模块框架(LSM)原理与代码实现解析
3. Linux的RWX权限管理实现详解及chmod使用
如果阅读本文时发现有不清楚的地方,欢迎大家留言。作者会尽量回答大家的问题。

前面我们介绍了RWX-UGO的权限控制方法,但是这种方法过于简单,很多场景无法满足要求。因此,在Linux中还有另外一套权限控制方法,也就是ACL控制方法。


ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在RWX-UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。

如图1所示,假设有个工资单文件。显然财务人员张三是可以读写的,因为他要生成这个工资单,并可以更正错误。而工资单的干系人李四肯定是可以读的,但是不允许乱改。出于工资保密,其他人是不允许读,也不允许写。这种权限的要求采用RWX-UGO的方式就很难实现。

1、ACL的基本概念和原理


我们可以手动设置文件或者目录的ACL以实现对文件或者目录的访问控制。同时ACL还有一个特性是实现对父目录ACL属性的继承。因此,根据两者的差异,ACL分为两类

  • access ACL:每一个对象(文件/目录)都可以关联一个 ACL 来控制其访问权限,这样的 ACL 被称为 access ACL。

  • default ACL:目录关联的一种 ACL。当目录具备该属性时,在该目录中创建的对象(文件或者子目录)默认 具有相同的ACL。

通过ACL可以实现比较复杂的访问权限组合,权限的设置通过一个ACL条目实现。一个ACL条目指定一个用户或者一组用户对所关联对象的读、写、执行权限。下图展示了 ACL 条目的类型:


例如user::rwx指定了文件的所有者对该文件的访问权限。而user:<name>:rwx则指定了某个特定的用户对该文件的访问权限。mask::rwx表示该文件最大的允许权限,而other则是没有在规则列表中的用户所具备的权限。


ACL在操作系统内部是通过文件的扩展属性实现的。ACL的数据与文件的扩展属性数据存储在相同的位置,只不过通过name_index进行区分。这样在用户查询数据的情况下可以选择性的进行显示。


这部分内容的实现细节暂时不做介绍,后续章节我们再详细的介绍。

2、设置文件的ACL


在Linux操作系统中有几个命令行工具来对文件/目录的ACL属性进行设置。本文简单介绍一下这些工具的用法。

setfacl命令

这个工具用来设置文件或者目录的ACL,涉及的参数比较多,具体如下。

setfacl [-bkRd] [{-m|-x} acl参数] 文件/目录名
下面是具体的选项。
-m :配置后面的 acl 参数给文件/目录使用,不可与 -x 合用;-x :删除后续的 acl 参数,不可与 -m 合用;-b :移除所有的 ACL 配置参数;-k :移除默认的 ACL 参数;-R :递归配置 acl;-d :配置“默认 acl 参数”,只对目录有效,在该目录新建的数据会引用此默认值;

我们举一个简单的例子,比如我们希望某个文件可以被该文件的所有者之外的某个特定用户读写,那么我们可以这样设置。具体命令和结果如图所示。



从图中可以看出,在ACL中多出一行来(user:itworld123:rw-),改行信息描述了itworld123用户对文件test的访问权限。

getfacl命令

该命令用于查询文件的ACL属性。这个命令比较简单,我们就不过多介绍了。

getfacl 文件/目录名


3、内核实现解析


关于ACL的内核部分的实现我们分两部分进行介绍。一部分是如何设置文件的ACL属性,另外一部分是当访问文件时是如何进行ACL检查的。

ACL的设置与获取

通过上述命令设置的ACL权限是存储在什么地方呢?其实这些数据是存储在文件的扩展属性中的,也就是与扩展属性有相同的位置。如果大家阅读一下Linux内核的源代码就会发现其实ACL会调用到扩展属性的代码。从setfacl命令开始,到最终文件系统的函数调用栈如图所示。

如果大家阅读一下Ext2的源代码,可以找到关于ACL的函数指针,具体如下所示。


获取流程与查询流程类似,本文不再重复了。另外代码的更多细节本文也不再赘述了。大家可以按照上述流程图自行阅读代码,逻辑是比较简单的。

ACL权限检查

设置完成ACL属性后就其作用了,那么当用户在打开文件时内核就会进行相应的检查。检查的入口与RWX在相同,都是may_open函数。

通过上述流程图可以看出,在权限检查中会调用到一个check_acl的函数。该函数就是根据磁盘上存储的用户和权限信息和线程中的信息进行比对,从而确定该用户是否有访问文件的权限。

关于ACL的核心内容大致如本文所述,如果有任何没有讲清楚的地方,还请大家在下面留言。

     文章后期可能会进行错误更正和内容更新关注我们更方便了解内容变化。


这是一个有温度的公众号



继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存