Linux ACL 权限之高级进阶篇

笔者在《Linux ACL 权限入门基础教程》一文中介绍了 Linux ACL 权限的基本用法,本文笔者将尝试探究 ACL 中的基本概念和实现原理,希望能够通过进一步的加深对 Linux 权限系统的理解。说明:本文的演示环境为 Uuntu 16.04。

ACL 中的基本概念

ACL 的类型

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

default ACL:目录也可以关联一个 ACL 来控制在该目录中创建的对象的默认 ACL,这样的 ACL(目录关联的 ACL)被称为 default ACL。

ACL 条目
一个 ACL 由多个 ACL 条目组成。一个 ACL 条目指定一个用户或者一组用户对所关联对象的读、写、执行权限。下图展示了 ACL 条目的类型及含义:

Linux ACL 权限之高级进阶篇

ACL 权限与 ugo 权限的对应关系

ACL 定义的权限是 ugo 权限的超集。

文件的 owner 权限对应于 ACL 权限中的 ACL_USER_OBJ 条目。

当 ACL 权限中具有 ACL_MASK 条目时,文件的 group 权限对应于 ACL 权限中的 ACL_MASK 条目。否则,当 ACL 权限中具没有 ACL_MASK 条目时,文件的 group 权限对应于 ACL 权限中的 ACL_GROUP_OBJ 条目。

文件的 other 权限对应于 ACL 权限中的 ACL_OTHER_OBJ 条目。

文件的 ugo 权限总是与对应的 ACL 条目保持一致。修改文件的 ugo 权限会导致修改相关的 ACL 条目,同样的,修改这些 ACL 条目会导致修改对应的 guo 权限。

新建文件的 default ACL

一个文件的 access ACL 会在通过 creat()、mkdir()、mknod()、mkfifo() 和 open() 函数创建该文件时被初始化。

如果一个目录被设置了 default ACL,那么将会由文件创建函数的 mode 参数和目录的 default ACL 共通决定新文件的 ACL 权限:

新的文件继承父目录的 default ACL 作为自己的 access ACL。

修改与 ugo 权限对应的 access ACL 条目,使其不包含文件创建函数的 mode 参数不包含的权限。

说明:此时 umask 被忽略。

如果一个目录没有被设置 default ACL,那么将由文件创建函数的 mode 参数和 umask 共同决定新文件的 ACL 权限:

新建文件的 access ACL 包含 ACL_USER_OBJ, ACL_GROUP_OBJ, 和 ACL_OTHER 条目。这些条目的权限被设置为由 umask 决定的权限。

修改与 ugo 权限对应的 access ACL 条目,使其不包含文件创建函数的 mode 参数不包含的权限。

文件权限检查的算法(Access Check Algorithm)

当一个进程访问(读、写、执行)一个被 ACL 保护的文件时,文件权限检查的算法决定了是否授权给进程访问该文件。
下面我们以 下面我们以伪代码的方式来解释文件权限检查的算法。
第一步:if 进程的 effective user ID 与文件 owner 匹配
                  if ACL 的 ACL_USER_OBJ 条目包含了请求所需的权限,此时就被授权访问文件
                  else 访问被拒绝
第二步:else if 进程的 effective user ID 匹配文件 ACL 权限中任何一个 ACL_USER 条目中的 user
                  if 匹配的 ACL_USER 条目和 ACL_MASK 条目包含了请求所需的权限,此时就被授权访问文件
                  else 访问被拒绝
第三步:else if 进程的 effective group ID 或者任何一个补充的(supplementary) group ID 匹配文件的 group 或 ACL 权限中任何一个 ACL_GROUP 条目的 group
                  if ACL 权限包含 ACL_MASK 条目
                      if ACL_MASK 条目和匹配的任何 ACL_GROUP_OBJ 或 ACL_GROUP 条目包含了请求所需的权限,此时就被授权访问文件
                        (注释:ACL_MASK 与其它项是 and 的关系,用来控制最大权限)
                      else 访问被拒绝
                  else (注意:没有 ACL_MASK 条目,就没有 ACL_GROUP 条目)         
                      if ACL_GROUP_OBJ 条目包含了请求所需的权限,此时就被授权访问文件
                      else 访问被拒绝
第四步:else if ACL_OTHER 条目包含了请求所需的权限,此时就被授权访问文件
第五步:else 访问被拒绝

ACL 的文本描述格式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12460.html