9.6 共享与安全
9.6.1 文件共享与安全性的关系
在任何操作系统中,大量的文件需要管理,并且当用户进程请求时应指派给它们。如果文件的每一份拷贝都为每个用户所保留,则所要求的文件区将超出系统的海量存储器的能力。为了减少用户的重复性劳动,免除系统复制文件的工作和节省占用的存储空间等,系统提供文件共享的能力是十分必要的。所谓文件共享,是指某一个或某一部分文件可以让事先规定的某些用户共同使用。为实现文件共享,系统还必须提供文件保护的能力,即提供保证文件安全性的措施。
文件的安全问题是直接从共享的要求中提出来的。在非共享环境中,唯一允许存取文件的用户是文件主本人。因此,只要在主文件目录( MFD )中作一次身份检查就可确保其安全性。对于共享文件,文件主需要指定哪些用户可以存取他的文件,哪些用户不能存取。一旦某文件确定为可被其他用户共享时,还必须确定他们存取该文件的权限。例如,可允许他的一些伙伴更新他的文件,而另一些伙伴可以读出这些文件,其他的就只能装入和执行该文件。这就涉及到文件安全性(即保护)的问题。
文件的保护是指文件本身不得被未经文件主授权的任何用户存取,而对于授权用户也只能在允许的存取权限内使用文件。它涉及到用户对文件的使用权限和对用户权限的验证明。所谓存取权限的验证明,是指用户存取文件之前,需要检查用户的存取权限是否符合规定,符合者允许使用,否则拒绝。
为了保证文件的安全性,一个文件保护系统应具有四个方面的内容:
①被保护的目标。例如保护一个文件。
②被允许的文件存取类型。
③标只谁能独立的存取某一文件的用户。
④实现文件保护的过程,即存取权限的验证。
9.6.2 建立“当前目录”实现文件共享
建立“值班目录”或“当前目录”,是多路信息计算系统( MULTICS )采用过的办法。该系统令每个用户(或作业)获得一个“值班目录”(例如,可以指定用户 B 当前的值班目录为 8 ),他们对文件的所有访问都相对于“值班目录”进行的。这时,文件的路径名由“值班目录”到信息文件的通路上所有各级目录的符号名加上信息文件的符号名组成。系统规定标识文件的通路可以往上“走”,并用“ * ”表示一个给定目录文件的父结点。在图 9.11 所示的多级目录结构中,假定用户 B 当前的值班目录为 8 ,那么,文件 15 的路径名为 J 。他可用路径名“ * : e : j ”访问文件 17 ,用路径名“ * : * : c : a ”访问文件 12 。这样便达到了诸用户共享文件的目的。
9.6.3 采用“链接技术”实现文件共享
指定“值班目录”的办示可以实现文件共享,但这是一种“绕弯子”办法,因为要花很多的时间访问多级目录。为了提高访问其他目录文件的速度,可采用链接技术。所谓“链接”,就是在相应目录表目之间进行链接,即一个目录中的表目直接指向另一个目录的表目,如图 9.11 中最右边的一条连线所示。注意,这种链接不是直接指向文件,而是指向相应的目录表目。这种办法也称为连访,被共享的文件称访文件。在图 9.11 中有两个链接,一是为了实现用户 B 的子目录 d 共享用户 C 的文件 12 。另一个链接是实现用户 B 的子目录之间的文件共享,即子目录 f 共享子目录 d 中的文件 17 。现在假定用户 B 的值班目录为 8 ,则他可用路径名 K 直接存取文件 17 ,可用路径名“ * : d : f ”存取用户 C 的文件 12 ;若值班目录为 10 ,则可用 f 直接存取文件 12 。
采用这种链接方法时,在文件说明中必须增加“连访属性”和“用户计数”两项。前者说明表目中的地址是指向文件还是指向共享文件的目录表目。后者说明共享文件的当前用户数目。若要删除一个共享文件时,必须判别是否有共享用户还要使用,若有只作减 1 操作,否则才真正删除此共享文件。
9.6.4 存取权限的类型及其验证方法
文件系统可以定义许多不同的存取类型,在技术文献中通常引用的存取特权表包含:
EXCUTE ACCESS :用户可以利用文件实现特定的功能,即他可以执行文件,但不能读文件。
READ ACCESS :用户能读所有文件或部分文件。
UPDATE ACCEES :用户能修改所有或部分文件内容。
WRITE ACCESS :用户不仅能修改文件内容,而且还能加新的记录到文件中去。
DELETE ACCESS :用户能删除他自己的文件。
CHANGE ACCESS :用户可以修改文件属性,这一特权为文件拥有者保存。
文件拥有者通常具有以上各种特权,不具备这些特权的用户是不能以任何方式存取该论据的。若文件拥有者允许某用户共享此文件,则应提出该用户对此文件具有的权限。比如,若文件主只充许某用户 EXECUTE ACCESS 和 READ ACCESS 特权,那么该用户就只能执行和读文件。
在一个文件系统中,可采用多种方法来验证用户的存取权限,以便保证文件的安全。下面介绍几种验证用户存取权限的方法。
(一)访问控制矩阵
控制对文件访问的一种方法是,建立一个二维访问控制矩阵用以列出系统中所有用户和文件。其中,一维列出系统的用户,以 i(i=1,2, … ,n) 表示,另一维列出计算机系统的全部文件,以 j(j=1,2, … ,m) 表示。当用户 i 允许访问文件 j 时,元素 Aij=1 ;否则 Aij=0 。其结构见图 9.12 。在一个具有大量用户和大量文件的系统中,这一矩阵是十分庞大的同,同时也是十分稀疏的。

|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
|
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
|
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
|
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
|
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
当一个用户向文件系统提出存取请求时,由文件系统中的一个存取控制验证模块根据这个访问控制矩阵把本次请求和该用户对这个文件的存取权限进行比较,如果不匹配,就拒绝执行。
这种方法的优点是一目了然,缺点是这个矩阵往往过于庞大。如果为了快速存取而将其放到主存中,则要占据大更的主存空间。另外,若要对访问权限进一步细化,还可以分可读( R )、可写( W )、可执行( E )等权限,那么这个矩阵会变得更复杂一些。
(二)存取控制表
访问控制矩阵的主要缺点是占用空间大。然而,经地分析可以发现,某一文件往往只与特定的少数几个用户有关,而绝大多数用户与此无关。因此,可以简化访问控制矩阵,减少不必要的登记项。一种要求少量空间的技术是根据不同用户类别控制访问。常用的对用户分类模式是:
①文件主;正常情况下,这是建立文件的用户。
②指定的用户:文件主所指不定期的允许使用这一文件的另外用户。
③组合项目:用户通常是工作某一特定项目的小组中。在这一情况下,组内的各个成员可以全被赋予与项目有关的扎有文件的互相访问权。
④公用:大多数系统允许一个文件被指定为公用的,这样它就可以被该系统的用户集团中的任何成员所访问,肥用访问一般只允许用户读或执行一个文件,而写则是被禁止的。
采用存取控制表的方法对文件进行保护时,要将所有对某一文件有存取要求的用户按某种关系或工程项目的类别分成若干组,而把一般的用户统统归入“其他”用户组,同时还规定每一组用户的存取权限。所有用户组的存取权限的集合就是该文件的存取控制表,如表 9.3 所示。一般将这些信息存放在该文件的文件目录项中,作为该文件记录的一部分(即存取控制信息部分)。例如,用户可以按下述方式分类: ①文件主;②伙伴;③其他用户。
表 9.3 存取控制表

|
alpha |
文件主 |
RWE |
A 组 |
RE |
B 组 |
E |
其他 |
NONE |
典型的存取权限是:①不可存取( N );②只能执行( E );③只能读( R );④只能在文件尾添加( A );⑤可更新( U );⑥可改变保护级别( P );⑦可删除( D )。
每种存取权一般包含以上各种特权。例如,存取级别 R 表示可以对文件进行读、执行操作。如果在建立文件时,由文件主指定的一个标准文件的保护关键字是 DAR ,则表示文件主可以做任何一个操作,伙伴能够执行、读和添加,而其他用户只能执行和读取。有时,为了防止自身出错,应让文件主本身具有一个低的存取权。但是,文件系统总要允许文件主能改变他的存取权,否则文件主就无法改变或删除他自己的文件。
要实现上面这种方法,文件主必须在他的 UF 右引出被指定为伙伴的用户。除了文件主进行的存取外,每次存取都要检查这个表格。若系统能隐式地定认伙伴关系,则可避免上述的表格检查。这样的系统需要依靠标识符来识别用户,标识符可以这样来构造,使它的第一个成分指出伙伴关系(同组用户),第二个成分标识用户特征。例如, DEC system-10 机器上的用户标识符由课题号和用户号组成,对所有具有相同课题号的用户,就文件存取而言,彼此是伙伴关系。当一个用户企图对某个文件进行存取访问时,只要比较其标识符与文件主的标识符中的课题号是否一样,就能确定他是否为同组用户。这种方法实现比较简单,但是不能对文件主的不同文件分别规定同组用户。
(三)用户权限表
把一个用户(或用户组)所要存取的文件名集中存放在一张表中,其中每个表目指明对相应文件的存取权限,如表 9.4 所示。这种表称为用户权限表。
如果某系统采用这种方法进行存取保护,则要为每个用户建立一张用户权限表,并放在一个特定的区域内。只有负责存取合法性检查的程序才能存取这个权限表,以达到有效的保护。当用户对一个文件提出存取要求时,系统查找相应的权限表,以判断他的存取要求是否合法。
表 9.4 用户权限表
 
|
A 组 |
sqrt |
RW |
test |
R |
alpha |
RE |
┆ |
┆ |
abc |
RW |
(四)口令
口令和密码技术可应用在复杂的文件系统特别是数据库管理系统中。使用口令的办法是,用户为自己的每个文件规定一个口令,并附在文件目录中。存取文件时必须提供口令,只有当提供的口令与目录中的口令一致时才允许存取。当某一用户允许几个用户使用他的某个文件时,他必须把有关的口令告诉那几个用户。这些用户可以通过适当的命令通知文件系统在他的文件目录中建立相应的表目,并附上规定的口令。以后这些用户就可能通过约定好的口令来使用这些文件了。
使用口令的优点是:简便,并且只需少量空间存放口令。缺点是: 保护级别少。实际上只有“允许使用”和“不允许使用”两种,而没有区分读、写、执行等不同的权限。一旦获得口令就可以和文件主一样地使用文件。 保密性能差。保护信息存在系统中,有被人特别是系统程序员窃取全部口令的危险(前述几种方法均有类似缺点)。 不易改变存取控制权限。例如,当文件主想要改变口令以拒绝某一曾经使用过他的文件的用户继续使用其文件时,他必须把新口令通知其他允许使用他的文件的用户。
(五)密码
为了防止破坏和泄密而采取的保护信息的另一种办法,对文件进行编码。
文件写入时的编码工作及读出时的译码,都由系统存取控制验证模块来承担。由发请求的用户提供一个变元——代码键。一种简单的编码方法是,利用这个键作为生成一串相继随 机数的起始码。编码程序把这些相继的随机数加到被编码的文件的字节串上去。译码时,用编码时机同的代码键去启动随机数发处理品在,并从存往返文件中依次减去所得到的随机数,这样就能得到原来的数据。由于只有核准的用户才知道该代码键,因而他可以正确地引用文件。
在这个方案中,代码键不存入系统。只有当用户要存取文件时,才需将代码键送进系统。由于系统中没有那种可由不诚实的系统程序员能读出的表和信息,他们也就找不到各种文件的代码键,因而也无法偷看或篡改别人的文件。
密码技术具有保密性强,存储空间节省的特点,但必须花费大编码和译码时间,增加了系统的开销。
|