【摘要】可信计算在主机主动安全保护中发挥着越来越重要的作用,但实现方式和权衡各不相同。本文介绍了可信计算的基本组成部分,结合系统安全目标、威胁手段和LinuxIMA完整性子系统,简要描述了GBank可信计算的第一阶段实现。转自@TWT社区,作者:Copper序言可信计算目前在主机主动安全防护中发挥着越来越重要的作用,但在具体实现中存在不同的实现方式和取舍。本文介绍了可信计算的基本组成部分,结合系统安全目标、威胁手段和LinuxIMA完整性子系统,简要描述了GBank可信计算的第一阶段实现。什么是可信计算?一个通用的定义是在计算和计算的同时进行安全保护,使计算结果始终与预期一致,整个计算过程可测可控,不受干扰;是一种计算与防护并存的主动免疫新计算模式。密码学方法通过身份识别、状态测量和机密存储,及时识别“自”和“非自”组件,防止系统受到破坏。可信平台特性:保护能力、完整性测量、存储和报告以及证明能力。从主机上电、BIOS启动、GRUB菜单读取、Linux内核加载、应用程序启动,一步步建立信任链,并将测量值存入平台配置寄存器(Platformconfigureregister,PCR),如下图所示。远程管理平台可以远程确认被管理服务器中的PCR值和测量日志,获取平台当前状态,并与期望值进行比较,判断平台是否可信。TPM可信计算技术的核心部分,是可信计算所必需的核心硬件,包括数字签名、身份认证、硬件加密、访问授权、信任链建立、完整性度量哈希值存储、密钥管理等模块,基于对用户身份、应用环境、网络环境等进行不同的底层认证,彻底杜绝恶意窃取信息和病毒侵害,实现可信启动(从系统上电到操作系统启动的测量,写入测量日志),解决安全问题底层硬件设施。TCM是我国采用自行设计的密码算法提出的TPM模块。Metrics从2.6.30开始,IMA被引入到Linux内核中。IMA是一个开源的可信计算组件。IMA维护一个运行时指标列表。在硬件TPM芯片的情况下,这个列表的哈希完整性度量值可以固定在TPM中,这样即使攻击可以破坏度量列表,也可以找到它;即使访问了恶意文件,恶意文件的度量值(哈希值)也会在访问文件之前提交给TPM,恶意代码无法删除这个度量值(如果没有硬件TPM芯片,理论上,仍然存在未发现恶意代码的情况(伪造下面的假指标列表的可能性)。整体而言,IMA的度量、识别和验证并不是为了保护系统的完整性,其目标至少是在威胁攻击发生时/之后被发现,以便及时处理。TPM+LinuxIMA构成了对Linux操作系统的信任实现。下面是框架示意图:基于LinuxTPM-IMA的可信计算框架底层实现示意图。它如何配合监控系统的安全性和可信度?让我们从系统结合Linux操作系统的整体安全目标说起。1.系统总体安全目标系统的安全目标主要有完整性、真实性和机密性三个方面。1.完整性(Integrity)完整性是最基本的安全属性。没有完整性,就无法讨论真实性或机密性,因为真实性和机密性机制本身可能会受到损害。对于一个文件,完整性通常被理解为“不可变的”,即一旦安装,该文件就不能被恶意或意外修改改变。从密码学的角度来看,哈希验证可以用来检测文件内容是否发生了变化。通过比较前后文件的hash是否一致,可以发现文件是否发生了变化。在极端情况下,完整性不仅意味着不可变,而且意味着“不可变”,即没有任何操作可以修改文件。例如BSD操作系统有不可变文件的概念,只能在单用户管理模式下更改。流行的Android操作系统还将其所有系统文件保存在一个分区中,该分区在正常情况下是只读的,只能在开机时通过恢复程序进行修改。不可变系统虽然提供了更高的完整性,但很难正确更新或修补系统组件。IMA遵循可信计算组织(TCG)的完整性开放标准,结合哈希验证和不可变机制,打造全新的完整性解决方案。BSD和Android的做法是让文件本身不可变,而TCG的做法是将这些不可变文件的哈希值存储在硬件中,例如可信平台模块(TPM)、移动可信模块(MTM)或类似设备.IMA维护所有访问文件的哈希列表。如果有TPM等硬件安全组件,即使是对哈希表的软件攻击也不会得逞。通过管理平台对变更、损坏进行集中监控、判断和预警。2.真实性真实性是完整性概念的延伸。不仅是泄密的完整性,而且文件的出处也是已知的。例如,我们不仅知道一个文件没有被恶意修改,而且我们还知道这个文件是真实供应商的原始文件。简单的散列不足以保证真实性。数字签名技术可以保证文档的真实性,使攻击者无法伪造来源证据。通常使用RSA等公钥签名来保证真实性,但也可以使用HMAC等对称密钥哈希。公钥签名的一个优点是中央机构是唯一必须保护私钥机密性的实体,而所有其他系统只需要保护用于验证的公钥的完整性。公钥签名的问题在于它们只适用于永不更改的文件,如果文件发生更改,本地系统无法对其重新签名。并且系统中的许多安全关键文件需要不时更改,因此只能使用基于本地对称密钥的签名来真正保护这些文件。用于身份验证的本地对称密钥需要保持安全,否则攻击者可以窃取本地对称密钥并使用它来伪造恶意文件的本地签名。在Linux中,新的IMA身份验证扩展和新的扩展验证模块(EVM)使用对称密钥对文件的数据和元数据进行HMAC,使用本地对称密钥签名来保证允许更改的文件的真实性。对于不打算更改的文件,IMAAuthenticatedSignature扩展将存储授权的RSA公钥签名。不允许更改具有RSA签名的安全文件(但仍可以删除)。3、保密性人们常常误解加密技术不仅可以实现保密性,还可以保护文件的完整性。加密本身并不能保证完整性。一个例子是流密码RC4,它通常用于无线和互联网(https)通信中的标准加密,但攻击者仍然相对容易在加密流中执行“位旋转”,从而破坏完整性.使用块密码,攻击者还可以在文件和会话之间剪切、粘贴和重放加密块,并大获成功。另外,加密系统文件会带来很大的性能损失。安全密钥管理机制已在Linux内核中实现。1)Linux内核提供了内核密钥环服务(keyring),其中对称加密密钥对用户空间永远不可见。密钥在内核中创建,由硬件设备(如TPM)密封,用户空间只能看到密封的密钥信息。恶意或受损的应用程序无法窃取受信任的密钥,因为只有内核才能看到未密封的密钥信息。2)通过可信密钥,将收获密钥与完整性度量绑定,这样密钥就不会在离线攻击中被盗,例如通过从CD或USB启动未锁定的Linux映像。由于不同的测量,TPM芯片将拒绝解锁密钥,即使对于内核也是如此。通过这种方式,Linux将机密性和完整性绑定在一起。系统完整性是解密系统机密文件的先决条件。组合基础防御图示例如下:2.威胁模型对文件完整性和真实性的影响安全和机密性攻击有多种不同类型,安全和成本与性能之间存在显着权衡,取决于需要防御哪些威胁。1.远程攻击最常见的攻击是远程软件攻击,攻击者试图引诱用户运行攻击者的恶意代码(如木马、蠕虫等),或发送恶意数据,企图利用系统软件中的漏洞(如代码注入、溢出)。2.本地攻击本地攻击假定攻击者具有对系统的物理访问权限,例如恶意内部人员(操作员),或者如果系统被盗则可以访问。本地攻击可以是基于软件的,例如离线攻击,也可以是基于硬件的,例如使用JTAG硬件工具读取内存。一种简单而常见的本地攻击是离线攻击,其中从CD或USB驱动器启动备用操作系统,攻击者使用该操作系统修改目标系统。离线攻击通常只是尝试破解现有密码,或插入已知密码,以便攻击者可以简单地登录。在复杂的离线攻击中,甚至可以插入恶意代码并将其留在原地以在以后捕获敏感数据。理想状态当然是防止所有这些攻击。在Linux中可以使用强制访问控制(MAC)来保护系统的完整性,例如SELinux、Smack等安全模块来限制不受信任的代码和数据。然而,即使规则设置复杂严格,本地攻击尤其是线下攻击仍有可能得逞,能否及时发现此类攻击并进一步应对至关重要。LinuxIMA完整性子系统旨在检测对文件的任何(恶意)更改,包括修改文件数据或元数据(如重命名)、重放旧文件、删除文件等。3.LinuxIMAIMA主要功能模块介绍measurement使用内核命令行参数启用IMA测量:ima_tcb=1。默认的ima_tcb测量策略是测量可执行文件、mmapped、库、内核模块、固件和root打开的文件。这些指标、指标列表和聚合的完整性值可以用来证明系统的运行时完整性。基于这些指标,可以检测关键系统文件是否已被修改,或者恶意软件是否已被执行。您可以通过LinuxSecurityModules(LSM)规则自定义measure(测量)或dont_measure(不测量)。将自定义IMA策略放在/etc/IMA/IMA策略中。Systemd启动时会自动加载自定义策略;或使用“cat”自定义IMA测量策略,将输出重定向到/IMA/policy”。比如日志文件一般不需要测量,可以添加自定义规则:dont_measureobj_type=var_log_t,这样日志文件就不会被测量了,默认的IMA策略在所有内核源码路径的Documentation/ABI/testing/ima_policy下都有描述,IMA测量列表可以通过IMAsecurityfs文件读取,通常安装在/系统/内核/安全/ima/ascii_runtime_measurements。示例:root@QTCE-DA-D-03:/boot/grub2#head-5/sys/kernel/security/ima/ascii_runtime_measurements10719de8e521439498e9b77f6ed41e230b9821111eima0000000000000000000000000000000000000000boot_aggregate10de93dac5eed246b7f81a1f5a23687aa0ecf1fe0bimad05bfe5f565cf18da9ab8f996fdf51cf0c947b63/usr/lib/systemd/systemd10f295e6330ded54f941a67436c33b80b55f136fafima92b9165d523063b3c183d7e4c2e32f0a2d0bfa43/lib64/ld-2.22.so...metric列表格式如下:/PCRtemplate-hashtemplate-namefiledata-hashfilename-hint/其中:filedata-hash:为文件的哈希值datatemplate-hash:是filedata-hash和filename-hint的hash值,PCR平台配置寄存器用于存储hash值。IMA默认使用PCR-10。可信计算组(TCG)定义了一种标准的完整性验证XML格式:PTS,其中包括度量列表和TPM在PCR-10值上的签名。远程系统可以验证PCR-10值,并且TPM已对该值进行签名。恶意软件无法伪造合法的指标列表和相应的TPM签名,因为恶意软件无权访问TPM的私有签名密钥。在访问恶意文件之前,恶意文件被测量并包含在PCR值中,PCR的签名被存储在TPM中。恶意代码无法“收回”自己的指标,也无法伪造“干净”的指标签名。因此,如果存在此类恶意软件或行为,就可以找到它。TrustedComputingGroup(TCG)要求的一部分是在读取/执行所有TrustedComputingBase(TCB)文件之前测量它们,并在文件发生更改时重新测量。挂载文件系统时,开启i_version属性,文件发生变化后会触发IMA重新测量文件。但是开启这个功能对性能是有影响的,具体影响和文件大小有关。在/etc/fstab中添加默认挂载选项,例如:/dev/system/lv_home/homeext3defaults,i_version12或者重新挂载挂载的文件系统:mount-oremount,rw,iversion/homeIMA-AppraisalIMA-Appraisal功能模块实现本地完整性校验并增加security.IMA扩展属性存储“正常”或“基线”值,访问时进行本地完整性校验校验,security.IMA存储“正常”,如果值不匹配,对该文件的访问被拒绝。验证security.IMA的方法可以基于hash汇总值(因为hash值比较容易伪造,只保证完整性);它还可以基于数字签名(可以确保完整性和真实性)。默认情况下,security.ima包含哈希摘要值而不是签名。这对于需要更改的文件也很方便,但它没有提供针对离线和在线攻击的强大的完整性和真实性保护。内核中定义了一个新的启动参数“ima_appraise=”,用于在已建立的文件系统中标记扩展属性“security.ima”。ima_appraise=评估完整性测量格式:{"off"|“执行”|“修复”|"log"}off-关闭完整性验证验证enforce-验证并强制执行运行时文件完整性(默认)。修复-对于非数字签名文件,更新“security.ima”扩展属性记录值以反映当前文件哈希。日志-仅日志。如果内核开启了IMA-appraise功能,文件系统也支持i_version功能,内核启动时加入启动参数:'ima_appraise_tcb'和'ima_appraise=fix',security.ima标签为支持文件系统。默认情况下,只要root打开文件,文件的“security.ima”属性就会更新。可以对“不允许更改”的文件(如某些可执行文件)进行数字签名,数字签名保存在security.ima的扩展属性中。创建数字签名需要生成一对RSA私钥/公钥,私钥用于对文件进行签名,公钥用于验证签名。“ima=ima-sig”模板包括文件数据哈希和全路径名,“security.ima”扩展属性还包括文件的数字签名。IMA审计IMA审计功能模块将在审计日志中包含文件哈希值,以增强现有系统的安全分析/取证。IMA审计使用策略操作关键字“审计”扩展了IMA策略ABI。例如:auditfunc=BPRM_CHECK##Auditexecutablefilehash通过设置审计规则,开启IMA测量函数中的ima_audit_measurement()函数。此时除了更新测量列表,将测量结果写入PCR外,还会将测量记录写入测量日志中,包括测量文件的汇总值等。远程认证服务器建立一个白名单通过获取被认证系统的benchmarkmeasurementlog,用于认证阶段验证被认证系统加载的文件是否可信。IMA-authentication-signature-extendedIMA认证签名扩展功能模块是:代替hashdigest,使用增强的基于权限的数字签名(RSA)进行IMA认证,可以提高不需要更改的文件的真实性和保证文件是不可变的。在IMA认证签名扩展中,security.IMA扩展属性的内容可以是RSA签名。如果设置了该属性(首先应该具备完整性能力),则在访问之前会验证签名,文件可以被认为是不可变的。已签名的文件无法修改,但可以删除和替换以进行生产更新。这些签名很难被攻击者伪造,因为他们必须拥有系统的私钥。EVM扩展验证模块旨在保护敏感的inode元数据免受离线攻击。添加内核选项号“evm”以在启动时启用。inode中的敏感元数据包括所有者、组、模式和扩展属性。EVM保护这些安全扩展属性免受离线攻击。EVM在一组安全扩展属性中维护一个HMAC-sha1,将HMAC存储为扩展属性“security.evm”。EVM导出evm_verifyxattr()以验证扩展属性的完整性。EVM为所有安全扩展属性提供保护,包括:*security.ima(文件哈希或签名)*security.selinux(文件的selinux属性)*security.capability(可执行文件的权限范围)4.TrustedinGBankThe第一阶段实施方案简要总结了LinuxIMA机制和可信计算基础。可以看出,它主要是基于静态的测量和验证技术手段,并没有涉及太多应用程序运行时的行为测量和验证。在GBank的实践中,是通过应用行为白名单来实现的,对包括系统调用、网络访问关系、文件访问等应用行为进行收集和分析,通过大数据分析和机器学习建立正常的应用行为规则。经过baseline或者whitelist之后,就可以正式应用到生产实践中了。基于实时采集的应用行为数据,可以与应用行为规则的基线或白名单进行对比判断。如果应用行为不能匹配任何规则,则该行为将被判断为异常,可信平台可以将该动作设置为告警或阻止该应用的运行。可以看出,TCG框架中的所有可信基础(如可信硬件、可信网络等)都没有在解决方案中得到充分实现。由于我行服务器暂时没有TPM/TCM硬件模块,所以目前使用TPM模拟器来模拟TPM的功能。虽然不能称之为“绝对信任根”,但考虑到实际严格的封闭环境,现阶段是可以接受的。另外考虑到UEBA(UserBehaviorAnalysis)结合LinuxIMA的使用,从性能和收益的角度,考虑到我行的实际环境,我们目前还没有开启本地认证(IMA-appraisal)实践、元数据验证(EVM)等功能,只启用基本可信计算(IMA-tcb)策略。目前在生产上线阶段,主要预期效果如下:1)非授权人员无法窃取重要数据2)系统和信息不可篡改,程序防注入,防病毒木马3)异常行为可处理发现4)攻击行为无法隐藏5)模型成熟后,可以进一步自动拦截和处理程序版本更新,新程序,修改后的程序在加载和执行之前会产生新的测量值,并且这些新的测量值的比较会失败(除非加入白名单或基准测量列表),从而判断平台不可信。除了继续丰富和实现可信覆盖的场景范围外,还需要在标准化制度和操作流程层面进行衔接和完善,并与生产、变更、升级等日常工作有机结合。