2.5.3 设置文件的ACL权限
前文介绍了RWX-UGO的权限控制方法,但是这种方法过于简单,很多场景无法满足要求。为了让大家理解为什么有些问题无法通过RWX-UGO权限管理解决,列举一个大家都会遇到的实例。
假设有一个工资单目录,该工资单目录存储了公司所有人员的工资单文件。对于工资单目录中的文件,显然财务人员(可能是张三、张五等多个人)是可以读/写的,因为他们要生成这个工资单,并可以更正错误。例如,对于李四的工资单文件,李四可以读但不允许写。出于对工资的保密,其他人不允许读,也不允许写。为了让大家更加清楚地理解上述关系,通过图2-13进行表示。
这种权限的要求采用RWX-UGO的方式就很难实现。因为采用RWX-UGO进行权限控制只能包含文件所有者和其他人,而无法控制多个不同的具体人。为了解决这种复杂的权限管理问题,Linux还有另外一套权限控制方法,也就是ACL权限控制方法。
图2-13 工资单的权限设置
ACL(Access Control List,访问控制列表),一个针对文件/目录的访问控制列表。它在RWX-UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。ACL允许给任何用户或用户组设置任何文件/目录的访问权限,这样就能形成网状的交叉访问关系。
ACL的原理很简单,就是在某个文件中增加一些描述用户名/组名与权限的“键-值”对。比如,用户sunnyzhang具有读/写权限(rw),可以为该文件添加sunnyzhang:rw信息。这样在内核中就可以根据该描述信息确定某个用户对该文件的权限。
Linux有几个命令行工具来对文件/目录的ACL属性进行设置。使用起来也比较简单。接下来看一下如何获取一个文件的ACL属性,或者为一个文件设置ACL属性。
1.获取文件的ACL属性
通过getfacl命令可以获取文件的ACL属性。比如test.bin文件,我们通过下面命令就可以获取该文件的ACL属性,如图2-14所示。由于ACL兼容RWX,因此即使在没有做ACL设置的情况下也是可以获得相关内容的。我们对比一下图中箭头所指向的内容可以发现,ACL属性与RWX属性是完全一致的。
图2-14 ACL属性与RWX属性对照
2.设置文件的ACL属性
如何设置一个文件的ACL属性呢?可以通过setfacl命令用来设置文件或目录的ACL属性,该命令的语法格式如下:
虽然选项比较多,但是常用的选项主要是-m和-x,前者用于给文件/目录添加ACL参数,后者用于删除某个ACL参数。其他选项的作用请参考man手册,本节不再赘述。
下面列举一个简单的实例,test.bin文件本来属于root用户,但是期望该文件被zhangsan用户读/写,代码如下:
当设置完成后,再次通过getfacl命令获取该文件的ACL属性时会发现结果中多了一行代码“user:zhangsan:rw-”,如图2-15所示。这一行代码就是我们添加的用户zhangsan对该文件的读写权限(rw)。
图2-15 ACL权限设置实例
ACL除了拥有命令行工具,还拥有一套API,以方便程序员通过编程的方式来修改文件的ACL属性。但是ACL中的API与RWX中的API相比,使用起来还是比较复杂的。如果想要通过编程的方式修改ACL属性,则首先需要安装一个libacl库,然后使用该库中的API来做相关的操作。关于libacl库中API的用法本章不再介绍,后续章节在原理介绍时会详述相关代码。
至此,大家应该对如何修改文件的权限有了一个整体的认识,但是对其实现原理可能还不太清楚。不过没关系,我们在后续章节将结合代码详细介绍Linux是如何实现权限管理的。