安全可信第二次练习说明
1.概述
本次练习旨在让选手了解TCM可信度量和可信报告的基本原理,特别是可信度量结果的具体含义。在初赛中,将利用可信度量结果辅助实现安全功能。TCM,即可信密码模块,是信息系统信任的源头,国际上的tpm模块与TCM在功能上基本一致。TCM内部可以创建多个密码对象,与一般的密码设备不同之处,在于其内部的一系列信任逻辑。这些逻辑限制了外部对TCM中这些密码对象的访问,但同时使得这些密码对象与系统硬软件环境、使用者等产生了绑定关系。我们可以限定特定用户、特定设备、特定软件、指定安全策略下才能够使用TCM中的特定密码对象。通过这一方式,可以对系统安全提供有效的支持。2.PCR寄存器、可信度量与可信报告
PCR寄存器就是TCM中密码对象的一个代表, 它是可信度量功能实现的基础。PCR自身的原理与区块链有相通之处,其为一个32字节的寄存器,在系统启动等过程中重置其取值,而对其的每一次写操作,写入寄存器的值都是旧值和写入值的sm3哈希结果。这样的作用就是假设我们预期一个写入序列被写入到某PCR中,如果写入过程正确,我们可以预期其结果。但如果其中有一个值不符合预期,那么PCR中的值也将与预期不同,且由于哈希算法的特性,攻击者即使有写入pcr的权力,他在系统保持运行的情况下,想把PCR中的值改回预期也是一个不可能的任务。实际应用时,写入PCR的内容一般是具体安全机制对下一个安全环节的度量结果,也就是每一个写入值可以代表一个安全机制的全部或部分状态。如果这些安全机制互相配合,形成了一个完整的保护体系,那么PCR中的内容就可以证明除第一个环节(可信根)外,所有这些安全机制是否按照我们的预期运行了。这时,PCR值就起到了对系统进行安全度量的作用,这就是PCR用于可信度量的基本原理。我们可以看到,PCR只是一个不可否认的记账器,关键还是在于各安全机制自身的功能能否有效配合,以及能否准确度量下一个安全环节。PCR虽然可以用来记账,但从PCR中读出的值一旦离开了TCM,就可能被别人篡改。为了让远端用户也能确定本地PCR的取值,TCM提供了可信报告功能,这一功能依托TCM中一种与用户身份和平台绑定的平台身份密钥(PIK), PIK是带证书的,远程用户可以通过CA验证PIK的可信,而基于PIK签名的对系统内部PCR的报告,则是在TCM内部生成,属主本身也无法伪造的。这种向远端证明本地PCR取值的报告,就叫做可信报告,如下图所示:3.TCM的主动访问方式
TCM的功能非常强大,但作为一个功能复杂、计算资源有限的密码设备,对其的访问也是非常地复杂。特别是国际上提出的被动访问模式下,TCM访问在于间、空间和参数维度的复杂性汇总在其接口中,几乎无法化简。这里时间维指TCM的访问命令序列需要考虑时序上的相关性;空间维指系统不同层次访问TCM时,应用层并行到底层串行访问方式转换所带来的复杂性;参数维指各层调用中参数的选择以及不同命令之间参数的相关性所带来的复杂性。这使得TCM的被动使用门槛极高。我国提出的主动免疫可信系统,使用一个逻辑独立的系统执行安全可信功能,为TCM访问的化简提供了解决方案。主动免疫可信的核心是可信软件基,其中包含主动监控机制与可信支撑机制。我们可以通过主动监控机制搜集系统中的可信密码需求,可以是对应用透明的,通过在系统调用拦截应用行为实现,也可以主动接收应用发来的可信密码请求,然后,利用可信软件基中存储的系统对象、密码对象的信息以及对象之间的关联关系,确定访问tcm的流程、参数,完成tcm访问,并对访问结果进行解析处理,最终得到应用/系统易懂的安全结论。如下图所示。这一机制与国际上的被动TCM调用方式相比,有着明显的优势。4.练习任务
本次练习,我们将在一个模拟环境中,体验主动免疫机制实现可信报告的过程,并且尝试在可信支撑机制中实现将PCR取值转化为安全策略组合的过程,这一过程在初赛中将是某道安全可信赛题解题的关键环节。模拟环境为tcmenv_exec,GPL开源,可以在http://gitee.com/biparadox/tcmenv_exec.git 网址下载。它还需要可信软件基框架cube-1.3, SM2算法开源代码gm_sm2_master,tcm模拟器cube-tcm, 主动免疫tcm功能组件集cube_tcmplugin的支持。tcmenv_exec该模拟环境由一个节点(instance/node下的实例)和一个服务器(instance除node外的其它实例)组成。其中和可信报告相关的组件仅有服务器端的 server、crypt_hub(服务器端可信密码服务)和客户端的term(终端)、crypt_user(客户端密码服务)以及user(模拟用户操作)。系统环境初始化过程很复杂,但与我们考察内容无关,大家配成一次后,就可以持续使用。如果配置环境遇到困难,也可考虑直接使用提供配好环境的镜像。初始化过程的目的就是让节点用户拥有一个pik以及其它两个功能密钥,同时让服务器端获得用户所有密钥的公钥,并验证了pik的可信。可信报告的过程中,用户终端term和服务器端server都有一个模块key_event,该模块用来监控报告过程,并产生对可信密码服务的请求,但key_event并不需要了解可信密码结构的细节。而crypt_user和crypt_hub中则有一个模块key_manage,它接收key_event发来的请求,转化成可信密码功能组件可识别的格式,并转交给各功能组件完成可信密码功能,并将结果处理后回传给key_event,完成可信密码服务。运行测试程序,可以看到整个可信报告过程将自动运行并最后完成校验,返回0表示验证成功。但验证成功后,我们得到的只是带有PCR寄存器值的运行结果,这个值到底是什么含义仍需解析。并且我们提供的pcr报告和验证结果都是key_event无法识别的,需要key_manage对其进行解读,翻译成key_event乃至普通用户可以理解的内容。我们在tcmenv_exec/src/key_manage.c
里标注了需添加代码的位置,寄存器值是在tcmenv_exec/instance/crypt_hub/policy.list
中选择部分项的策略摘要值(return_value)项写入,name项为策略名。pcr中写入该策略代表该种策略被选用,我们须在key_manage的相关位置确定选用了那些策略,并将策略形成 ”策略1|策略2|策略3...” 这种格式的字符串,作为key_event可读取的内容。更具体的编程指导将于后续提供。第1期补充内容
赛题环境搭建注意事项
- 如对Linux权限控制不熟练,请全程使用root用户进行配置
- 推荐采用centos7 或 Ubuntu20.04进行配置,其他发行版Linux可能会有兼容性问题
- 推荐将
cube-1.3
cube-tcm
cube_tcmplugin
放在root/centoscloud
目录下,若没有,请创建该目录 - 如果运行和结果不符,可以通过查看该目录的
cube_err.log
定位问题
cube-1.3篇
请在cube-1.3/proc/plugin
目录下创建名为uuid
的文件,随便填入数字,保存退出即可
TCM篇
编译需要环境:
gcc
make
linux-headers(ubuntu/debian/kali)
kernel-devel(centos/rhel)
可以通过注释vtcmd_dev.c
文件的第六十三行后再重新编译的方式解决
练习题
在公众号中发送关键字“安全可信练习题”,获取两期练习题。
安全可信计算第1期:
+ + + + + + + + + + +
还没有评论,来说两句吧...