1.6 信息系统访问控制

获取对信息系统的访问权是攻击者实施安全攻击的重要目的之一,相应地,安全防御的重要目的之一就是防止攻击者对信息系统进行非法访问。访问控制是确保信息系统安全的重要措施之一。

1.6.1 访问控制矩阵

描述一个保护系统的最简单框架是使用访问控制矩阵模型,这个模型将所有用户对文件的访问权限存储在矩阵中。访问控制矩阵模型最早由B.Lampson于1971年提出,Graham和Denning对它进行了改进,这里将使用他们的模型。

客体集合 O 是指所有被保护实体的集合(所有与系统保护状态相关的实体)。主体集合S是所有活动对象的集合,如进程和用户。所有的权限的类型用集合R来表示。在访问控制矩阵模型中,客体集合 O 和主体集合 S 之间的关系用带有权限的矩阵 A 来描述,A中的任意元素α[s, o]满足sS,oO,α[s, o]⊆R。元素α[s, o]代表的意义是主体s对客体o具有访问权限α[s, o]。

所有保护状态的集合可以用一个三元组(S, O, A)来表示。图1.4给出了一个系统的保护状态的例子。在这个例子中,进程1可以对文件1进行读、写操作,对文件2进行读操作;进程2可以对文件1进行添加并且可以读文件2;进程1可以通过向进程2写数据的方法(如管道)和进程2通信,当然,进程2可以读取进程1传给它的数据。每个进程都是本进程的拥有者,同时进程1是文件1的拥有者,进程2是文件2的拥有者。需要注意的是进程既是客体又是主体,这使得进程既可以作为操作者又可以作为被操作的对象。

图1.4 一个系统的保护状态的例子

不同的系统有不同的对权限意义的解释。一般来说,从文件读取、写到文件和添加数据到文件这些操作的意义都是很明显的。但是,“从进程读数据”这种操作代表什么意义呢?这和系统的实现有关,它可以代表从该进程获取一个消息或只是简单地查看进程当前的状态(和调试器一样)。系统操作所涉及的客体不同也导致权限的意义有所不同。理解访问控制矩阵模型的关键点在于它只是描述保护状态的抽象模型,如果要谈到某个具体的访问控制矩阵的意义,则必须和系统的具体实现联系起来。

对某个客体的拥有权是一种特殊的权限。在大多数系统中,某个客体的创造者拥有对该客体的某些优先权:增加或删除其他用户对该客体的权限。在如图1.4所示的例子中,进程1可以修改A[x,文件1]的值,这里的x是任意的主体。

例1.9 UNIX操作系统对于文件访问定义了读、写和执行权限,这些权限的意义是非常清楚的。然而对于目录,这些权限的意义就有所不同了。一个进程访问目录时,读的权限意味着进程可以列出目录中的所有文件;写的权限意味着进程可以在该目录下创建文件;执行的权限意味着进程可以访问该目录下的文件和子目录。对于进程,这些权限的意义也有所不同。当一个进程F与另一个进程G交互时,读的权限意味着进程F可以从进程G获取消息;写的权限意味着进程F可以向进程G发送消息;执行的权限意味着进程F可以将进程G当做子进程运行。

系统的超级用户对任何(本地)文件都有访问权限,不论该文件的所有者是否给予了超级用户这些权限。从实际效果来看,这样的超级用户相当于系统中所有文件的拥有者,但是超级用户拥有权限的解释也必须遵循上面所述的限制。例如,超级用户也不能使用操作文件的系统调用和系统命令来操作目录;超级用户也必须使用适当的系统调用和系统命令来创建、删除和重命名文件。

访问控制矩阵中的客体一般意味着文件、设备或者进程,但客体其实可以是小到进程之间发送的一条消息,也可以大到整个系统。图1.5 显示了一个局域网(LAN)中三个不同系统的访问控制矩阵。在这个例子中,权限对应着不同的网络协议:“own”权限对应着在服务器上创建一个服务的权限;“ftp”意味着使用文件传输协议(FTP)来访问文件;“nfs”意味着使用网络文件系统协议(NFS)来访问文件;“mail”权限意味着可以使用简单邮件传输协议(SMTP)来发送邮件。

图1.5 一个LAN中三个不同系统的访问控制矩阵

在如图1.5所示的例子中,客体telegraph是个人计算机,它上面运行了一个FTP的客户端,可以通过这个FTP客户端访问其他两个系统。不过telegraph没有提供任何服务,其他两个系统都无法访问它。客体nob向不包括客体toadflax在内的一些客户提供NFS服务,nob和toadflax之间可以互发邮件,它们也都提供了FTP服务,以便其他系统能访问它们。

在更微观的层次,访问控制矩阵也可以为计算机程序语言建模。在这种情况下,客体指程序中的变量,主体是程序中的进程或模块。考虑一个需要事件同步的程序,程序中的一个模块提供了对这个模块内私有计数器进行增加(inc_ctr)和减少(dec_ctr)的函数。子程序manager可以调用这些函数。这样,访问控制矩阵如图1.6所示,“+”和“-”的权限分别对应增加计数器和减少计数器。“call”权限意味着可以调用某个函数(子程序),子程序manager可以调用自己。

图1.6 访问控制矩阵

在上面的例子中,访问控制矩阵中的元素是权限。当然,这些元素也可以代表确定某个特定状态下的权限的函数,函数的参数可以是一些历史数据(如以往的访问数据)、当天的时间、其他主体对该客体拥有的权限等。常见的这类函数是用于限定Bernstein条件的锁定函数。锁定函数可以保证一个进程在写文件时,其他进程不能访问该文件,当写的过程结束之后,其他进程才可拥有访问该文件的权限。

1.6.2 访问控制的类型

安全策略可以单独地或混合地使用两种类型的访问控制:其一,访问控制取决于拥有者的判断力;其二,操作系统控制访问,且拥有者不能超越这些控制。

第一种访问控制的类型基于用户身份,是应用最为广泛的一种类型。

定义1.15 如果作为客体的拥有者的个人用户可以设置访问控制属性来许可或拒绝对客体的访问,那么这样的访问控制称为自主访问控制(DAC,Discretionary Access Control)。

自主访问控制的访问权限基于主体和客体的身份。身份是关键,客体的拥有者通过允许特定的主体进行访问来限制对客体的访问。拥有者根据主体的身份来规定限制,或者根据主体的拥有者来规定限制。

例1.10 假设一个小孩有本日记。她控制着对日记的访问权,因为她可以决定谁能阅读(授予读访问权限)或谁不能阅读(拒绝读访问)。她允许妈妈读,但其他人不行。这是自主访问控制,因为对日记的访问由客体(日记)的拥有者(小孩)确定。

访问控制的第二种类型是基于系统的授权,与个人用户无关。

定义1.16 如果只有系统才能控制对客体的访问,而个人用户不能改变这种控制,那么这样的访问控制称为强制访问控制(MAC,Mandatory Access Control)。

操作系统实施强制访问控制。主体和客体的拥有者都不能决定访问的授权。通常,系统机制通过检查主体与客体相关的信息来决定主体是否可以访问客体。规则描述允许访问的条件。

例1.11 法律允许法庭在未经拥有者授权的情况下查看其驾驶记录。这是强制访问控制,因为记录的拥有者不能控制法庭对信息的访问。

定义1.17 创建者控制的访问控制(ORCON或ORGCON)基于客体(或客体所包含信息)的创建者进行数据访问。

这种控制的目的是允许文件(或它所包含的信息)的创建者控制信息的分发,而文件的拥有者则没有控制谁能访问该文件的控制权。

例1.12 一家以开发嵌入式系统而著称的甲公司与乙公司签订了一份合同,乙公司以其微代码设计能力而著称。合同要求乙公司为某种处理器开发微代码设计语言,该处理器用于高性能嵌入式系统。甲公司给了乙公司一份处理器规范的副本。合同的条款要求乙公司在透露处理器信息给子承包商前,要先获得授权。这就是一种创建者控制的访问机制,因为尽管乙公司拥有包含规范的文件,但它不能让他人接触此信息,除非得到创建者甲公司的允许。

1.6.3 贝尔-拉普杜拉访问控制模型

1973年,贝尔(D.E. Bell)和拉普杜拉(L.J. LaPadula)提出了一个可证明的安全系统的数学模型,这就是贝尔-拉普杜拉模型(Bell&LaPadula模型),简称贝-拉模型(BLP模型)。在随后的几年,该模型得到了进一步的充实和完善。贝尔和拉普杜拉在1976年完成的研究报告给出了贝-拉模型的最完整表述,其中包含模型的形式化描述和非形式化说明,以及模型在Multics系统中实现的解释。

贝-拉模型是根据军事安全策略设计的,它要解决的本质问题是对具有密级划分的信息的访问进行控制。

贝-拉模型是一个状态机模型,它定义的系统包含一个初始状态 z0和由一些三元组(请求,判定,状态)组成的序列,三元组序列中相邻状态之间满足某种关系 W。如果一个系统的初始状态是安全的,并且三元组序列中的所有状态都是安全的,那么这样的系统就是一个安全系统。

贝-拉模型定义的状态是一个四元组(b, M, f, H),其中,b是当前访问的集合,当前访问由三元组(主体,客体,访问方式)表示,是当前状态下允许的访问;M 是访问控制矩阵;f 是安全级别函数,用于确定任意主体和客体的安全级别;H 是客体间的层次关系。抽象出的访问方式有4 种,分别是只可读 r、只可写 a、可读写 w 和不可读写(可执行)e。主体的安全级别包括最大安全级别和当前安全级别,最大安全级别通常简称为安全级别。以下特性和定理构成了贝-拉模型的核心内容。

简单安全特性(ss-特性):如果(主体,客体,可读)是当前访问,那么一定有:

level(主体) ≥ level(客体)

其中,level表示安全级别,≥ 表示支配关系。

星号安全特性(*-特性):在任意状态,如果(主体,客体,方式)是当前访问,那么一定有:

(1)若方式是a,则level(客体) ≥ current-level(主体);

(2)若方式是w,则level(客体) = current-level(主体);

(3)若方式是r,则current-level(主体) ≥ level(客体)。

其中,current-level表示当前安全级别。

自主安全特性(ds-特性):如果(主体-i,客体-j,方式-x)是当前访问,那么,方式-x一定在访问控制矩阵M的元素Mij中。

与ds-特性处理自主访问控制相对应,ss-特性和*-特性处理的是强制访问控制。自主访问控制的权限由客体的属主(即拥有者)自主确定,强制访问控制的权限由特定的安全管理员代表系统确定,由系统强制实施。

基本安全定理:如果系统状态的每一次变化都能满足ss-特性、*-特性和ds-特性的要求,那么,在系统的整个状态变化过程中,系统的安全性是不会被破坏的。

贝-拉模型中的安全级别包含等级分类和非等级类别两种元素,等级分类可以与整数相对应,非等级类别可以与集合相对应。安全级别可由以下定义表示。

定义1.18 在贝-拉模型中,实体 E 的安全级别level(E)是一个二元组(L, C),其中,L是等级分类,可与一个整数相对应,C是非等级类别,可以与一个集合相对应。

例1.13 贝-拉模型的安全级别的等级分类元素可以表示现实应用中的以下密级:

非密、秘密、机密、绝密

它们可以分别用以下整数表示:

1、2、3、4

安全级别的非等级类别可以表示现实应用中的以下集合:

{财务处}、{科研处}、{教务处}、{财务处,科研处}、{财务处,教务处}、……

贝-拉模型中的安全级别的支配关系由以下定义描述。

定义1.14 设在贝-拉模型中,实体E1E2的安全级别分别为

level(E1) = (L1, C1),level(E2) = (L2, C2)

若用 ≥ 表示支配关系,那么:

当且仅当:

1.6.4 系统保护状态

level(E1) ≥ level(E2)

L1L2C1C2

保护系统描述了在哪些条件下被保护的系统是安全的。访问控制矩阵是描述保护系统的经典方法。访问控制矩阵最早源于对操作系统和数据库的研究,它使用一个矩阵来描述访问权限。

系统状态是由所有内存、二级缓存、寄存器和系统中其他设备的状态构成的集合,这个集合中涉及安全保护的子集称为保护状态,访问控制矩阵是用于描述当前保护状态的工具。

假设 P 是所有可能的保护状态的集合,QP 的一个子集,Q 代表系统的合法状态。这样,如果系统在任何时候的状态都在集合Q中,则系统是安全的;如果系统的当前状态是处于P-Q中(P-Q表示由所有在集合P中,但不在集合Q中的元素构成的集合),那么系统是不安全的。描述系统状态的有用之处是要列出处于集合 Q 中的系统状态的特征,实现安全是要保证系统的状态总是属于集合 Q 的。描述集合 Q 中的系统状态的特征是安全策略的工作,阻止系统进入集合 P-Q 中的状态是安全机制的作用。实施这些限制的是安全机制。

访问控制矩阵模型是用于描述保护状态的有效模型,它准确地描述了一个主体(活跃的实体,如一个进程)对系统中其他实体的访问权限。访问控制矩阵 A 中的元素构成了一个当前系统状态的规范。规范有多种形式,现在研究者也提出了很多种描述规范的语言来描述系统中的允许状态。

保护状态随着系统的变化而变化。当一个系统命令改变了系统状态时,保护状态也随之转换。首先定义好一个允许状态的集合,在这个集合上有相应的允许操作。系统状态从一个允许状态开始,执行一个在该状态上的允许操作之后,系统状态发生了转换,转换的结果应该仍然是一个允许状态。如此递推下去,系统应该总是处于允许状态中。因此,允许状态和其他状态之间的转换是有限制的。

在实际的系统中,任何一个操作都会导致多个状态的转换,如读取数据、加载程序、修改数据和任何指令的执行都会导致系统状态的转换。只有系统中影响保护状态的状态转换才是值得关心的,也只有那些改变系统中实体被允许行为的状态转换才是我们感兴趣的。举例来说,如果一个程序将某个变量的值修改为0,这种操作一般不会改变系统的保护状态。但是,如果这个变量会影响某个进程的优先级的话,程序做的这个修改就会影响到保护状态,此时就需要考虑状态转换了。

1.6.5 访问控制结构与设计原则

1975年,邵泽(J.H. Saltzer)和施罗德(M.D. Schroeder)以安全保护机制的体系结构为中心,探讨了计算机系统的安全保护问题,重点考察了权能(Capability)和访问控制表(Access Control List)这两种结构,给出了设计安全保护机制的八大原则。

为讨论信息保护问题,从概念上可以为每个须保护的客体建立一个不可攻破的保护墙,保护墙上留有一个门,门前有一个卫兵,所有对客体的访问都首先在门前接受卫兵的检查。在整个系统中,有很多客体,因而有很多保护墙和卫兵。

对客体的访问控制机制的实现结构可分为两种类型:面向门票(Ticket-Oriented)的实现和面向名单(List-Oriented)的实现。

在面向门票的实现中,卫兵手中持有一份对一个客体的描述,在访问活动中,主体携带一张门票,门票上有一个客体的标识和可访问的方式,卫兵把主体所持门票中的客体标识与自己手中的客体标识进行对比,以确定是否允许访问;在整个系统中,一个主体可能持有多张门票。

在面向名单的实现中,卫兵手中持有一份所有授权主体的名单及相应的访问方式,在访问活动中,主体出示自己的身份标识,卫兵在名单中查找,检查主体是否记录在名单上,以确定是否允许访问。

权能结构属于面向门票的结构,一张门票也称做一个权能。访问控制表(ACL)结构属于面向名单的结构。在访问控制矩阵的概念模式下,权能结构对应访问控制矩阵的行结构,行中的每个矩阵元素对应一个权能;ACL结构对应访问控制矩阵中的列结构,每一列对应一个ACL。权能与访问控制表如图1.7所示。

邵泽和施罗德给出的设计安全保护机制的八大原则如下。

(1)经济性原则(Economy of Mechanism)。安全保护机制应设计得尽可能地简单和短小。有些设计和实现错误可能产生意想不到的访问途径,而这些错误在常规使用中是察觉不出的,难免需要进行软件逐行排查等工作,简单而短小的设计是这类工作成功的关键。

图1.7 权能与访问控制表

(2)失败-保险原则(Fail-Safe Defaults)。访问判定应建立在显式授权而不是隐式授权的基础上,显式授权指定的是主体该有的权限,隐式授权指定的是主体不该有的权限。在默认情况下,没有明确授权的访问方式应该视为不允许的访问方式,如果主体欲以该方式进行访问,结果将是失败,这对于系统来说是保险的。

(3)完全仲裁原则(Complete Mediation)。对每一个客体的每一次访问都必须经过检查,以确认是否已经得到授权。

(4)开放性设计原则(Open Design)。不应该把保护机制的抗攻击能力建立在设计的保密性的基础之上。应该在设计公开的环境中设法增强保护机制的防御能力。

(5)特权分离原则(Separation of Privilege)。为一项特权划分出多个决定因素,仅当所有决定因素均具备时,才能行使该项特权。正如一个保险箱设有两把钥匙,由两个人掌管,仅当两个人都提供钥匙时,才能打开保险箱。

(6)最小特权原则(Least Privilege)。分配给系统中的每个程序和每个用户的特权应该是它们完成工作所必须享有的特权的最小集合。

(7)最少公共机制原则(Least Common Mechanism)。把由两个以上用户共用和被所有用户依赖的机制的数量减到最少。每一个共享机制都是一条潜在的用户间的信息通路,要谨慎设计,避免无意中破坏安全性。应证明为所有用户服务的机制能满足每个用户的要求。

(8)心理可接受性原则(Psychological Acceptability)。为使用户习以为常地、自动地正确运用保护机制,把用户界面设计得易于使用是根本。

邵泽和施罗德还指出:如何证明硬件和软件安全保护机制的设计与实现的正确性,是值得关注的重要研究课题。