3.2.6 权限管理
无论是Linux还是Windows,都是多用户操作系统。由于多个用户的存在,就必须实现用户之间资源访问的隔离。也就是说,用户A的资源(主要是文件)不应该让用户B访问,或者需要授权后才可以访问。这种管理用户可访问资源的特性就是权限管理。
3.2.6.1 RWX权限控制的原理
Linux最常见的访问控制方法被称为RWX访问控制。当通过ls命令获取文件的详细信息时,其前面的rwx字符串就是对文件权限的标示,而后面的两个root则是其所属用户和组的信息。图3-39所示为RWX权限实例。
图3-39 RWX权限实例
那么RWX是什么意思呢?RWX是Read、Write和eXecute的缩写,它描述了用户和组对该文件的不同的访问权限。RWX权限属性含义如图3-40所示。整个权限描述分为4段,第1段用于描述该文件的类型,可以是常规文件(-)、目录(d)、块设备(b)、链接(l)和字符设备(c)等。
图3-40 RWX权限属性含义
后面3段是文件具体的权限描述信息,分别是文件主权限、组用户权限和其他用户权限。通过上述3段的组合就可以实现比较复杂的权限控制。比如,允许某个用户的文件可以被其他用户读取,但是不可以改写和执行等。
上述权限控制信息包含r、w、x、-共4种字符,具体含义如下。
(1)r表示对于该用户可读。对于文件来说,r表示允许用户读取内容;对于目录来说,r表示允许用户读取其中的文件。
(2)w表示对于该用户可写。对于文件来说,w表示允许用户修改其内容;对于目录来说,w表示允许用户将信息写到目录中,即可以创建文件、删除文件、移动文件等。
(3)x表示对于该用户可执行。对于文件来说,x表示允许用户执行该文件;对于目录来说,x表示允许用户进入目录搜索目录内容(能用该目录名称作为路径名去访问它所包含的文件和子目录)。
(4)-表示对于该用户没有对应位的权限。具体禁用的功能请参考r、w和x的含义理解。以读权限为例,如果用户没有该权限,则对应位置不是“r”,而是“-”。
文件的访问权限是通过文件的RWX属性和所属属性共同来控制的。RWX属性描述了不同的用户和组的访问权限,而所属属性则描述了该文件所属用户和组的信息。
以test5文件为例,其主用户是itworld123,组是itworld123。而文件的RWX属性如图3-41所示。这样,主用户itworld123是可以读/写的,而其他用户则只能读,不可以写。当然,我们可以修改属性,让itworld123组内的所有用户都可以写。
图3-41 文件的RWX属性
RWX权限控制的入口是打开文件,在打开文件流程中会调用inode_permission()函数,该函数判断进程对文件的访问权限。其判断的依据就是RWX属性(inode->i_mode中的内容)和进程的用户信息。
需要注意的是,目录中的文件对目录属性的继承性。也就是说,如果目录属于用户itworld123,则其中的文件属于itworld123t1。如果用户itworld123对该文件没有写权限,则在强制写数据的情况下该文件的所属用户会变为itworld123。
3.2.6.2 ACL权限控制的原理
ACL也是一种对资源进行访问控制的方式,第2章已经介绍过ACL的场景和用法。我们可以手动设置文件或目录的ACL以实现对文件或目录的访问控制。同时ACL还有一个特性是实现对父目录ACL属性的继承。根据是否继承,ACL分为以下两类。
(1)access ACL:每一个对象(文件/目录)都可以关联一个ACL来控制其访问权限,这样的ACL被称为access ACL。
(2)default ACL:目录关联的一种ACL。当目录具备该属性时,在该目录中创建的对象(文件或子目录)默认具有相同的ACL。
通过ACL可以实现比较复杂的访问权限组合,权限的设置通过一个ACL条目实现。一个ACL条目指定一个用户或一组用户对所关联对象的读、写、执行权限。图3-42展示了ACL条目的类型。
图3-42 ACL条目的类型
例如,user::rwx指定了文件的所有者对该文件的访问权限,user:<name>:rwx指定了某个特定的用户对该文件的访问权限,mask::rwx表示该文件最大的允许权限,other::rwx表示没有在规则列表中的用户所具备的权限。
ACL在操作系统内部是通过文件的扩展属性实现的。当用户为文件添加一个ACL规则时,其实就是为该文件添加一个扩展属性。这样,当后续有某个用户访问该文件时,文件系统根据规则就可以确定访问权限。一个文件可以添加很多扩展属性,因此ACL的规则自然也可以有很多,这就保证了ACL的灵活性。
需要注意的是,ACL的数据与文件的普通扩展属性数据存储在相同的位置,只不过通过特殊的标记进行了区分。这样,当普通用户查询扩展属性时ACL的数据是可以被文件系统屏蔽的。
本节不再赘述关于Linux中ACL的实现细节,我们将在第4章介绍Ext2具体实现时再来分析ACL在代码实现层面的内容。
3.2.6.3 SELinux权限管理
SELinux(Security-Enhanced Linux,安全增强式)是一个在内核中实现的强制存取控制(MAC)安全性机制。SELinux与RWX、ACL最大的区别是基于访问者(应用程序)与资源的规则,而不是用户与资源的规则,因此其安全性更高。这里基于应用程序与资源的规则是指规定了哪些应用程序可以访问哪些资源,而与运行该应用程序的用户无关。
为什么说SELinux这种方式更安全呢?前面基于用户的安全策略,如果某个应用程序被黑客攻破,那么黑客可以基于运行该应用程序的用户启动其他应用程序实现对该用户所属其他资源的访问。而SELinux限定了应用程序可以访问的资源,即使黑客攻破了该应用程序,也只能访问被限定的资源,而不会扩散到其他地方。
SELinux的原理架构如图3-43所示,最左侧是访问者,也就是服务、进程或用户等。最右侧是被访问者,也就是具体的资源,如文件、目录或套接字等。
图3-43 SELinux的原理架构
当访问者访问被访问者(资源)时,需要调用内核的接口。以读取某个目录的文件为例,需要读取接口read。此时会经过SELinux内核的判断逻辑,该判断逻辑根据策略数据库的内容确定访问者是否有权访问被访问者,如果允许访问则放行,否则拒绝该请求并记录审计日志。
通过图3-43可以看出,SELinux的基本原理是比较简单的,关键是SELinux策略数据库的建立。由于应用繁多,资源也很多,因此规则数据库就比较繁杂。在实际使用过程中经常会出现缺少规则而出现访问异常的情况,这时就需要手动添加规则。