ACL 中的基本概念
ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。
ACL 的类型
access ACL:我们可以认为每一个对象(文件/目录)都可以关联一个 ACL 来控制其访问权限,这样的 ACL 被称为 access ACL。
default ACL:目录也可以关联一个 ACL 来控制在该目录中创建的对象的默认 ACL,这样的 ACL(目录关联的 ACL)被称为 default ACL。
ACL 条目
一个 ACL 由多个 ACL 条目组成。一个 ACL 条目指定一个用户或者一组用户对所关联对象的读、写、执行权限。下图展示了 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 的文本描述格式
有两种格式来描述 ACL 条目,分别是长格式和短格式。它们非常类似,都是通过两个冒号把一个 ACL 条目分为三个部分:
ACL 条目的类型:ACL 条目 qualifier:权限信息
我们在前面已经介绍过 ACL 条目的类型,权限信息就是用 rwx 来表示的信息,不支持某个权限的话可以使用 – 表示。这里介绍一下 ACL 条目 qualifier(不知道该咋翻译这货)。
当 ACL 条目的类型为 ACL_USER 或 ACL_GROUP 时,ACL 条目 qualifier 包含与 ACL 条目关联的用户和组的标识符。
当 ACL 条目的类型为其它时,ACL 条目 qualifier 为空。
其中的用户标识符可以是用户名也可以是 user ID,组标识符可以是组名也可以是 group ID。
删除 ACL 权限
有添加就有删除,我们可以通过 setfacl 命令的 -x 选项来删除指定用户或组的 ACL 权限,还可以通过 -b 选项来清除文件和目录上所有的 ACL 权限。
总结
本文先介绍了 ACL 权限中的基本概念,然后解释了笔者在使用 ACL 权限过程中碰到的一些疑问。希望这些内容可以帮助大家更好的理解和使用 ACL 权限。
版权声明:
1、陕西弈聪优博平台注册登录内容中凡注明“来源:XXX(非陕西弈聪优博平台注册登录)”的作品,转载自其它媒体,转载目的在于传递更多信息,其中涉及的优博平台注册登录建设,优博平台注册登录优化,百度关键词优化,西安软件开发等技术细节并不代表本站赞同支持其观点,并不对其真实性负责。对于署名“陕西弈聪”的作品系本站版权所有,任何人转载请署名来源,否则陕西弈聪将追究其相关法律责任。
2、本站内容中未声明为“原创”的内容可能源自其它优博平台注册登录,但并不代表本站支持其观点,对此带来的法律纠纷及其它责任与我方无关。如果此内容侵犯了您的权益,请联系我方进行删除。