文件保护
目录
参考资料:
影响文件安全性的主要因素有:
- 人为因素:人们有意或无意的行为,会使文件系统中的数据遭到破坏或丢失。
- 系统因素:由于系统的某部分出现异常情况,而造成数据的破坏或丢失,特别是作为数据存储主要介质的磁盘,一旦出现故障,会产生难以估量的影响。
- 自然因素:随着时间的推移,存放在磁盘上的数据会逐渐消失。
为了确保文件系统的安全性,可针对上述原因而采取三方面的措施:
- 通过存取控制机制,防止由人为因素所造成的文件不安全性。
- 采取系统容错技术,防止系统部分的故障所造成的文件的不安全性。
- 建立后备系统,防止由自然因素所造成的不安全性。
1 保护域(Protection Domain)和访问权
- 访问权
一个进程能对某对象执行操作的权力,称为访问权(Access right)。每个访问权可以用一个有序对(对象名,权集)来表示,例如,某进程有对文件 F1 执行读和写操作的权力,则可将该进程的访问权表示成(F1,{R/W})。
- 保护域
“域”是进程对一组对象访问权的集合,进程只能在指定域内执行操作。这样,“域”也就规定了进程所能访问的对象和能执行的操作。
下图中给出了两个保护域。在域 1 中有两个文件 F1 和 F2,只允许进程对 F1 读,而允许对 F2 读和写;而对象 Printer1 同时出现在域 1 和域 2 中,这表示在这两个域中运行的进程都能使用打印机。
- 静态域
在进程和域之间可以一一对应,即一个进程只联系着一个域。这意味着,在进程的整个生命期中,其可用资源是固定的,我们把这种域称为“静态域”。在这种情况下,进程运行的全过程都是受限于同一个域,这将会使赋予进程的访问权超过了实际需要。例如,某进程在运行开始时需要磁带机输入数据,而在进程快结束时,又需要用打印机打印数据。在一个进程只联系着一个域的情况下,则需要在该域中同时设置磁带机和打印机这两个对象,这将超过进程运行的实际需要。
- 动态域
在进程和域之间,也可以是一对多的关系,即一个进程可以联系着多个域。在此情况下,可将进程的运行分为若干个阶段,其每个阶段联系着一个域,这样便可根据运行的实际需要来规定在进程运行的每个阶段中所能访问的对象。
需要增加保护域切换功能
这种一对多的联系方式称为动态联系方式,在采用这种方式的系统中,应增设保护域切换功能,以使进程能在不同的运行阶段从一个保护域切换到另一个保护域。
2 什么是访问矩阵?
2.1 基本的访问矩阵
用来描述系统访问控制的矩阵,称为访问矩阵(AccessMatrix)。访问矩阵中的行代表域,列代表对象,矩阵中的每一项是由一组访问权组成的。
访问矩阵中的访问权通常由资源的拥有者或者管理者所决定。当用户创建一个新文件时,创建者便是拥有者,系统在访问矩阵中为新文件增加一列,由用户决定在该列的某个项中应具有哪些访问权,而在另一项中又具有哪些访问权。当用户删除此文件时,系统也要相应地在访问矩阵中将该文件对应的列撤消。
2.2 具有域切换权的访问矩阵
为了实现在进程和域之间的动态联系,需要使进程从一个保护域切换到另一个保护域。
为了能对进程进行控制,同样应将切换作为一种权力,仅当进程有切换权时,才能进行这种切换。为此,在访问矩阵中又增加了几个对象(切换域)。
例如,在上图中由于域 D1 和 D2 所对应的项目中都有一个 S 即 Switch,故而允许在域 D1 中的进程切换到域 D2 中。类似地,在 D2 域中运行的进程也可以切换到域 D3 中,但不允许该进程再从域 D3 返回到域 D1 或者 D2。
3 如何修改访问矩阵?
3.1 拷贝权(Copy Right)
利用拷贝权可以将在某个域中所拥有的访问权,扩展其它域中。
在上图中,凡是在访问权上加星号(*)者,都表示在域中运行的进程能将其对象的访问权复制成在任何域中对同一对象的访问权。
加*号,访问权允许复制
例如,图中在域 D1 中对文件 F3 的写访问权上加有 *
号,表示运行在 D1 域中的进程可以将其对文件 F3 的写访问权扩展到域 D3 中去,类似的,在域 D2 中对文件 F2 的读访问权也是一样。
应注意的是,把带有*
号的拷贝权拷贝到新的域以后,其所建立的访问权不再带有 *
号,这使在域 D3 上运行的进程不能再将其拷贝权进行扩散,这种拷贝方式被称为限制拷贝。
3.2 所有权(Owner Right)
有时候不仅要求能将已有的访问权进行有控制的扩散,而且同样需要能增加某种访问权,或者能删除某种访问权。此时,可利用**所有权(O)**来实现这些操作。
在拥有文件所有权的域中运行的进程,可以删除或新增该文件在其他域中的访问权。
3.3 控制权(ControlRight)
拷贝权和所有权都是用于改变矩阵内同一列的各项访问权的,或者说,是用于改变在不同域中运行的进程对同一对象的访问权的。
对一列中的数据进行修改
控制权则可用于改变矩阵内同一行中(域中)的各项访问权,亦即,用于改变在某个域中运行的进程对不同对象的访问权的。
对一行中的数据进行修改
4 如何实现访问矩阵?
4.1 访问控制表(Access Control List)
对访问矩阵按列(对象)划分,为每一列建立一张访问控制表 ACL。在该表中已把矩阵中属于该列的所有空项删除,此时的访问控制表是由一有序对(域,权集)所组成的。由于在大多数情况下,矩阵中的空项远多于非空项,因而使用访问控制表可以显著地减少所占用的存储空间,并能提高查找速度。
在不少系统中,当对象是文件时,便把访问控制表存放在该文件的文件控制表中,或放在文件的索引结点中,作为该文件的存取控制信息。
访问控制表也可用于定义缺省的访问权集,即在该表中列出了各个域对某对象的缺省访问权集。在系统中配置了这种表后,当某用户(进程)要访问某资源时,通常是首先由系统到缺省的访问控制表中,去查找该用户(进程)是否具有对指定资源进行访问的权力。如果找不到,再到相应对象的访问控制表中去查找。
4.2 访问权限(Capabilities)表
如果把访问矩阵按行(即域)划分,便可由每一行构成一张访问权限表。换言之,这是由一个域对每一个对象可以执行的一组操作所构成的表。表中的每一项即为该域对某对象的访问权限。当域为用户(进程)、对象为文件时,访问权限表便可用来描述一个用户对每一个文件所能执行的一组操作。
按行划分,一个域一张表
目前,大多数系统都同时采用访问控制表和访问权限表,在系统中为每个对象配置一张访问控制表。当一个进程第一次试图去访问一个对象时,必须先检查访问控制表,检查进程是否具有对该对象的访问权。如果无权访问,便由系统来拒绝进程的访问,并构成一例外(异常)事件;否则,便允许进程对该对象进行访问,并为该进程建立一访问权限,将之连接到该进程。
以后,该进程便可直接利用这一返回的权限去访问该对象,这样,便可快速地验证其访问的合法性。当进程不再需要对该对象进行访问时,便可撤消该访问权限。