通过进程行为的配伍禁忌提高操作系统安全性的方法

文档序号:6330442阅读:705来源:国知局

专利名称::通过进程行为的配伍禁忌提高操作系统安全性的方法
技术领域
:本发明涉及一种提高计算机操作系统安全性的方法,主要是一种通过进程行为的配伍禁忌提高操作系统安全性的方法。
背景技术
:操作系统的安全性主要体现为文件系统的安全性。为保证具体的文件和目录不受到不适当的访问,例如恶意或意外的读、写、修改、创建、执行,在操作系统领域发展起了一种称为“访问控制名单(ACL)”的机制与技术,为每个文件或目录(或其它资源)都配备一个“访问控制名单”,名单中详列对于哪些人或组允许什么样的访问权限(读/写/执行及其它),或者不允许什么样的访问;名单上没有的就不许访问,或只允许读。这个名单就是ACL,即“AccessControlList”,也翻译成“访问控制列表”或“访问控制表”。ACL在一定程度上提高了操作系统的安全性,所以早就在例如银行一类的机构中得到了应用,目前占主导地位的操作系统、即Windows和Unix/Linux、也都支持ACL。但是ACL基本上只是根据用户的身份控制其访问具体文件的权限,而身份在某些条件下是可以伪造、或者钻空子套取的,例如黑客攻击时就总是千方百计套取“超级用户”的身份,一旦有了“超级用户”的身份就可以通行无阻了。所以,特别是随着网络技术和应用的发展,ACL已经愈来愈不能满足系统安全性的要求了。为此,人们开始研究如何改进ACL、增强其功能,结果是出现了一种基于“安全策略(SecurityPolicy)”的机制和技术。这里所谓的“策略(Policy)”其实是“规则”的意思。在这方面特别值得一提的是美国“国家安全局(NationalSecurityAgency)”、即NSA、以及美国犹它大学Flask项目组所做的工作。在他们所做工作的基础上,上世记90年代末和本世记初,形成了对Linux操作系统的扩充和改进,称为SELinux,意为“增强了安全性的Linux”。从Linux的2.6版开始,SELinux已经成为Linux内核版本的一部分。而Windows,实际上也在其企业版中实现了类似的机制。有了安全策略机制,对文件系统的访问控制就在一定程度上扩展到了进程的行为控制,例如执行某个程序的进程只能为哪一些可执行文件(即程序)创建子进程,等等。但是,尽管如此,这种安全策略机制对进程的行为控制仍是静态的,而并没有根据进程在某一方面的实际行为控制其另一方面的行为。应该说,在操作系统对于文件等对象的保护机制中不考虑、不考察使用者的行为历史,是现有技术的缺陷,它在一定程度上降低了系统的安全性。在医药上有一种称为“配伍禁忌”的概念如果病人服了某种药,就不能再让其服用另外一种(或几种)什么药。实质上这就是根据行为主体在某一方面已有的行为控制其后续的另一方面的行为。所以,把“配伍禁忌”的概念引入操作系统的安全策略机制,用于进程的行为控制是很有实际意义的。例如可以把网络连接和对于敏感文件的访问定为配伍禁忌。这样,如果进程P已经建立了网络连接,然后要求读某个存有敏感信息的文件F,就应该加以拒绝;但是,对于同一个进程,如果没有建立网络连接,则允许其读文件F。反过来,如果进程P先读了文件F,然后要求建立网络连接,则同样应该加以阻拦,反正这二者互斥而不能兼得。所以,配伍禁忌实际上是对于互斥的说明和要求。总之,在同一进程中,如果行为A跟B构成配伍禁忌,那么其中任何一方的执行都以对方从未得到执行为条件。其实人们在社会生活中也常常在实行配伍禁忌,例如从事机密工作的人不得移民出国,而有“海外关系”的人可能也不适合机密工作,如此等等。配伍禁忌实际上就是“互斥(Mutual-Exclusive)”,例如让网络连接与某个目录下的文件访问互斥。这样,即使有个间谍软件获得了运行,并且套取了“超级用户”的身份,但是想要把这个目录下的文件通过网络连接发送出去,却不能得逞。显然,操作系统的安全性因此得到了改善。本发明的内容和特点就是把对于进程行为历史的考察纳入包括ACL在内的安全机制,对进程的行为按预定的配伍禁忌加以控制,从而达到提高系统安全性的目的。在本说明书中,“操作”与“行为”、“配伍禁忌”与“互斥”为同义词,可以互换使用。
发明内容针对现有技术的缺陷,本发明提供了一种在计算机操作系统中对进程的行为实行配伍禁忌,使不同行为按预定的规则实现互斥,其效果是提高了计算机操作系统的安全性。本发明所述的这种通过进程行为的配伍禁忌提高操作系统安全性的方法,主要步骤如下1.1)定义一组可能存在配伍禁忌、即可能要求互斥的关键行为;1.2)每个进程都有按一定形式记录的配伍禁忌规则;1.3)每个进程都按一定的形式记录下已经发生过的关键行为;1.4)关键行为在发生前须经过禁忌检查,根据当事进程的配伍禁忌规则和已经发生过的关键行为进行判断,如果已经发生过的关键行为中有与其构成配伍禁忌、即互斥的关键行为已经发生,该关键行为视为禁忌行为就不允许其发生。其中,上述的一组可能存在配伍禁忌、即可能要求互斥的“关键行为”,包括(但不限于)文件操作、网络操作、进程间通信、创建子进程等等。其中文件操作也可以按具体的操作类型细分成按读模式打开文件、按写模式打开文件、按执行模式打开文件、映射文件、读文件、写文件、执行文件、改变文件属性等数项。只有必须通过系统调用完成的操作才可以定义为关键行为。配伍禁忌只能发生在关键行为之间。关键行为的具体选取与具体的操作系统有关,因为不同操作系统提供的机制和有关的系统调用也有所不同;但是关键行为应该包括下列操作文件操作类为读而打开文件(包括目录)、为写打开文件(目录)、为执行打开文件,还可以包括实际的读文件、写文件、执行文件、映射文件。网络操作类建立/打开插口(Socket)、等待接收对方的连接要求(Listen)、要求连接到对方(Connect)、接受对方的连接要求(Accept)、等等。进程间通信指可以在进程间传递大量信息的进程间通信机制,包括创建管道、创建/连接/使用命名管道、创建/连接/使用本地(相当于Unix域)插口、创建/使用报文队列、创建/使用共享内存,创建/使用Windows中的LPC、Windows中跨进程的内存访问等。进程管理创建子进褶,执行某个可执行文件。系统管理关机,重启,动态安装内核模块,改变配伍禁忌规则。不过,关键行为的具体选取并不改变本发明对进程的行为实行配伍禁忌、使不同行为按预定的规则实现互斥的本质。本发明所述的这种通过进程行为的配伍禁忌提高操作系统安全性的方法,还可以通过下述方法进一步完善和补充。1.对ACL机制加以扩充,使具体的ACE在允许按指定模式打开目标文件的同时提供两种信息禁忌行为描述块与按指定模式打开此文件构成配伍禁忌的其它行为。配伍禁忌描述块对于可执行文件,执行此文件的进程所遵循的初始配伍禁忌。2.为每个进程配备一个关键行为的“配伍禁忌描述块”、一个记录着已有关键行为的“既有行为记录块”、和一个“禁忌行为描述块”。作用如下配伍禁忌描述块包括若干配伍禁忌描述项,每一个配伍禁忌描述项给出两组互斥的关键操作(但是同一组内的操作并不互斥,每一组内至少有一种操作),构成一对配伍禁忌。既有行为记录块按类型记录着本进程已经发生过的关键操作。禁忌行为描述块按类型记录着已知的禁忌、即禁止发生的关键操作。对于除打开文件以外的关键操作,根据配伍禁忌和已经发生的关键操作可以推算出禁忌行为。对于打开文件操作,则根据目标文件ACL提供的禁忌行为描述块动态加以扩充。3.每个进程的关键行为配伍禁忌描述块的原始内容可以来自下列来源,并可动态加以调整a)一个存储着安全策略的数据库,b)创建进程时给定的参数,c)系统默认的关键行为配伍禁忌描述块,d)所运行软件(可执行文件)的“访问控制名单(ACL)”中某个“访问控制项(ACE)”,e)继承父进程的配伍禁忌描述块,f)将来自父进程的配伍禁忌描述块与来自ACL的配伍禁忌描述块合并。4.对于运行过程中的关键行为请求,如果已经属于禁忌行为就不允许发生。5.对于运行过程中打开文件的要求,如果目标文件ACL中的相应ACE允许其打开,但是ACE中的禁忌行为描述块所述的禁忌行为(之一)业已发生,就不允许打开。6.在运行的过程中,如果获准打开某个文件,就要根据目标文件ACL中相应ACE项对禁忌行为的描述调整当事进程的禁忌行为描述块。例如,假定当事进程的配伍禁忌描述块中文件操作与网络操作原来并不互斥,但是却打开了一个要求与网络操作互斥的文件,就要将网络操作补充到当事进程的禁忌行为描述块中,从此禁止网络操作。7.对于实际发生的关键行为(除打开文件外),在当事进程的“既有行为记录块”中记录下本种行为的发生。并根据配伍禁忌描述块推算出应予禁止的关键操作、相应调整当事进程的禁忌行为描述块。8.上述各点中,凡是存储在ACL和ACE中、从而由ACL和ACE提供的信息,都可以改成集中存储在一个安全策略数据库中、需要使用时由安全策略数据库提供(向该数据库查询)。进一步,作为入侵检测的一种辅助手段,在根据配伍禁忌禁止当事进程的关键行为要求的同时,还可以把有违配伍禁忌的行为企图作为报警信息记录下来,甚至实时地发出警报。例如,发现某个进程企图访问载有敏感信息的文件,而此种行为已因配伍禁忌而被禁止,则一方面要拒绝其行为要求,另一方面也要发出警报,因为这很可能是因为入侵所引起。还应说明,无论是ACL还是安全策略数据库,都是由操作系统提供的文件安全机制,而关系式数据库中的“表”一般都是以文件形式存储的,所以ACL和安全策略数据库也就自然成为数据库安全机制。本发明所述的方法虽然也可以独立于ACL和安全策略数据库,但是与ACL或安全策略数据库相结合显然是更好、更有效的选择。而既然与ACL或安全策略数据库相结合,本发明所述的方法自然就提高了数据库的安全性。本发明有益的效果是将进程行为的配伍禁忌引入计算机操作系统,根据进程已有的行为控制其后续的行为,提高计算机操作系统的安全性。具体实施例方式下面结合实施例对本发明作进一步说明目前主流的操作系统就是Windows和Linux两种,所以下面以Linux为例说明本发明的实施,并指出在Windows操作系统中实施时的技术上的特殊之处。但是,只要有需要,本发明所述方法在别的操作系统中也可以实施,具体的实施细节(如程序代码以及数据结构的定义等)并不影响本发明的实质。实施例1、在Linux操作系统中的实施如上所述,配伍禁忌描述块的原始内容可以来自安全策略数据库,也可以来自可执行文件的ACL,而进一步的补充信息则都来自具体文件的ACL。但是,根据具体实现的不同,所有信息全部来自安全策略数据库、或者全部来自ACL、也并无不可。区别只是安全策略数据库是集中式的,而ACL则是分布式的。一般而言,将与每个具体文件有关的规则伴随该具体文件加以组织和存储,就是ACL;而若集中组织和存储,就成了安全策略数据库。对于本发明所述通过进程行为的配伍禁忌提高操作系统安全性的方法而言,这只是具体实现方式的不同,二者并无实质的不同,在难度上也没有多大差别(来自安全策略数据库甚至更为简单)。本实施例采用的是配伍禁忌描述块的原始内容来自ACL。另一方面,配伍禁忌描述块、既有行为记录块、禁忌行为描述块的实现也可以有多种不同的方式,其中之一就是位图方式。在位图方式中,一种关键行为对应着一个标志位;而行为的配伍禁忌、以及是否已经发生和受禁,则都以相应标志位的状态为1或0表示。一般而言,一个标志位只能表示一种、或一类的行为,而不是具体的一次行为,也不能表示行为的具体对象。例如“网络操作”是一类行为,而同类的行为可能反复进行多次,每次的对象(IP地址)也可能不同。在实际应用中,对于同一对象的多次操作是没有必要加以区别的而不区别具体的操作对象则有可能导致“扩大打击面”,但是对于安全性而言,这比漏过可能的攻击要好。再说,要在位图的基础上进一步对操作对象加以明细也不困难(下文还将有所涉及)。下面描述的是一个基于ACL、采用位图方式的实施例。Linux操作系统支持许多种不同的文件系统,但是就ACL机制的实现而言并无多大区别,所以下面以ext2文件系统为例说明本方法的实施。1.关键行为类型定义首先定义关键操作(行为)。本实施例用位图代表所有可能的关键操作的一个集合(例如受禁操作的集合,以及既有操作、即已发生操作的集合等等),而具体的每种操作就用一个标志位来代表。如果一个位图中的某个标志位为1,就表示这个操作存在于这个具体的集合中,否则就不在这个集合中。而配伍禁忌,则是两个集合、即两组操作之间的互斥。所以,关键操作的定义体现为标志位的定义#defineOP_FORK_CREATE_PROC0x00000001/*fork()或创建进程*/#defineOP_CREATE_PIPE0x00000002/*创建普通管道*/#defineOP_NAMED_PIPE0x00000004/*创建/打开命名管道*/#defineOP_MMAP0x00000008/*创建/打开共享内存区*/#defineOP_MMSG0x00000010/*创建报文队列*//*保留0x00000020至0x00000080用于Windows特有的操作*/#defineOP_SOCKET0x00000100/*创建/打开Socket*/#defineOP_CONNECT0x00000200/*与对方建立连接*/#defineOP_LISTEN0x00000400/*等待对方的连接要求*/#defineOP_ACCEPT0x00000800/*接受对方的连接要求*/#defineOP_RECV0x00001000/*接收报文*/#defineOP_SEND0x00002000/*发送报文*//*保留0x00004000和0x00008000用于别的网络操作*/#defineOP_FILE_OPEN0x00010000/*创建/打开文件(或目录)*/#defineOP_FILE_READ0x00020000/*读文件*/#defineOP_FILE_WRITE0x00040000/*写文件*/#defineOP_FILE_DELETE0x00080000/*删除文件*/#defineOP_FILE_MOVE0x00100000/*移动文件*/#defineOP_FILE_MAP0x00200000/*映射文件*/#defineOP_FILE_EXEC0x00400000/*执行文件(包括脚本)*/#defineOP_FILE_ACL0x00800000/*设置ACL*/#defineOP_REG_QUERY0x01000000/*查询注册表*/#defineOP_REG_UPDATE0x02000000/*改变注册表*//*保留0x04000000用于别的注册表操作*/#defineOP_RULE_SETUP0x08000000/*设置禁忌规则*/#defineOP_SHUTDOWN0x10000000/*关机*/#defineOP_REBOOT0x20000000/*重启*/#defineOP_INSMOD0x40000000/*动态安装内核模块*//*保留0x80000000用于外设操作,例如访问U盘等等*/这些标志位的定义是基于32位位图的,所以最多可以定义32种关键操作。这里实际定义的还不到32种,还保留了一些标志位用于将来的扩充。如果32位不够用,也可以采用64位的位图。这里有关文件操作的标志位用于总体的文件操作,相当于“总开关”,例如要是禁忌行为描述位图中的标志位OP_FILE_OPEN为1就表示从此以后任何文件都不能打开了,而若是0则需要进一步检查具体目标文件的ACL。对于关键操作标志位可以按要求加以组合,例如#defineOP_NETWORK(OP_SOCKET|OP_CONNECT|OP_LISTEN|OP_ACCEPT|OP_RECV|OP_SEND)这样,常数OP_NETWORK、即0x00003f00、就代表了所有的网络操作。如前所述,具体定义哪些关键操作(行为)、怎么定义,那都是具体的实现细节,这里给出的只是一个例子。2.数据结构有了关键行为的类型定义,还需要定义几种数据结构。第一种是“关键行为描述项”,用于ACL中各ACE内部的“禁忌操作描述项”以及各进程的“受禁操作描述块”和“既有行为记录块”。structcritical_op_entry{unsignedintmap;};可见这实际上就是一个操作位图,而有关的标志位已定义于上。这个数据结构用在ACE内部就是“禁忌操作描述项”。本来,所谓互斥或配伍禁忌至少是双边的,但禁忌操作描述项所描述的只是其中的一边,即已经被排斥的一边(可以是多种操作)。而另一边则是隐含的,这就是对具体目标文件的(按指定模式的)访问权、或者已经实施的文件访问。除用于ACL以外,关键操作描述项还用于具体进程的“受禁操作描述块”和“既有行为记录块”,例如“既有行为记录块”中的标志位OP_MMAP为1就表示这个进程曾经创建或打开过共享内存区(因而与别的进程有了此种通信手段)。这样,如果这个进程想要打开某个文件,而这个文件的ACL恰好又表明与共享内存区互斥,就会遭到拒绝。另一方面,如果“受禁操作描述块”中的标志位OP_MMAP为1,就表示创建或打开共享内存区已被禁止,原因是某种与其构成配伍禁忌的操作业已发生。这里要指出对于一般的关键行为,只要曾经发生就会被以标志位的形式记录在“既有行为记录块”中,但是对于具体文件的访问(打开)则并不记录在“既有行为记录块”中,而只是把因此而遭到禁止的操作添加到“受禁操作描述块”中。这样做的目的是使“既有行为记录块”的数据结构和处理得以简化。第二种数据结构是“配伍禁忌描述项”,这就是对互斥双方的完整描述了structexclusive_entry{unsignedintmap1;unsignedintmap2;};这里的map1和map2都是操作位图,代表着互斥的双方。其物理意义是位图map1中任何一种(标志位为1的)操作都与map2中的任何一种(标志位为1的)操作互斥,即构成配伍禁忌。例如,假定map1为(OP_FILE_WRITE|OP_REG_UPDATE),而map2为(OP_SOCKET|OP_FORK_CREATE_PROC),就表示只要有网络操作或创建了子进程、就既不允许写(任何)文件也不允许修改注册表(在Linux中意味着/etc下面的文件)。也就是说,这两组操作构成配伍禁忌。但是注意同一个位图中的各项操作并不构成配伍禁忌,例如map1中的写文件和修改注册表并不互斥。另一方面,不论是map1还是map2都不得为空,各自至少要有一个标志位为1。所以,一个“配伍禁忌描述项”就是一条配伍禁忌的规则。“配伍禁忌描述项”是构成“配伍禁忌描述块”的元素,后者可以包含多个“配伍禁忌描述项”、即多条配伍禁忌规则。第三种数据结构就是“配伍禁忌描述块”,一个配伍禁忌描述块可以由多个配伍禁忌描述项构成,用来记录一个进程的所有配伍禁忌。structexclusive_desc{int,total_size;intcurrent_size;structexclusiye_entryentries;};这里的total_size说明整个描述块的大小,而current_size说明目前描述块中有几个有效的描述项,数组entries[]的物理大小则取决于total_size。“配伍禁忌描述块”有两个用途·用来描述一个进程的配伍禁忌,此时只是存在于内存中,从属于具体的进程,成为进程的属性之一。·用在可执行文件的ACL中,为执行这个文件而创建的进程以此作为其原始的配伍禁忌。如前所述,ACL是随同其宿主文件一起存储在磁盘上的。这样,当创建一个子进程来执行某个可执行文件时,该文件ACL中的相应“配伍禁忌描述块”就成为子进程的初始配伍禁忌描述块。而若不创建子进程,直接由一个已经存在的进程来执行某个可执行文件时,则用该文件ACL中的相应“配伍禁忌描述块”替换其原有的配伍禁忌描述块。当然,倘若实施者觉得“合并”比“替换”更好,那也是可以的,这只是细节的变化而已。3.对ACL的扩充每个文件都可以有一个ACL,但也可以没有,如果没有就说明对此文件不加特别的访问控制。如果有的话,ACL总是与其“宿主”文件一起存储在磁盘上。在2.6.14版Linux的代码中,ACL的数据结构定义为structposix_acl{atomic_ta_refcount;unsignedinta_count;structposix_acl_entrya_entries;};结构数组a_entries表示其大小是可变的,字段a_ount的数值说明这个数组的实际大小。数组中的每一项都是一个posix_acl_entry数据结构,这就是ACE。所以,ACL就是一组ACE。每个ACE都是针对某个具体对象(用户、用户组)的对于其宿主文件的访问权限说明。ACE原来的数据结构定义则为structposix_acl_entry{shorte_tag;unsignedshorte_perm;unsignedinte_id;};这里的e_tag就是本项ACE的属性,也就是e_id的物理意义。例如当e_tag为ACL_USER时e_id就是用户号,当e_tag为ACL_GROUP时e_id就是用户组号。总之e_id就是访问者在某一方面的ID,即访问者的身份;e_perm则是允许的访问权限位图。在有些采用“安全号”、即SID代表当事进程身份的版本中,e_id也可以是当事进程的SID,为此应该为e_tag增加一种“标签”ACL_SID。为了将配伍禁忌信息引入到ACE中,可以在这个数据结构中增加一个禁忌操作描述项,以及一个指向配伍禁忌描述块的指针,变成structposix_acl_entry{shorte_tag;unsignedshorte_perm;unsignedinte_id;structexclusive_entrye_exclusive;unsignedinte_desc_offset;/*forexecutableonly*/};其意义和作用为对于e_tag和e_id所指明的访问者(某个组的成员或某个具体的用户),赋予e_perm所述的访问权限,但是与互斥描述项e_exclusive所述的各项操作构成配伍禁忌。这就是说如果对此文件使用了e_perm所述的访问权限(例如读、写),就不再可以实施e_exclusive所述的各项操作;而若是此前已经实施了其中的一项或几项操作,则e_perm所赋予的权限作废。显然,这并不是简单的条件访问。另一个结构成分e_desc_offset则仅用于可执行文件,对于普通文件没有意义。可执行文件(Executable)的ACE是特殊的,因为要描述两种不同意义上的禁忌。首先是启动执行目标文件的那个进程、即父进程、因此而受到的禁忌;另一方面是实际执行目标文件的子进程的配伍禁忌。对于配伍禁忌的描述是双边的,而且可能有不止一组。例如某个可执行文件可能有两组配伍禁忌网络操作跟创建进程,写文件跟修改注册表,这两组配伍禁忌是不能合并的,因为创建进程跟写文件和修改注册表二者都不互斥。所以,对于可执行文件的执行,需要为之提供一个配伍禁忌描述块(而不只是一个配伍禁忌描述项),而且描述块的大小也无法预定。这个描述块显然只能放在ACE数组的外面,此时就用上面的结构成分e_desc_ffset来说明相应配伍禁忌描述块的位置,即相对于ACL起点的位移。当然,一般的(非可执行)文件是没有配伍禁忌描述块的,此时e_desc_offset为0。由于配伍禁忌的引入,在一个文件(或目录)的ACL中对于同一个用户(或组)可以有不止一个的ACE,每一个ACE说明了对于一种或数种访问模式的权限规定和相应的禁忌。例如,可能有一个ACE是关于允许读操作的,另一个是关于允许执行的,两种情况下的禁忌不同,所以要分成两个ACE。如前所述,虽然这些ACE是关于文件的读、写、执行等等操作的,但是一般都把对ACL的检查放在打开文件的时候,因为企图写一个按读模式打开的文件本来就已经被操作系统禁止,操作系统内核已经有了这方面的保证。这里对禁忌行为的描述是位图形式的,这只能表明某一种行为(操作)是否属于禁忌,而并不涉及操作的具体对象。例如标志位OP_SOCKET为1表示排斥网络通信、而并没有说明具体的通信对象(例如IP地址)。同样,标志位OP_FILE_OPEN为1表示排斥所有的打开文件、而并没有说明具体的文件。如果把这里e_exclusive中的位图map改成带有指针性质的索引index,让它指向一个类似于ACL那样的“禁忌列表”,以表列的方式进一步加以明细说明,那也是可以的,例如可以仿照ACL和ACE的格式来定义这样的数据结构structforbidden_list{unsignedshortl_index;unsignedshortl_length;unsignedintl_offset[32];};这是禁忌列表的头部。其中的l_index为索引号,与ACE中提供的索引号相一致;而l_length表明整个禁忌列表的长度。数组l_offset[32]的作用在逻辑上类似于前面的位图,而实际的作用则类似指针。这个数组中的一个元素就相当于位图中的一个标志位,并以标志位在位图中的位置作为下标,例如原来OP_SOCKET定义为0x00000100,现在就定义为8。这样,比方说,要是需要排斥网络操作,下标为OP_SOCKET的表项就是与此有关的明细信息所在的位置、即相对于禁忌列表起点的位移(位移为0就表示不在禁忌之列,相当于标志位为0),而明细信息的数据结构则为structforbidden_item{unsignedshorti_op;unsignedshorti_perm;unsignedshorti_num;unsignedinti_id[1];};这里的i_op就是受禁操作的代码,例如OP_SOCKET。第二个成分i_perm表示后面所列的明细对象是属于“包含(INCLUDE)”还是“除外(EXCEPT)”。例如,当受禁操作为OP_SOCKET时,后面的数组i_id[]中是一串IP地址。但是,i_perm为“包含”时的意义是“禁止对这些IP地址的网络操作,别的(IP地址)都可以”;而i_perm为“除外”时的意义则是“除这些IP地址以外,别的都被禁止”。显然,数组i_id[]的内容因具体的关键行为而不同,而i_num说明了数组的实际大小。对文件操作的禁忌描述与此相似,只是数组i_d[]中都是字符串指针,指向实际的文件名或目录名。此外,数组i_id[]中也可以使用文件名或目录的“i-节点号”。与此相应,在i_perm中可以用一个标志位来表示数组i_id[]的内容是字符串指针还是i-节点号。4.算法由于本实施例采用位图,前述的三个描述块就成了位图。这样,每个进程都有三个实质上是位图的数据结构配伍禁忌描述块-其主体是一个配伍禁忌描述项结构数组,其中的每一个元素、即每一个描述项都包含一对位图,说明了构成配伍禁忌的两组操作。数组的大小可变,最小为0、即不存在配伍禁忌。最初的配伍禁忌、如果有的话、来自可执行程序文件的ACL。数组的大小在运行的过程中可能变化(一般是只扩充不缩小)。既有行为位图-进程已有行为的记录,一开始时为空,运行中每当发生关键行为时就将既有行为位图中的相应标志位置成1。同时,还要根据配伍禁忌描述找出因此而需要禁止的操作,并把这些需要禁止的操作增添到禁忌行为位图中、就是将禁忌行为位图中的有关标志位都置成1。但是对于文件的操作是个例外,对具体文件的操作无需记录在既有行为位图中,而只是把ACL所规定的禁忌增添到禁忌行为位图中。禁忌行为位图-表明本进程已经受到禁止的操作。其内容来自两个方面,一部分可以根据配伍禁忌描述和既有行为位图推算出来,另一部分则因文件访问(打开文件)而来自各目标文件的ACL。在运行中,禁忌行为位图的内容可能逐渐积累。与此相应,在进程控制块数据结构中要增加三个指针,分别指向这三个数据结构。由于采用位图,对于标志位的检查在操作/运算上是很简单的,例如要检查某项关键操作是否已被禁止,就只要将代表着相应标志位的常数(例如OP_MMAP)跟禁忌行为位图相与,结果为0表示位图中的相应标志位为0、即未被禁止,结果为非0则表示位图中的相应标志位为1、即已被禁止。另一方面,两个位图的合并也很简单,例如要把位图S合并到位图D中,就只要把两个位图相或,并以相或的结果取代D中原有的内容就可以了。对于本发明的实施,下列几个函数/过程是关键性的关键操作申请-在执行关键操作之前,要先通过这个函数提出申请,如果返回“允许”方可进行,并须对当事进程的受禁操作位图和既有行为位图作出相应调整。检查ACL-打开文件之前要检查目标文件的ACL,如果允许按所要求的模式打开方可进行,并须对当事进程的受禁操作位图作出相应调整。如果是按“执行”模式打开可执行文件,则ACL还可能提供初始的配伍禁忌描述块。创建子进程-创建子进程、让子进程执行指定的可执行文件,是比较复杂的关键操作。执行目标文件-由当事进程自己执行指定的可执行文件,也是比较复杂的关键操作。打开文件-打开文件是最重要的关键操作,事实上以往的安全措施基本上都是以打开文件为中心的。另一方面,这也是比较复杂的关键操作。其它关键操作-相对而言,除创建子进程、执行目标文件、和打开文件以外的其它关键操作就比较简单了。这些函数/过程构成本实施例的主体,其余的细节和附加操作就无需加以说明了。下面是对于这些过程的算法描述关键操作申请(输入参数进程控制块,操作类型,目标文件的ACL,要求的打开模式,空白配伍禁忌描述块;返回“允许”或“拒绝”)/*说明·目标文件的ACL和打开模式仅在操作类型为打开文件时才有意义,·空白配伍禁忌描述块仅在打开模式包含执行时才有意义。*/1.根据进程控制块中的三个指针找到当事进程的配伍禁忌描述块、既有行为描述块、和禁忌行为描述块;2.检查禁忌行为描述块,看所要求的操作是否已经属于禁忌,如果是就返回“拒绝”;3.如果所要求的操作是打开文件3.1)调用检查ACL(),以进程控制块,目标文件的ACL、要求的打开模式、当事进程的禁忌行为描述块、和空白配伍禁忌描述块为参数。目的在于检查目标文件的ACL,看是否允许按所要求的访问模式打开,如果不允许就返回“拒绝”,结束;3.2)目标文件ACL的相关ACE中是否规定了行为禁忌(实质上就是与打开目标文件构成配伍禁忌的行为)?3.3)如果是,就检查当事进程的既有行为描述块,看当事进程是否已经发生过与此(按给定的模式打开目标文件)构成配伍禁忌的操作;3.4)如果发生过,就返回“拒绝”,结束;3.5)如未发生过,就将ACE中规定的行为禁忌并入当事进程的禁忌行为描述块;3.6)返回“允许”,结束;/*说明如果打开文件的模式中包含执行,则此时空白配伍禁忌描述块中已有来自ACL的初始配伍禁忌描述块的内容*/4.如果所要求的操作不是打开文件4.1)将发生本类操作的信息写入既有行为描述块;4.2)在配伍禁忌描述块中找到与本次操作有配伍禁忌的所有操作,将这些操作合并到当事进程的禁忌行为描述块中;4.3)返回“允许”,结束。检查ACL(输入参数进程控制块,目标文件的ACL,要求的打开模式,禁忌行为描述块,空白配伍禁忌描述块;返回“允许”或“拒绝”)/*说明空白配伍禁忌描述块仅当打开模式包含执行时才有意义。*/对于ACL中的每一个ACE,循环执行下列过程,直至前进到下一个ACE或返回1.检查ACE的适用对象(如用户号、组号、SID等)与进程控制块中所述是否相符;2.如果不相符则前进到下一个ACE,如果所有ACE都不相符就返回默认的结果(一般为“拒绝”,但是也可以是“允许”,具体取决于系统的设置),结束;3.如果相符3.1)将所要求的打开模式跟ACE中的规定进行比较;3.2)如果按ACE中的规定不被允许就返回“拒绝”,结束;3.3)检查是否有禁忌描述,如果有就合并到作为参数的禁忌行为描述块中;3.4)打开模式是否为“执行”?如果不是就返回“允许”,结束;4.如果打开模式中包含“执行”,检查ACE中是否为子进程提供了配伍禁忌描述块;4.1)如果没有配伍禁忌描述块就返回“允许”(作为参数的空白配伍禁忌描述块仍为空白),结束;4.2)如果有配伍禁忌描述块,就在ACE所指示的位置上找到配伍禁忌描述块,并将其复制到作为参数的空白配伍禁忌描述块中(创建子进程以后将子进程的进程控制块中的配伍禁忌描述块指针设置成指向这个描述块);4.3)返回“允许”,结束。创建子进程(输入参数目标文件的路径和文件名)/*由子进程执行目标文件*/1.根据目标文件的路径和文件名获取其ACL;2.为子进程分配一个空白的配伍禁忌描述块;3.调用关键性操作申请(),以当事进程的进程控制块、操作类型为打开文件、目标文件的ACL、打开模式为读、映射和执行、以及子进程的配伍禁忌描述块为参数;4.如果返回结果为“拒绝”就出错返回,结束;5.否则调用常规的创建子进程操作;6.使子进程的进程控制块中的配伍禁忌描述块指针指向第2步所分配的配伍禁忌描述块,这是由ACL为子进程提供的初始配伍禁忌描述块(第3步已将ACL提供的初始配伍禁忌描述块复制到这个描述块中);6a.根据系统的设置,可以选择把父进程的配伍禁忌描述块复制到子进程的配伍禁忌描述块中,让子进程继承父进程的配伍禁忌描述块(丢弃由ACL提供的初始配伍禁忌描述块);6b.根据系统的设置,可以选择将父进程的配伍禁忌描述块合并到由ACL为子进程提供的初始配伍禁忌描述块中;7.为子进程分配一个空白的既有行为记录块和一个空白的禁忌行为描述块,并使子进程的进程控制块中的既有行为记录块指针和禁忌行为描述块指针分别指向这两个数据结构;8.返回第5步的结果,结束。执行目标文件(输入参数目标文件的路径和文件名)/*由本进程执行目标文件*/1.根据目标文件的路径和文件名获取其ACL;2.分配一个空白的配伍禁忌描述块;3.调用关键性操作申请(),以当事进程的进程控制块、操作类型为打开文件、目标文件的ACL、打开模式为读、映射和执行、以及空白配伍禁忌描述块为参数;4.如果返回结果为“拒绝”就出错返回,结束;5.否则调用常规的执行目标文件操作;6.将进程控制块中的配伍禁忌描述块指针改成指向第2步所分配的配伍禁忌描述块,这是由ACL为子进程提供的初始配伍禁忌描述块;6a.根据系统的设置,可以选择将原有的配伍禁忌描述块合并到由ACL提供的初始配伍禁忌描述块中;7.将当事进程的禁忌行为描述块和既有行为记录块清成空白;8.返回第5步的结果,结束。打开文件(输入参数目标文件的路径和文件名,打开模式)/*打开模式不含执行*/1.根据目标文件的路径和文件名获取其ACL;2.调用关键性操作申请(),以当事进程的进程控制块、操作类型为打开文件、目标文件的ACL、打开模式、以及NULL(表示没有空白配伍禁忌描述块)为参数;3.如果返回结果为“拒绝”就出错返回,结束;4.否则调用常规的打开文件操作;5.返回第4步的结果,结束。其他关键操作(输入参数操作类型)1.调用关键性操作申请(),以当事进程的进程控制块、操作类型、NULL(表示没有ACL)、0(打开模式无意义)、以及NULL(没有空白配伍禁忌描述块)为参数;2.如果返回结果为“拒绝”就出错返回,结束;3.否则调用常规关键操作;4.返回第3步的结果,结束。/*说明如果本操作涉及配伍禁忌,则与本次操作互斥的所有操作类型已合并到当事进程的禁忌行为描述块中*/为帮助理解,这里通过几个假设的情景来说明本发明的实施。假定有个进程,其进程号为1001,所执行的可执行文件为some-work。文件some-work及其所在目录的ACL都没有规定任何配伍禁忌,所以这个进程初始的配伍禁忌描述块和禁忌行为描述块均为空白。在运行中,这个进程先要求按读模式打开一个文件file1。文件file1的ACL表明1001号进程(根据其所属用户的权限)可以按读模式打开这个文件,但是有配伍禁忌,具体排斥的是网络操作。由于此时1001号进程尚未打开或建立任何网络插口(Socket),所以允许其打开文件,但是把禁忌行为描述块中的网络插口标志位设置成1,表示此种操作现在已经因涉及配伍禁忌而不在允许发生。然后,过了一会儿以后,1001号进程要求打开一个网络插口。由于禁忌行为描述块中的网络插口标志位为1,说明已经排斥网络插口操作,所以就拒绝打开网络插口。这样,就防止了文件file1的内容通过网络操作外泄。那么,为什么不是允许其打开网络插口,然后限制具体的文件读/写操作呢?那样当然也是可以的,同样也是本发明所述配伍禁忌方法的一种实现,但是每次读写文件都进行配伍禁忌的检查未免影响效率,而把配伍禁忌的检查放在打开文件的时候则影响不至于太大。另一方面,一旦打开一个文件以后,对此文件的访问也不一定非得通过读、写等系统调用才能进行,例如通过mmap()把文件映射到一个内存区以后就可以像读/写内存一样地访问这个文件了。当然,也可以通过规定文件映射与网络操作互斥(配伍禁忌)来加以杜绝,但是把配伍禁忌的检查放在打开文件的时候显然更简单、更自然,何况在打开文件的时候检查其ACL也更为方便。不过这种细节的不同并不影响本方法的实质。现在掉过头来,假定1001号进程在打开文件file1之前就先要求打开网络插口。此时禁忌行为描述块尚是空白,网络插口标志位为0,所以允许其打开网络插口。但是对网络插口的操作属于关键行为,所以把既有行为记录块中的相应标志位设置成1。然后,过了一会儿以后,1001号进程要求打开文件file1。根据file1的ACL,1001号进程允许打开这个文件、但是有配伍禁忌,禁忌之一就是网络操作。而既有行为记录块中的网络插口标志位为1,说明已经打开过网络插口,于是就拒绝打开文件file1。这样,同样也防止了文件file1的内容通过网络操作外泄。再假定在可执行文件some-work的ACL中规定了对于所创建子进程的行为配伍禁忌,具体是网络操作与子进程创建之间的互斥。这样,在进程some-work的初始配伍禁忌描述块中,一边的网络插口标志位为1、而另一边的子进程创建标志位为1。假定子进程在运行中先要求打开网络插口,因为此时禁忌行为描述块中的网络插口标志位为0,所以获得允许。但是把既有行为记录块中的网络插口标志位设置为1,同时根据配伍禁忌描述块推算出子进程创建应该受禁(因为与网络操作互斥),所以把禁忌行为描述块中的子进程创建标志位也设置成1。然后,当要求创建子进程的时候,由于禁忌行为描述块中的子进程创建标志位为1,就拒绝创建。反过来,假定操作的次序变成先要求创建子进程,后要求打开网络插口,则允许创建子进程而拒绝打开网络插口,具体的过程相同,只是所处理的标志位变了一下。5.规则的设置Linux为ACL的设置和处理提供了若干系统调用,用于从用户空间读取/写入某个目标文件的ACL。对于ACL中配伍禁忌描述块和禁忌行为位图的设置可以利用这些系统调用。此外,可以通过系统调用ioctl()或者对/proc目录下有关节点的操作获取和修改具体进程的配伍禁忌描述块等数据结构,具体可参考防火墙软件iptables中过滤策略的设置。稍有设备驱动程序开发经验的程序员对此不会感到困难。至于用户空间的处理,即通过人机交互形成一个ACL(数据结构),那就简单了,任何一个略有经验的程序员都可以毫不费力地加以实现。具体的人机交互方式可以是菜单式的、表格式的,也可以是命令行方式的,还可以使用Web网页。形成了一个文件的ACL以后,就可以通过系统调用setxattr()或ioctl()把它设置到内核中去。6.算法的实现和运用2.6.14版Linux代码中有个函数permission(),每当需要打开一个文件或目录时都要先调用这个函数,检测是否允许当前进程按所要求的模式(读/写/执行等等)打开目标文件。而permission(),则根据目标文件所在文件系统的种类调用该文件系统为此而提供的检测函数,对于ext2文件系统,这个检测函数是ext2_permission()。它又辗转调用一个函数ext2_check_acl(),这就是具体察看ACL的函数了。此外,Linux代码中对于每个系统调用都有与之对应的专用函数,例如对于系统调用connect(),内核中就有个对应的专用函数sys_connect()。对上述“关键操作申请”等过程的调用就可以结合进这些函数中。对此,有内核开发能力的程序员应该不会有困难。除内核中对每个系统调用都有个对应的函数之外,在用户空间的C程序库中也有相应的程序入口,所以也可以在用户空间实施本发明,只是需要在每个进程的用户空间为其设立一个数据结构(类似于Windows系统中的PEB)、作为进程控制块在用户空间的扩充。上面所述的实施例是基于ACL的。如果要采用安全策略数据库,那么实际上就是把所有文件的ACL集中存储在一个数据库里。作为另一个实施例,可以建立一个只有两个表的关系数据库,一个是“用户权限表”,另一个是“分组权限表”。前者的结构为文件名(完全路径+文件名),用户名,访问权限,禁忌操作描述,子进程的初始配伍禁忌描述块。另一个表的结构与此基本相同,只是把用户名改成组名。需要访问文件时(一般只是在打开文件时),先根据目标文件名和用户名查询“用户权限表”,以得到相应的访问权限、禁忌操作描述、以及子进程的初始配伍禁忌描述块。如果在“用户权限表”中查不到就进一步查询“分组权限表”。要是两个表中都查不到,那就是未作规定了,此时可根据系统配置按默认的方式处理(例如拒绝访问)。当然,对于一般的非可执行文件,数据库中的子进程初始配伍禁忌描述块为空白。如果操作系统采用“安全号”、即SID机制,则也可以把两个表合并成一个,而改成根据目标文件名和SID进行查询。其余的就跟前述基于ACL的实施例一样了。显然,对于有操作系统开发能力的程序员而言,要实现这样一个简单的数据库是毫无困难的,更何况还存在如MySQL一类的开源代码可以利用。实施例2、在Windows操作系统中的实施本发明所述方法也适用于Windows,在实施中可以参考上述的Linux实施例。在Windows系统中,每个用户都有一个“证件(Token)”,凡是属于这个用户的进程都使用这个证件。而每一个受保护的“对象”,则都有一个“安全描述项(SecurityDescriptor)”,ACL就是其中的一部分。让每个用户都有个证件实际上并不是特别有新意的概念,因为证件中的信息也只是与身份有关的信息,例如用户名、所属的组等等,而没有与行为和历史有关的信息。其好处只是在于例如用户名可以用字符串、而不必像在Linux中那样只能使用数值形式的用户号。Linux虽然没有“证件”的概念,但是有关的信息记录在每个进程的控制块中,实质上还是一样。Windows的ACL称为DACL(还有个SACL,用于不同目的),DACL的数据结构等等定义当然与Linux中的不同,但是基本的原理和过程都是一样的,在“方法”的层次上并没有什么不同。由于微软不公开其Windows操作系统的源代码,实际上只有微软自己才有可能来实施本发明所述的方法,但是这并不影响本发明作为一种方法、即根据配伍禁忌控制进程行为的实质。同样,对于别的操作系统,其(文件)访问控制名单机制以及进程管理机制的实现多少有些不同,但是它们的逻辑和实质是相同的,所以这并不影响本发明根据配伍禁忌控制进程行为的实质。附注本发明的效果只是在一定程度上提高了操作系统的安全性。在系统安全领域,没有一种方法可以一劳永逸地解决问题,也没有一种方法单独就可以保证安全。所以,每一种能够使系统安全性有所提高的方法和措施都是有意义、有价值的,实际使用中则应该综合使用各种有益的方法和措施。权利要求1.一种通过进程行为的配伍禁忌提高计算机操作系统安全性的方法,其特征是1.1)定义一组可能存在配伍禁忌、即可能要求互斥的关键行为;1.2)每个进程都有按一定形式记录的配伍禁忌规则;1.3)每个进程都按一定的形式记录下已经发生过的关键行为;1.4)关键行为在发生前须经过禁忌检查,根据当事进程的配伍禁忌规则和已经发生过的关键行为进行判断,如果已经发生过的关键行为中有与其构成配伍禁忌、即互斥的关键行为已经发生,该关键行为即视为禁忌行为而不允许其发生。2.根据权利要求1所述的通过进程行为的配伍禁忌提高计算机操作系统安全性的方法,其特征是2.1)与文件访问控制名单、即ACL机制相结合;2.2)文件的访问控制名单ACL中含有关于因按给定模式打开该文件而受禁的关键行为的说明;2.3)关键行为在发生前须经过禁忌检查,如属2.2所述禁忌行为就不允许其发生。3.根据权利要求1或2所述的通过进程行为的配伍禁忌提高计算机操作系统安全性的方法,其特征是子进程从父进程继承其配伍禁忌规则,作为子进程的初始配伍禁忌规则。4.据权利要求2所述的通过进程行为的配伍禁忌提高计算机操作系统安全性的方法,其特征是由可执行文件的访问控制名单ACL为子进程提供在执行该文件时的初始配伍禁忌规则。5.据权利要求2所述的通过进程行为的配伍禁忌提高计算机操作系统安全性的方法,其特征是子进程将可执行文件的访问控制名单ACL所提供的初始配伍禁忌规则与从父进程继承的配伍禁忌规则合并,作为子进程的初始配伍禁忌规则。6.根据权利要求1或2所述的通过进程行为的配伍禁忌提高计算机操作系统安全性的方法,其特征是用位图的形式实现配伍禁忌规则描述、已发生关键行为纪录、和受禁行为描述。7.根据权利要求1或2所述的通过进程行为的配伍禁忌提高计算机操作系统安全性的方法,其特征是用表列的形式对关键行为的具体操作对象加以明细说明。8.根据权利要求1或2所述的通过进程行为的配伍禁忌提高计算机操作系统安全性的方法,其特征是在拒绝禁忌行为的同时将此关键行为企图作为入侵报警信息按预定方式记录下来。全文摘要本发明涉及一种通过进程行为的配伍禁忌提高操作系统安全性的方法,主要步骤如下1.1)定义一组可能存在配伍禁忌、即可能要求互斥的关键行为;1.2)每个进程都有按一定形式记录的配伍禁忌规则;1.3)每个进程都按一定的形式记录下已经发生过的关键行为;1.4)关键行为在发生前须经过禁忌检查,根据当事进程的配伍禁忌规则和已经发生过的关键行为进行判断,如果已经发生过的关键行为中有与其构成配伍禁忌、即互斥的关键行为已经发生,该关键行为视为禁忌行为就不允许其发生。本发明有益的效果是将进程行为的配伍禁忌引入计算机操作系统,根据进程已有的行为控制其后续的行为,提高计算机操作系统的安全性。文档编号G06F9/46GK1945590SQ20061015446公开日2007年4月11日申请日期2006年10月30日优先权日2006年10月30日发明者毛德操申请人:毛德操
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1