发明内容
为了解决上述远程验证带来的问题,本发明提供了一种本地验证式的可信启动方法。
本发明公开一种基于TPM的本地验证式启动方法,包括:
步骤1,使用TPM封存功能部署生成需要验证程序的度量标准值;
步骤2,在GRUB Stage2中验证虚拟机监视器、Linux Kernel、Ramdisk 的完整性;
步骤3,在GRUB Stage2的最后阶段将动态库、模块、可执行程序的基准值传递到Linux Kernel;所述的动态库、模块、可执行程序是指Linux操作系统启动过程中加载的动态库、内核模块、可执行程序;
步骤4,在Linux Kernel的相应功能处对动态库、模块、可执行程序分别进行完整性验证。
所述的基于TPM的本地验证式启动方法,所述步骤1还包括:
步骤21,使用SHA算法生成虚拟机监视器、Linux Kernel、Ramdisk的完整性验证标准值Integrity-Valuve-Group1,生成动态库Lib-1至Lib-n、模块Mod-1至Mod-n、可执行程序Prog-1至Prog-n的完整性验证标准值Integrity-Valuve-Group2;
步骤22,用户获得TPM的使用权,使用TPM封存功能,指定相应的PCR寄存器,并根据步骤21得到的Integrity-Valuve-Group1和Integrity-Valuve-Group2分别生成Block-Data-Group1和Block-Data-Group2;
步骤23,将步骤22得到的Block-Data-Group1和Block-Data-Group2分别转储到特定的文件目录下生成File-Data-Group1和File-Data-Group2。
所述的基于TPM的本地验证式启动方法,所述步骤2还包括:
步骤31,在GRUB Stage2中,调用TPM的SHA引擎服务分别计算虚拟机监视器、Linux Kernel、Ramdisk的度量值存储到变量M-hash1、K-hash2、R-hash3中;
步骤32,在GRUB Stage2中已经支持文件系统,将步骤23得到的位于特定文件目录下的File-Data-Group1读到GRUB Stage2设置的缓冲区Array-Data-Group 1中;
步骤33,使用TPM的解封功能将缓冲区Array-Data-Group1中的数据集解析为Unsealed-M-hash1、Unsealed-K-hash2、Unsealed-R-hash3三个数据块,这三个数据块分别对应虚拟机监视器、Linux Kernel、Ramdisk的标准值;
步骤34,分别验证M-hash1与Unsealed-M-hash1、K-hash2与Unsealed-K-hash2、R-hash3与Unsealed-R-hash3的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段。
所述的基于TPM的本地验证式启动方法,所述步骤3还包括:
步骤41,将步骤23,得到的File-Data-Group2读到GRUB Stage2设置的缓冲区Array-Data-Group2中;
步骤42,将缓冲区Array-Data-Group2中的数据拷贝到内核的特殊位置Flag-Array-Data-Group2中。
所述的基于TPM的本地验证式启动方法,所述步骤4还包括:
步骤51,在内核初始化时刻的适当阶段使用TPM的解封功能将位于Flag-Array-Data-Group2中的数据集解封为Unsealed-Data-Group2;
步骤52,在动态库加载阶段使用SHA算法分别计算出Lib-1至Lib-n的度量值存储到Lib-1-hash至Lib-n-hash中;同时,从Unsealed-Data-Group2中解析出Lib-1至Lib-n的标准值Unsealed-Lib-1至Unsealed-Lib-n;分别验证Lib-1-hash与Unsealed-Lib-1,Lib-2-hash与Unsealed-Lib-2直至Lib-n-hash与Unsealed-Lib-n的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段;
步骤53,在模块加载阶段使用SHA算法分别计算出Mod-1至Mod-n的度量值存储到Mod-1-hash至Mod-n-hash中;同时,从Unsealed-Data-Group2中解析出Mod-1至Mod-n的标准值Unsealed-Mod-1至Unsealed-Mod-n;分别验证Mod-1-hash与Unsealed-Mod-1,Mod-2-hash与Unsealed-Mod-2直至Mod-n-hash与Unsealed-Mod-n的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段,其中Unsealed-Mod-1和Unsealed-Mod-n分别为第1个模块解封后的解封值、第n个模块解封后的解封值;
步骤54,在可执行程序加载阶段使用SHA算法分别计算出Prog-1至Prog-n的度量值存储到Prog-1-hash至Prog-n-hash中;同时,从Unsealed-Data-Group2中解析出Prog-1至Prog-n的标准值Unsealed-Prog-1至Unsealed-Prog-n;分别验证Prog-1-hash与Unsealed-Prog-1,Prog-2-hash与Unsealed-Prog-2直至Prog-n-hash与Unsealed-Prog-n的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段;其中Prog-1-hash和Prog-n-hash分别为第1个可执行程序度量值、第n个可执行程序度量值,Unsealed-Prog-1和Unsealed-Prog-2、Unsealed-Prog-n分别为第1个可执行程序的解封值、第2个可执行程序的解封值、第n个可执行程序的解 封值,其中Prog-1-hash和Prog-n-hash为第1个程序度量值存储的变量名、第n个程序度量值存储的变量名。
本发明的有益效果为:
本发明的优点在于提供了一种基于TPM的可信验证式启动方法,该方法对启动过程中加载的各个功能程序进行本地验证,避免了远程验证带来的通信开销和密钥暴露的机会,非常适合Linux系统的可信启动以及当前云计算环境下虚拟机的可信启动,具有良好的市场前景和应用价值。
具体实施方式
下面给出本发明的具体实施方式,结合附图对本发明做出了详细描述。
为了解决上述远程验证带来的问题,本发明提供了一种本地验证式的可信启动方法。
所述可信启动是Linux系统的可信启动,也可是支持Xen虚拟化技术的特权域和非特权域的可信启动,可信启动使用的引导程序为Trusted GRUB。Trusted GRUB引导程序的过程是:可信度量核心根CRTM(Core Root of Trustfor Measurement)→GRUB Stage1→GRUB Stage2→Linux Kernel→Linux系统启动完成。在这个过程中,每个功能实体在将控制权交给下一个功能实体之前,都要对实体的完整性进行度量,最终平台启动过程中各个阶段的完整性度量值都保存在TPM(Trusted Platform Module)的PCR寄存器中。GRUB-IMA对于Trusted GRUB的改进在于每个阶段的度量值都要和位于远程的标准值进行验证,若两个值不同,说明了可信启动过程中运行的程序遭受了非法篡改。
本发明在Trusted GRUB的基础上,把GRUB-IMA进行远程验证的工作放到本地系统上进行,有效的解决了远程验证弊端;同时,从GRUB Stage2开始,增加了对虚拟机监视器、动态库、模块、可执行程序的可信验证。
具体来说,本发明针对基于TPM解封技术进行本地验证式可信启动方法 包括下列步骤:
A.使用TPM封存功能部署生成需要验证程序的度量标准值,其实现方法为:
A1.使用SHA(Secure Hash Algorithm)算法生成虚拟机监视器、LinuxKernel、Ramdisk的完整性验证标准值Integrity-Valuve-Group1,生成动态库Lib-1至Lib-n、模块Mod-1至Mod-n、可执行程序Prog-1至Prog-n的完整性验证标准值Integrity-Valuve-Group2。
A2.用户获得TPM的使用权,使用TPM封存(TPM_Seal)功能,指定相应的PCR寄存器,并根据A1得到的Integrity-Valuve-Group1和Integrity-Valuve-Group2分别生成Block-Data-Group1和Block-Data-Group2。
A3.将A2得到的Block-Data-Group1和Block-Data-Group2分别转储到特定的文件目录下生成File-Data-Group1和File-Data-Group2。
B.在GRUB Stage2中验证虚拟机监视器、Linux Kernel、Ramdisk的完整性,其实现方法为:
B1.在GRUB Stage2中,调用TPM的SHA引擎服务分别计算虚拟机监视器、Linux Kernel、Ramdisk的度量值存储到变量M-hash1、K-hash2、R-hash3中。
B2.在GRUB Stage2中已经支持文件系统,将A.中A3.得到的位于特定文件目录下的File-Data-Group1读到GRUB Stage2设置的缓冲区Array-Data-Group1中。
B3.使用TPM的解封(TPM_Unseal)功能将缓冲区Array-Data-Group1中的数据集解析为Unsealed-M-hash1、Unsealed-K-hash2、Unsealed-R-hash3三个数据块,这三个数据块分别对应虚拟机监视器、Linux Kernel、Ramdisk的标准值。
B4.分别验证M-hash1与Unsealed-M-hash1、K-hash2与Unsealed-K-hash2、R-hash3与Unsealed-R-hash3的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段。
C.在GRUB Stage2的最后阶段将动态库、模块、可执行程序的基准值传递到Linux Kernel,其实现方法为:
C1.将A.中A3.得到的File-Data-Group2读到GRUB Stage2设置的缓 冲区Array-Data-Group2中。
C2.将缓冲区Array-Data-Group2中的数据拷贝到内核的特殊位置Flag-Array-Data-Group2中。
D.在Linux Kernel的相应功能处对动态库、模块、可执行程序分别进行完整性验证,其实现方法为:
D1.在内核初始化时刻的适当阶段使用TPM的解封功能将位于Flag-Array-Data-Group2中的数据集解封为Unsealed-Data-Group2。
D2.在动态库加载阶段使用SHA算法分别计算出Lib-1至Lib-n的度量值存储到Lib-1-hash至Lib-n-hash中;同时,从Unsealed-Data-Group2中解析出Lib-1至Lib-n的标准值Unsealed-Lib-1至Unsealed-Lib-n;分别验证Lib-1-hash与Unsealed-Lib-1,Lib-2-hash与Unsealed-Lib-2直至Lib-n-hash与Unsealed-Lib-n的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段。
D3.在模块加载阶段使用SHA算法分别计算出Mod-1至Mod-n的度量值存储到Mod-1-hash至Mod-n-hash中;同时,从Unsealed-Data-Group2中解析出Mod-1至Mod-n的标准值Unsealed-Mod-1至Unsealed-Mod-n;分别验证Mod-1-hash与Unsealed-Mod-1,Mod-2-hash与Unsealed-Mod-2直至Mod-n-hash与Unsealed-Mod-n的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段。
D4.在可执行程序加载阶段使用SHA算法分别计算出Prog-1至Prog-n的度量值存储到Prog-1-hash至Prog-n-hash中;同时,从Unsealed-Data-Group2中解析出Prog-1至Prog-n的标准值Unsealed-Prog-1至Unsealed-Prog-n;分别验证Prog-1-hash与Unsealed-Prog-1,Prog-2-hash与Unsealed-Prog-2直至Prog-n-hash与Unsealed-Prog-n的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段。
下面结合附图,通过以Xen的特权域启动为例实现一套具体的基于TPM的可信验证式启动进一步描述本发明。
实现基于TPM的可信验证式启动的方法流程如图1所示,本发明的方法包括:A.使用TPM封存功能部署生成需要验证程序的度量标准值;B.在GRUB Stage2中验证虚拟机监视器、Linux Kernel、Ramdisk的完整性;C.在 GRUB Stage2的最后阶段将动态库、模块、可执行程序的度量标准值传递到Linux Kernel;D.在Linux Kernel的相应功能处对动态库、模块、可执行程序分别进行完整性验证。具体一种实施方式如下:
A.使用TPM封存功能部署生成需要验证程序的度量标准值,其具体实现为:
A1.使用SHA(Secure Hash Algorithm)算法生成虚拟机监视器、LinuxKernel、Ramdisk的完整性验证标准值集Integrity-Valuve-Group1,生成动态库Lib-1至Lib-n、模块Mod-1至Mod-n、可执行程序Prog-1至Prog-n的完整性验证标准值集Integrity-Valuve-Group2。
本步骤中,分别计算出xen-4.1.0.gz、vmlinuz-2.6.32.12-0.7-tcg、initrd-2.6.32.12-0.7-tcg的完整性验证标准值如图2所示;为了说明问题,只选一个动态库、一个模块、一个可执行程序,分别计算出动态库/usr/lib/libc.so、模块/sys/module/libata/initstate、可执行程序/bin/bash的完整性验证值如图3所示。
A2.用户获得TPM的使用权,使用TPM封存(TPM_Seal)功能,指定相应的PCR寄存器,并根据A1得到的Integrity-Valuve-Group1和Integrity-Valuve-Group2分别生成Block-Data-Group 1和Block-Data-Group2。
本步骤中,需要用命令TPM_takeownership获得TPM的使用权,使用封存功能时pcr寄存器的映射位图、用户指定的密钥、Integrity-Valuve-Group1和Integrity-Valuve-Group2作为输入,输出为Block-Data-Group1和Block-Data-Group2。
A3.将A2得到的Block-Data-Group1和Block-Data-Group2分别转储到特定的文件目录下生成File-Data-Group1和File-Data-Group2。
本步骤中,只是将数据块转存到文件系统中,非常简单,不再赘述。
B.在GRUB Stage2中验证虚拟机监视器、Linux Kernel、Ramdisk的完整性,其具体实现为::
B1.在GRUB Stage2中,调用TPM的SHA引擎服务分别计算虚拟机监视器、Linux Kernel、Ramdisk的度量值存储到变量M-hash1、K-hash2、R-hash3中。
本步骤中,使用BIOS中断的方式调用TPM的SHA引擎服务,BIOS中 断号是0x1a,子功能号是bb05。计算后TPM返回xen-4.1.0.gz、vmlinuz-2.6.32.12-0.7-tcg、initrd-2.6.32.12-0.7-tcg的度量值存储到变量M-hash1、K-hash2、R-hash3中。
B2.在GRUB Stage2中已经支持文件系统,将A.中A3.得到的位于特定文件目录下的File-Data-Group1读到GRUB Stage2设置的缓冲区Array-Data-Group1中。
本步骤中,只要使用普通文件读功能就能够将文件系统中文件的内容读到数据缓冲区,非常简单,不再赘述。
B3.使用TPM的解封(TPM_Unseal)功能将缓冲区Array-Data-Group1中的数据集解析为Unsealed-M-hash1、Unsealed-K-hash2、Unsealed-R-hash3三个数据块,这三个数据块分别对应虚拟机监视器、Linux Kernel、Ramdisk的标准值。
本步骤中,使用TPM的解封功能时需要与A2.相一致的PCR寄存器的映射位图、与A2.相一致用户指定的密钥、Array-Data-Group1作为输入,输出为Unsealed-M-hash1、Unsealed-K-hash2、Unsealed-R-hash3。
C.在GRUB Stage2的最后阶段将动态库、模块、可执行程序的基准值传递到Linux Kernel,其实现方法为:
C1.将A.中A3.得到的File-Data-Group2读到GRUB Stage2设置的缓冲区Array-Data-Group2中。
本步骤中,本步骤的方法同B2.,不再赘述。
C2.将缓冲区Array-Data-Group2中的数据拷贝到内核的特殊位置Flag-Array-Data-Group2中。
本步骤中,采用内存拷贝的方法将Array-Data-Group2中的数据复制到内核中预设空间标志Flag的Flag-Array-Data-Group2中。
D.在Linux Kernel的相应功能处对动态库、模块、可执行程序分别进行完整性验证,其实现方法为:
D1.在内核初始化时刻的适当阶段使用TPM的解封功能将位于Flag-Array-Data-Group2中的数据集解封为Unsealed-Data-Group2。
本步骤中,需要在内核文件的init/main.c中解封,解封的方法同B3.,不再赘述。
D2.在动态库加载阶段使用SHA算法分别计算出Lib-1至Lib-n的度量值存储到Lib-1-hash至Lib-n-hash中;同时,从Unsealed-Data-Group2中解析出Lib-1至Lib-n的标准值Unsealed-Lib-1至Unsealed-Lib-n;分别验证Lib-1-hash与Unsealed-Lib-1,Lib-2-hash与Unsealed-Lib-2直至Lib-n-hash与Unsealed-Lib-n的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段。
本步骤中,需要在内核文件的mm/mmap.c中实现SHA算法的调用,验证时只需要简单的数值比较即可。
D3.在模块加载阶段使用SHA算法分别计算出Mod-1至Mod-n的度量值存储到Mod-1-hash至Mod-n-hash中;同时,从Unsealed-Data-Group2中解析出Mod-1至Mod-n的标准值Unsealed-Mod-1至Unsealed-Mod-n;分别验证Mod-1-hash与Unsealed-Mod-1,Mod-2-hash与Unsealed-Mod-2直至Mod-n-hash与Unsealed-Mod-n的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段。
本步骤中,需要在内核文件的kernel/module.c中实现SHA算法的调用,验证时只需要简单的数值比较即可。
D4.在可执行程序加载阶段使用SHA算法分别计算出Prog-1至Prog-n的度量值存储到Prog-1-hash至Prog-n-hash中;同时,从Unsealed-Data-Group2中解析出Prog-1至Prog-n的标准值Unsealed-Prog-1至Unsealed-Prog-n;分别验证Prog-1-hash与Unsealed-Prog-1,Prog-2-hash与Unsealed-Prog-2直至Prog-n-hash与Unsealed-Prog-n的值是否一致,只要其中的一对不一致,终止系统启动,否则,继续系统启动的下一个阶段。
本步骤中,需要在内核文件的fs/exec.c中实现SHA算法的调用,验证时只需要简单的数值比较即可。
本领域的技术人员在不脱离权利要求书确定的本发明的精神和范围的条件下,还可以对以上内容进行各种各样的修改。因此本发明的范围并不仅限于以上的说明,而是由权利要求书的范围来确定的。