多安全等级分区间通信的实现方法与流程

文档序号:18898968发布日期:2019-10-18 21:40阅读:513来源:国知局
本发明属于安全操作系统领域,特别涉及一种mils架构的多级安全操作系统的通信技术。
背景技术
::操作系统是管理和控制计算机硬件和软件资源的计算机程序,是运行其他应用软件的基础软件,操作系统自身的防危性对用户的信息安全起着至关重要的作用。以“wannacry”病毒为例,其核心问题即本地计算机执行了外来的木马程序,因此,从操作系统的角度来说,如果操作系统自身具备强制访问控制功能,即可有效地防止外来程序的运行,其次,“wannacry”病毒可以通过文件共享网络端口在校园网中迅速传播,这表明系统之间的通信路径并不安全,通过操作系统的可信通信路径机制即可有效防止类似安全威胁。由此可见,对安全操作系统的研究迫在眉睫,多个独立安全等级(multipleindependentlevelsofsecurityandsafety,mils)架构是由美国idaho大学的jim教授等人所提出的一种基于安全分离型内核的多级安全架构,该架构以分离的思想为基础,在同一个硬件平台上构建多个分离的不同安全等级的分区,分区之间的数据完全隔离,每个分区只能在自己的地址空间中运行,并且分区之间的通信由分离内核进行统一控制,该架构目前已经被当做构建高可信操作系统的有效手段,且已被美国以及英国等多个国家的军用系统所采用。为了通信安全,研究mils架构下的多级安全操作系统的通信方法具有重大意义。技术实现要素:为解决上述技术问题,本发明提出一种多安全等级分区间通信的实现方法,为系统中的每个分区分配一个安全等级,使分区间严格按照其安全等级进行通信,从而防止高安全等级分区的信息泄露到低安全等级的分区。本发明采用的技术方案为:多安全等级分区间通信的实现方法,为每个分区分配一个安全等级,各分区间按照其安全等级进行通信;包括:s1、建立两个分区间的通信环境,包括:用于分区间发送通知的事件通道的建立,以及用于进行数据交互的共享内存页的申请和授权;s2、当一个分区准备向另一个分区发送数据时,发送方将需要发送的数据写入共享内存页中,然后发送一个事件通知给接收方,通知接收方准备接收数据;s3、接收方接收数据时,首先接收到发送方的事件通知,然后进入相应的事件处理函数,从共享内存页中读取发送方的发送数据,完成此次数据交互;s4、当两个分区之间通信结束后,回收通信资源,包括共享内存页的释放,授权表项索引的释放、以及事件通道的销毁。步骤s1中还包括:当其中一个分区映射另一个分区申请的授权表项时,需要指定其映射方式为只读映射还是读写映射,具体检查以下两个权限:1)检查共享内存页的所有者为该分区指定的授权权限,如果授权时指定的权限为可读可写,那么映射时即可采用只读映射的方式也可采用可读可写映射的方式,而如果授权时指定的权限为只读权限,那么映射时只能进行只读映射,否则映射操作失败;2)检查该分区和共享内存页的安全等级,如果该分区执行只读映射,那么该分区的安全等级必须高于或者等于共享内存页的安全等级,而如果该分区执行可读可写映射,那么该分区的安全等级必须等于共享内存页的安全等级。步骤s1所述事件通道的建立过程为:a1、在分区内的客户操作系统中进行事件通道的初始化;a2、事件通知到达后触发中断;a3、将事件端口号转换为虚拟中断号;a4、根据虚拟中断号调用事件通知的服务函数。步骤s1具体为:s11、在两个分区之间,主动请求通信的为访问方,另一分区为被访问方,访问方通过hypervisor_event_channel_op()创建一个用于分区间通信的本地事件通道,并调用bind_evtchn_to_irqhandle()函数绑定本地的事件处理函数,然后将本地事件通道的端口号写入xenstore中,以供远端分区获得该事件端口号;s12、被访问方从xenstore中获得访问方创建的事件端口号,然后调用bind_interdomain_evtchn_to_irqhandler()函数绑定访问方的事件通道,该函数通过hypervisor_event_channel_op()陷入可信分离内核xen中,在xen中为被访问方分配一个本地事件通道,并将其绑定到访问方的远端事件通道上,最后将分配的本地事件通道返回给被访问方;s13、访问方申请共享内存页,并调用本地映射函数gnttab_map()将共享内存页映射到xen的地址空间中,以供被访问方之后进行页面映射,然后调用gnttab_alloc_grant_references()函数申请用于数据交互的授权表项索引,并调用gnttab_grant_foreign_access_ref()函数授权被访问方对这段共享内存的访问权限,最后访问方将授权表项的索引gr(granttablereference)写入xenstore中;s14、被访问方从xenstore中获得用于数据交互的共享内存页的索引gr,然后根据gr调用gnttab_map_refs()函数进行页面映射,使两个分区共享同一段内存空间,从而进行数据交互。步骤s14中调用gnttab_map_refs()函数时,gnttab_map_refs()函数的参数map_ops中的flags成员指定映射方式,具体为:根据flags和授权标志位分别检查授权权限和多级访问控制权限,如果授权标志位的值为gtf_readonly,则表明授权时指定的权限为只读权限,并且被访问方的安全等级必须高于或者等于访问方的安全等级,如果授权标志位不等于gtf_readonly,则表明授权时指定的权限为可读可写,那么,此时既可进行只读映射也可进行可读可写映射,但是进行只读映射时被访问方的安全等级必须高于或者等于访问方的安全等级,而进行可读可写映射时,两个分区的安全等级必须相等。本发明的有益效果:本发明通过为系统中的每个分区分配一个安全等级,使分区间严格按照其安全等级进行通信,从而防止高安全等级分区的信息泄露到低安全等级的分区;保障了mils架构下的多级安全操作系统的通信。附图说明图1为本发明实施例提供的事件通道结构结构;图2为本发明实施例提供的event_fifo结构;图3为本发明实施例提供的授权表结构;图4为本发明实施例提供的建立通信环境;图5为本发明实施例提供的分区间的事件通道。具体实施方式为便于本领域技术人员理解本发明的技术内容,下面结合附图对本
发明内容进一步阐释。分区之间的通信依赖于xen的事件通道(eventchannel)和授权表(granttable)机制,事件通道是一种通知机制,可以完成分区与分区之间、可信分离内核与分区之间的异步通知,而授权表机制是一种基于页面的授权访问机制,使两个分区之间可以共享同一个授权页面。(1)eventchannel事件通道是一种分区之间的通知机制,在实现分区间通信时尤为重要。基本思想就是一个分区发出事件并通知给另一个分区,从而使另一个分区陷入中断,回调相应的事件处理函数。通常主动发起通信的一方先申请事件通道,绑定事件处理函数,然后被动方通过该事件通道的端口号绑定主动方并获得本地的事件通道,并为本地的事件通道绑定相应的处理函数,之后通信双方就可以相互发出事件来通知对方了,如图1中分区a的port0和分区b的port1。事件通道的具体信息都由xen负责管理,对上层的分区来说,只需要获得事件通道的端口号和状态即可,对每一个分区来说,事件端口号从0开始,每次申请一个新的事件通道时,获得当前未被使用的第一个事件端口号,然后向系统注册一个虚拟中断号并绑定相应的事件处理函数,该中断号与事件端口号相对应,此后每次收到该事件端口号的事件通知时,则触发对应的虚拟中断。(2)共享内存授权进程间通信(ipc)是linux系统中的一个重要组成部分,如管道、消息队列、共享内存等。与进程间通信类似,xen也提供了共享内存机制用于分区间的通信,而授权表(granttables)则是xen管理共享内存的一种方式。授权表机制与linux管理共享内存类似,都有申请、映射、取消映射和释放等功能,但是授权表除了上诉的功能外,还有授权的功能。授权是指申请共享内存的分区需要指定其他哪些分区可以使用这段共享内存,并指定这些分区对这段共享内存的读写权限,未被授权的分区则无法访问这段共享内存。除此之外,授权表管理的共享内存大小是有限制的,以页面为基本单位,而linux的共享内存大小是任意的,因此,授权表是一种基于页面(pages)的授权访问机制。本发明为系统中的每个分区分配一个安全等级,使分区间严格按照其安全等级进行通信,从而防止高安全等级分区的信息泄露到低安全等级的分区。本发明的多安全等级分区间通信的实现方法,包括以下步骤:1、建立两个分区间的通信环境,包括用于分区间发送通知的事件通道的建立,以及用于进行数据交互的共享内存页的申请和授权等,在这个过程中,当其中一个分区映射另一个分区申请的授权表项时,需要指定其映射方式为只读映射还是读写映射,只读映射则只能从该共享内存页中读取数据,读写映射则可读可写,因此,在此处需要检查两个权限:1)检查共享内存页的所有者为该分区指定的授权权限,如果授权时指定的权限为可读可写,那么映射时即可采用只读映射的方式也可采用可读可写映射的方式,而如果授权时指定的权限为只读权限,那么映射时只能进行只读映射,否则映射操作失败;2)检查该分区和共享内存页的安全等级,如果该分区执行只读映射,那么该分区的安全等级必须高于或者等于共享内存页的安全等级,而如果该分区执行可读可写映射,那么该分区的安全等级必须等于共享内存页的安全等级,即只有相同安全等级的分区之间才能互相发送数据。2、当一个分区准备向另一个分区发送数据时,发送方将需要发送的数据写入共享内存页中,然后发送一个事件通知给接收方,通知接收方准备接收数据。3、接收方接收数据时,首先接收到发送方的事件通知,然后进入相应的事件处理函数,从共享内存页中读取发送方的发送数据,完成此次数据交互。4、当两个分区之间通信结束后,回收通信资源,包括共享内存页的释放,授权表项索引的释放、以及事件通道的销毁等。如图1中的序号所示,步骤1中事件通道的基本处理流程为:1)首先,在分区内的客户操作系统中进行事件通道的初始化,这会向操作系统注册一个物理中断int_evtchn_ppi及其相应的中断服务函数,此后,当该分区在接收到事件通知时,则会触发该中断,在实时操作系统rtems中是通过调用bsp_install_rtems_irq_handler(&event_channel_isr_data)来实现的,注册int_evtchn_ppi的中断服务函数为xen_arm_callback,2)事件通知到达后会触发中断,然后在中断服务函数中调用xen_hvm_evtchn_do_upcall(),这个函数会查询当前cpu的事件通道信息,由于在同一时刻可能收到多个事件通知,因此,在xen_hvm_evtchn_do_upcall()函数中调用evtchn_fifo_handle_events()从event_fifo的事件通道队列中获得优先级最高的事件通知的端口号,event_fifo中主要有两个实体,control_block和event_quene,他们的关系如图2所示。event_fifo中的事件通道队列有16个子队列,分别表示16个优先级的事件通道,数值越小,则优先级越高。control_block中包含两个内容,ready标志和head数组,read为32位整型,取低16位,每一位代表了一个优先级的事件通道队列,如果对应ready位置1,则表示该优先级的事件通道队列中有事件通知需要处理,head是一个大小为16的数组,每一个元素指向了相应优先级的事件通道子队列的队头。event_quene是一个大小为16的数组,每一个元素包含了4个内容:head和tail分别指向事件通道子队列的队头和队尾,prio表示该子队列中的事件通道的优先级,lock为该队列的保护锁。在事件通道子队列中,每个队列元素表示一个事件通道,每个事件通道用32位来表示,其中p为pending标志位,置1表示该事件通道有事件通知需要处理,m为mask标志位,置1表示屏蔽该事件通道的事件通知,l为link标志位,置1表示后面的link有效,link指向了队列中的下一个事件通道。3)将事件端口号转换为虚拟中断号,事件端口号和虚拟中断号的对应关系存储在evtchn_to_irq中,在查询到事件通知的端口号port后,调用handle_irq_for_port(port)函数,在这个函数中通过evtchn_to_irq将事件端口号转换为相应的虚拟中断号。evtchn_to_irq是一个二位数组,数组中存储的内容为每个事件通道对应的虚拟中断号。xen将分配给每个分区的事件通道划分成小组,总共nr_event_channels/event_per_bucket个组,nr_event_channels为允许分配给分区的最大的事件通道个数,event_per_bucket为每组的个数,因此,evtchn_to_irq的一维下标即组号,二位下标即组内的编号,根据这两个下标则可唯一确定一个事件通道。此后每次申请一个新的事件通道时,则将其对应的虚拟中断号存储在evtchn_to_irq中。4)最后根据evtchn_to_irq中获得的虚拟中断号调用generic_handle_irq()来回调相应的虚拟中断服务函数,即事件通知的服务函数,通常情况下,当该事件通道用于分区间通信时,其中断服务函数主要用于通知分区进行数据交互。步骤1中授权表在分区中的结构如图3所示,授权表的所有表项直接映射到xen底层所在的地址空间中,这样在分区中对表项进行操作时,则无需陷入到xen中进行,从而节省了系统开销,但是初始化和映射等相关的操作仍然需要通过hypercall陷入到xen中进行处理。从图3中可以看到,分区内对授权表的操作主要包括申请、释放、查询、授权、结束授权、映射和取消映射这7种。步骤1的建立通信环境,具体过程如图4所示,建立通信环境阶段主要包括分区间事件通道的建立和共享内存的申请及授权。图中的xenstore是一个分区间共享的存储系统,主要用于存储配置信息和状态信息,而不是大数据的传输,它由管理分区的xenstored应用程序进行维护,每个“客户”os在xenstore中都有自己的路径,并以字符串的形式存放了分区间通信时的一些配置信息,建立通信环境的主要流程如下:1)在a和b两个分区之间,主动请求通信的一方即分区a通过hypervisor_event_channel_op()创建一个用于分区间通信的本地事件通道,并调用bind_evtchn_to_irqhandle()函数绑定本地的事件处理函数,然后将本地事件通道的端口号写入xenstore中,以供远端分区获得该事件端口号;2)分区b从xenstore中获得分区a创建的事件端口号,然后调用bind_interdomain_evtchn_to_irqhandler()函数绑定远端分区a的事件通道,该函数通过hypervisor_event_channel_op()陷入可信分离内核xen中,在xen中为分区b分配一个本地事件通道,并将其绑定到分区a的远端事件通道上,最后将分配的本地事件通道返回给分区b;3)分区a申请共享内存页,并调用本地映射函数gnttab_map()将共享内存页映射到xen的地址空间中,以供分区b之后进行页面映射,然后调用gnttab_alloc_grant_references()函数申请用于数据交互的授权表项索引,并调用gnttab_grant_foreign_access_ref()函数授权分区b对这段共享内存的访问权限,最后分区a将授权表项的索引gr(granttablereference)写入xenstore中;4)分区b从xenstore中获得用于数据交互的共享内存页的索引gr,然后根据gr调用gnttab_map_refs()函数进行页面映射,使分区a和分区b共享同一段内存空间,从而进行数据交互,调用gnttab_map_refs()函数时,其参数map_ops中的flags成员指定了映射方式,需要根据flags和授权标志位分别检查授权权限和多级访问控制权限,如果授权标志位的值为gtf_readonly,则表明授权时指定的权限为只读权限,则此时只能进行只读映射(flags参数必须为gtf_readonly),并且分区b的安全等级必须高于或者等于分区a的安全等级(共享内存页的安全等级等于所有者的安全等级),而如果授权标志位不等于gtf_readonly,则表明授权时指定的权限为可读可写,那么,此时既可进行只读映射也可进行可读可写映射,但是进行只读映射时分区b的安全等级必须高于或者等于分区a的安全等级,而进行可读可写映射时,分区a和分区b的安全等级必须相等。步骤2与步骤3的通信阶段,当事件通道的绑定操作完成后,两个分区的事件通道的关系如图5所示,在各自的本地事件通道中,保存了对应的远端端口信息,当分区a准备向分区b发送事件通知时,只需要将事件通知发送到本地端口即可,xen根据本地事件通道中的远端端口信息,向分区b发送事件通知,从而完成分区a向分区b的通知过程,反之亦然。以分区a向分区b发送信息为例,通信的基本流程为:1)分区a将需要传送的数据写入a和b共享的授权表项中;2)数据成功写入共享内存页后,需要通过事件通道通知分区b读取数据,分区a通过hypervisor_event_channel_op()向本地的事件端口号发送事件通知,该操作的实质是xen根据分区a的事件通道中的远端端口号,设置远端事件通道的pending标志位为1,并通过中断注入向分区b发送事件通知;3)分区b接收到本地的事件通道中断,然后根据事件中断的处理流程,找到事件端口号对应的事件服务函数,然后开始接收分区a发送的数据,最后,数据接收成功后,置分区b的事件通道的pending标志位为0,结束此次数据传送。本领域的普通技术人员将会意识到,这里所述的实施例是为了帮助读者理解本发明的原理,应被理解为本发明的保护范围并不局限于这样的特别陈述和实施例。对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的权利要求范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1