发明内容
鉴于此,本申请的目的在于提供一种容器保护方法、处理器、操作系统及计算机设备,以改善现有容器的机密数据容易被窃取的问题。
本申请的实施例是这样实现的:
第一方面,本申请实施例提供了一种容器保护方法,所述方法包括:在访问目标页表项指向的内存页时,获取所述目标页表项中的容器ID,其中,所述页表项中记录有所述容器ID对应的容器的虚拟地址与实际物理地址之间的映射关系;获取所述容器ID对应的密钥,其中,不同的容器ID对应的密钥不同;基于所述密钥对往所述内存页中写入的数据进行加密。本申请实施例中,通过对不同的容器分配不同的内存资源和密钥,使得在访问目标页表项指向的内存页时,基于页表项中的容器ID获取对应的密钥对容器数据进行加解密,其次不同的容器ID使用不同的加密密钥,并且容器的数据会被加密后保存在内存中,从而保证容器的加密数据不能被其他容器解密,即使运行在特权级的恶意代码也只能读取密文,能有效阻止恶意代码偷取容器的机密数据。
结合第一方面实施例的一种可能的实施方式,获取所述容器ID对应的密钥,包括:基于事先保存的容器ID与密钥的对应关系获取所述容器ID对应的密钥。本申请实施例中,基于事先保存的容器ID与密钥的对应关系能快速获得容器ID对应的密钥,节约内存访问的时间。
结合第一方面实施例的一种可能的实施方式,获取所述容器ID对应的密钥,包括:判断记录表中是否存在所述容器ID,其中,所述记录表用于记录容器ID与密钥的对应关系;在为是时,基于所述记录表中的记录信息获取所述容器ID对应的密钥;在为否时,从预设密钥池中随机选取一未被使用的密钥作为所述容器ID对应的密钥,并在所述记录表中记录所述容器ID与其密钥的对应关系。本申请实施例中,在访问内存页的过程中,在获取容器ID对应的密钥时,先判断记录表中是否存在该容器ID,若存在,表明在之前访问该容器ID对应的内存时,便已经为该容器ID分配过密钥,若不存在,则为该容器ID分配密钥,并将容器ID与其密钥的对应关系记录在记录表中,以便后续在访问该容器ID对应的内存时,基于该记录表获取保存的密钥,该方式无需事先为容器ID分配密钥,其密钥的分配过程可以是在访问内存页的过程中进行。
结合第一方面实施例的一种可能的实施方式,在基于事先保存的容器ID与密钥的对应关系获取所述容器ID对应的密钥之前,所述方法还包括:在接收到所述容器发送的密钥分配指令时,获取所述密钥分配指令中携带的所述容器ID;判断是否已经为所述容器ID分配过密钥;在为否时,为所述容器ID分配密钥,并保存分配的密钥与所述容器ID的对应关系。本申请实施例中,通过事先为容器ID分配密钥,使得在后续访问内存页的过程中可直接基于保存的容器ID与密钥的对应关系快速获得对应的密钥,并且在为容器ID分配密钥时,判断是否已经为其分配过密钥,以避免重复分配,使得同一个容器ID分配多个不同的密钥。
第二方面,本申请实施例还提供了一种容器保护方法,所述方法包括:在接收到来自容器的内存访问请求时,获取所述访问请求中携带的容器ID;判断是否已经为所述容器ID分配过对应的内存资源;在为否时,为所述容器ID分配内存资源,并在页表项中记录所述容器ID、以及所述容器的虚拟地址与实际物理地址之间的映射关系;其中,所述页表项中的所述容器ID用于获取与所述容器ID对应的密钥,所述密钥用于对所述容器的内存数据进行加解密。本申请实施例中,通过为不同的容器分配不同的内存资源,并在页表项中增加容器ID,以管理容器内存,使得后续可以基于容器ID获取相应的密钥进行加解密,进而实现以容器为单元对内存数据做加密保护,从而保证容器的加密数据不能被其他容器解密。
第三方面,本申请实施例还提供了一种处理器,所述处理器包括:内存管理单元,用于在访问目标页表项指向的内存页时,获取所述目标页表项中的容器ID,其中,所述页表项中记录有所述容器ID对应的容器的虚拟地址与实际物理地址之间的映射关系;所述内存管理单元,还用于获取所述容器ID对应的密钥,其中,不同的容器ID对应的密钥不同;所述内存管理单元,还用于基于所述密钥对往所述内存页中写入的数据进行加密。
结合第三方面实施例的一种可能的实施方式,所述内存管理单元,还具体用于:基于事先保存的容器ID与密钥的对应关系获取所述容器ID对应的密钥。
结合第三方面实施例的一种可能的实施方式,所述处理器还包括安全处理器,所述安全处理器,用于在所述内存管理单元基于事先保存的容器ID与密钥的对应关系获取所述容器ID对应的密钥之前,在接收到密钥分配指令时,获取所述密钥分配指令中携带的所述容器ID;所述安全处理器,还用于判断是否已经为所述容器ID分配过密钥;在为否时,所述安全处理器,还用于为所述容器ID分配密钥,并将分配的密钥与容器ID的对应关系保存在所述内存管理单元的寄存器中。本申请实施例中,在内存管理单元基于事先保存的容器ID与密钥的对应关系获取容器ID对应的密钥之前,利用安全处理器来为不同的容器分配不同的密钥,由于安全处理器与内存管理单元独立运行,通过安全处理器来管理密钥,能进一步提高数据的安全性。
结合第三方面实施例的一种可能的实施方式,所述内存管理单元,还具体用于:判断记录表中是否存在所述容器ID,其中,所述记录表用于记录容器ID与密钥的对应关系;在为是时,基于所述记录表中的记录信息获取所述容器ID对应的密钥;在为否时,从预设密钥池中随机选取一未被使用的密钥作为所述容器ID对应的密钥,并在所述记录表中记录所述容器ID与其密钥的对应关系。
第四方面,本申请实施例还提供了一种操作系统,所述操作系统包括:内存管理模块,用于在接收到来自容器的内存访问请求时,获取所述访问请求中携带的容器ID;所述内存管理模块,还用于判断是否已经为所述容器ID分配过对应的内存资源;在为否时,所述内存管理模块,还用于为所述容器ID分配内存资源,并在页表项中记录所述容器ID以及所述容器的虚拟地址与实际物理地址之间的映射关系;其中,所述页表项中的所述容器ID用于获取与所述容器ID对应的密钥,所述密钥用于对所述容器的内存数据进行加解密。
第五方面,本申请实施例还提供了一种计算机设备,包括内存、如上述第三方面实施例和/或结合第三方面实施例的任一种可能的实施方式提供的处理器和如上述第四方面实施例提供的操作系统。
本申请的其他特征和优点将在随后的说明书阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请实施例而了解。本申请的目的和其他优点可通过在所写的说明书以及附图中所特别指出的结构来实现和获得。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行描述。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。同时,在本申请的描述中诸如“第一”、“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
再者,本申请中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。
如图1所示,为本申请实施例提供的计算机设备的系统架构示意图。该计算机设备的系统架构包括:处理器、内存、操作系统、容器引擎。其中,处理器可以是中央处理器(Central Processing Unit,CPU)、图形处理器(Graphics Processing Unit,GPU)、网络处理器(Network Processor,NP)等,也还可以是其他类型的处理器,如应用处理器,当然在某些产品中,应用处理器就是CPU。操作系统作为设备的核心,是管理计算机硬件与软件资源的计算机程序,操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。内存用于暂时存放处理器需要的运算数据,以及与硬盘等外部存储器交换的数据,如该内存可以是双倍速率同步动态随机存储器(Double Data Rate,DDR)、随机存取存储器(Random Access Memory,RAM)等。容器引擎(Container Engine)是容器系统的核心,容器引擎能够创建和运行容器。Docker Engine是目前最流行的容器引擎。
为了抵御攻击者可以通过恶意特权级代码偷取容器的机密数据,本申请利用容器引擎(Container Engine)来为不同的容器(Container)分配ID(IDentity);利用操作系统的内存管理模块(Memory Management,MM)来为不同的容器分配内存资源(Random AccessMemory,RAM),使用页表项(Page Table Entry)记录容器虚拟地址与实际物理地址之间的映射关系,并在页表项中增加容器ID来管理容器内存。在容器中引入内存加密技术,利用处理器中的安全处理器来为不同的容器配置不同的加密密钥,其中,不同的容器ID对应的密钥不同。利用处理器中的内存管理单元的硬件加解密功能,利用容器ID获取密钥来对容器的内存数据进行加密,以保护容器的数据安全。
为了便于理解,下面结合图1所示的计算机设备的系统架构示意图来进行说明。
在创建或形成容器时,利用容器引擎(Container Engine)来为不同的容器(Container)分配唯一ID,其中,不同的容器对应的ID不同,以便于管理。其中,容器是为了实现某些特定功能,将涉及到的所有软件程序封装在一起的集合,一个容器可能只运行一个应用程序,也可能同时运行多个应用程序。应用程序(APP)可能包含多个二进制文件(Bins)和动态链接库(Libs),容器内的多个应用程序使用的资源可以共享。不同的容器之间以及容器与普通应用程序之间使用的资源相互隔离。
当容器运行访问内存时,也即内存管理模块(MM)接收到来自容器的内存访问请求时,获取该访问请求中携带的容器ID,判断是否已经为该容器ID分配过对应的内存资源,若内存管理模块检测到该容器ID没有分配过内存资源,便为其分配内存资源,并在页表项中记录该容器ID以及该容器ID对应的容器的虚拟地址与实际物理地址之间的映射关系,然后将该页表项保存在内存(RAM)中。其中,不同的容器对应的内存资源不同,进而实现以容器为单元对内存数据做加密保护。本申请中通过在页表项中增加容器ID,以管理容器内存,使得后续可以基于容器ID获取相应的密钥进行加解密。本申请中使用页表项中的部分比特位来表示容器ID,用来对容器的内存进行统一管理,此外,该容器ID也是内存管理单元获取密钥的标识。其中的CID表示使用该页内存的容器的ID,如表1所示。
表1
… |
CID |
Physical Page Base Address(物理页基础地址) |
… |
当处理器中的内存管理单元(MMU)在访问目标页表项指向的内存页时,获取该目标页表项中的容器ID(例如CID);然后获取该容器ID对应的密钥;再基于该密钥对往对应的内存页中写入的数据进行加密,以及对从该内存页中读取的数据进行解密。其过程示意图如图2所示。其中,内存管理单元将加密数据写入内存,以及从内存中获取数据的过程已经为本领域技术人员所熟知,不再赘述。
其中,内存管理单元在获取该容器ID对应的密钥时,可以是基于事先保存的容器ID与密钥的对应关系获取该容器ID对应的密钥。在该种实施方式中,容器ID与密钥的对应关系可以是由处理器中的安全处理器来获得,并将其保存在内存管理单元的寄存器中。在内存管理单元基于事先保存的容器ID与密钥的对应关系获取容器ID对应的密钥之前,利用安全处理器来为不同的容器分配不同的密钥,并将对应关系保存在内存管理单元的寄存器中。该过程可以是安全处理器在接收到容器发送的密钥分配指令时(其中,密钥分配指令中携带有容器的容器ID),例如,安全处理器在接收SET_KEY(cid)指令时,获取该指令中携带的容器ID,为该容器ID分配密钥,并将分配的密钥与容器ID的对应关系保存在内存管理单元的寄存器中。为了避免重复分配,使得同一个容器ID分配多个不同的密钥,一种实施方式下,安全处理器在获得该指令中携带的容器ID后,安全处理器判断是否已经为该容器ID分配过密钥,若已经为该容器ID分配过密钥,则结束;若没有为该容器ID分配过密钥,则安全处理器为该容器ID分配密钥,并将分配的密钥与容器ID的对应关系保存在内存管理单元的寄存器中,该过程示意图如图3所示。其中,由于安全处理器与内存管理单元独立运行,利用安全处理器来管理密钥,为不同的容器分配不同的密钥,能进一步提高数据的安全性。
其中,安全处理器在分配容器ID的密钥时,需要确保容器ID的密钥唯一,不同的容器ID使用不同的加密密钥,从而保证容器的加密数据不能被其他容器解密。安全处理器的固件产生的随机数可作为容器的加解密密钥。安全处理器在为容器ID分配密钥时,会判断该随机数是否已经被使用,若是,则重新生成新的随机数并再次判断,直至得到没有被使用的随机数为止。
可选地,在该种实施方式中,也可以是由MMU来为容器ID分配密钥,也即MMU在接收到容器发送的密钥分配指令时,获取该指令中携带的容器ID,MMU判断是否已经为该容器ID分配过密钥,若已经为该容器ID分配过密钥,则结束;若没有为该容器ID分配过密钥,则MMU为该容器ID分配密钥,并将密钥与容器ID的对应关系保存在内存管理单元的寄存器中,其原理可以参阅上述安全处理器为容器分配密钥的过程。
内存管理单元在获取该容器ID对应的密钥时,也可以是判断记录表中是否存在该容器ID;当该记录表中存在该容器ID(在为是时),则基于该记录表中的记录信息获取该容器ID对应的密钥。其中,该记录表用于记录容器ID与密钥的对应关系。当该记录表中不存在该容器ID(在为否时),从预设密钥池中随机选取一未被使用的密钥作为该容器ID对应的密钥,并在该记录表中记录该容器ID与其密钥的对应关系,以便于后续内存管理单元再次访问该目标页表项指向的内存页时,直接基于该记录表即可获得这个容器ID的密钥。在该种实施方式中,在访问内存页的过程中,在获取容器ID对应的密钥时,先判断记录表中是否存在该容器ID,若存在,表明在之前访问该容器ID对应的内存时,便已经为该容器ID分配过密钥,若不存在,则为该容器ID分配密钥,并将容器ID与其密钥的对应关系记录在记录表中,以便后续在访问该容器ID对应的内存时,基于该记录表获取保存的密钥,该方式无需事先为容器ID分配密钥,其密钥的分配过程可以是在访问内存页的过程中进行。此外,除了是从预设密钥池中随机选取一未被使用的密钥作为该容器ID对应的密钥外,还可以是采用现场随机生成随机数的方式来获得容器ID对应的密钥。
本申请使用内存加密技术对容器的内存数据进行加密,容器在运行时,容器的数据会被加密后保存在内存中,即使运行在特权级的恶意代码也只能读取密文。由于加密密钥由内存管理单元管理,软件无法获取密钥,无法对密文进行解密而得到原始数据,进而达到保护容器的目的,能有效阻止恶意代码偷取容器的机密数据。
请参阅图4,为本申请实施例提供的一种应用于处理器(如上述的处理器)的容器保护方法,下面将结合图4对其所包含的步骤进行说明。
步骤S101:在访问目标页表项指向的内存页时,获取所述目标页表项中的容器ID。
当处理器中的MMU在访问目标页表项指向的内存页时,获取该页表项中的容器ID。其中,所述页表项中记录有容器ID对应的容器的虚拟地址与实际物理地址之间的映射关系。
步骤S102:获取所述容器ID对应的密钥。
在获取到容器ID后,获取该容器ID对应的密钥。其中,不同的容器ID对应的密钥不同。
作为一种实施方式,获取所述容器ID对应的密钥可以是:基于事先保存的容器ID与密钥的对应关系获取所述容器ID对应的密钥。在该种实施方式中,在基于事先保存的容器ID与密钥的对应关系获取所述容器ID对应的密钥之前,所述方法还包括:在接收到容器发送的密钥分配指令时,获取所述密钥分配指令中携带的所述容器ID;判断是否已经为所述容器ID分配过密钥;在为否时,为所述容器ID分配密钥,并保存分配的密钥与容器ID的对应关系。例如,处理器中的安全处理器在接收到容器发送的密钥分配指令密钥分配指令时,首先获取所述密钥分配指令中携带的容器ID,然后判断是否已经为所述容器ID分配过密钥,若已经分配过,则结束,若没有分配过,则随机产生一未被使用过的密钥作为该容器ID对应的密钥,并将该密钥与容器ID的对应关系保存在MMU的寄存器中。
作为又一种实施方式,获取所述容器ID对应的密钥可以是:判断记录表中是否存在所述容器ID,其中,所述记录表用于记录容器ID与密钥的对应关系;在为是时,基于所述记录表中的记录信息获取所述容器ID对应的密钥;在为否时,从预设密钥池中随机选取一未被使用的密钥作为所述容器ID对应的密钥,并在所述记录表中记录所述容器ID与其密钥的对应关系。
步骤S103:基于所述密钥对往所述内存页中写入的数据进行加密,以及对从所述内存页中读取的数据进行解密。
在获取到容器ID对应的密钥后,基于该密钥对内存数据进行加解密,往内存写数据时对数据进行加密,从内存读数据时对数据进行解密。
本申请实施例所提供的方法,其实现原理及产生的技术效果和前述装置实施例相同,为简要描述,方法实施例部分未提及之处,可参考前述装置实施例中相应内容。
请参阅图5,为本申请实施例提供的一种应用于操作系统(如上述的Host OS)的容器保护方法,下面将结合图5对其所包含的步骤进行说明。
步骤S201:在接收到来自容器的内存访问请求时,获取所述访问请求中携带的容器ID。
当操作系统的内存管理模块(MM)在检测到来自容器的内存访问请求时,获取所述访问请求中携带的容器ID。其中,该内存访问请求中携带有当前容器的容器ID。
步骤S202:判断是否已经为所述容器ID分配过对应的内存资源。
内存管理模块在获取到容器ID后,判断是否已经为所述容器ID分配过对应的内存资源,在为是时,则结束,在为否时,则执行步骤S203。
步骤S203:为所述容器ID分配内存资源,并在页表项中记录所述容器ID、以及所述容器的虚拟地址与实际物理地址之间的映射关系。
在为否时,也即没有为所述容器ID分配过对应的内存资源时,则为所述容器ID分配内存资源,并在页表项中记录所述容器ID、以及所述容器的虚拟地址与实际物理地址之间的映射关系。其中,所述页表项中的所述容器ID用于获取与所述容器ID对应的密钥,所述密钥用于对所述容器的内存数据进行加解密。
本申请实施例所提供的方法,其实现原理及产生的技术效果和前述装置实施例相同,为简要描述,方法实施例部分未提及之处,可参考前述装置实施例中相应内容。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。