Linux 完整性子系统及可信计算基础

Linux 完整性子系统及可信计算基础
**【摘要】**可信计算目前在主机主动安全防护中的作用越来越重要,但是具体落地上有不同的实现方式和取舍。本文介绍了可信计算的基本组成部分,结合系统安全目标、威胁方式以及Linux IMA完整性子系统,简述了可信在G银行第一阶段的落地实施方案。

转自@TWT社区,作者:Copper

前言

可信计算目前在主机主动安全防护中的作用越来越重要,但是具体落地上有不同的实现方式和取舍。本文介绍了可信计算的基本组成部分,结合系统安全目标、威胁方式以及Linux IMA完整性子系统,简述了可信在G银行第一阶段的落地实施方案。

可信计算是什么?

一种常见定义是指计算运算的同时进行安全防护,使计算结果总是与预期一样,计算全程可测可控,不被干扰;是一种运算和防护并存的主动免疫的新计算模式,用密码学方法实施身份识别、状态度量、保密存储,及时识别“自己”和“非己”成份,阻止对系统的破坏。

可信平台特点:保护能力,完整性度量、存储和报告,证明能力。从主机上电开始、BIOS启动、GRUB菜单读取、Linux内核加载、应用启动全链条逐级建立信任链,并将度量值存储在平台配置寄存器(Platform configure register, PCR)中,如下图所示。远端管理平台可以远程证实被管理服务器中的PCR值与度量日志,获取平台当前状态,并与预期值对比判断平台是否可信。

Linux 完整性子系统及可信计算基础

TPM

可信计算技术中最核心的部分,它是一个含有数字签名、身份认证、硬件加密、访问授权、信任链建立和完整性度量hash值存放、密钥管理等可信计算所必须的核心硬件模块,基于对用户身份、应用环境、网络环境等不同底层认证 ,彻底防止恶意盗取信息和病毒侵害,实现可信启动(对系统上电到操作系统启动进行度量,写入度量日志)并解决底层硬件设施的安全问题 。TCM是我国采用自主设计密码算法提出的TPM模块。

度量

从2.6.30开始,IMA被引入到Linux内核中,IMA是一个开源的可信计算组件。IMA维护一个运行时度量列表,在有硬件TPM芯片的情况下,能够把此列表的hash完整性度量值固定到TPM里,这样即使攻击能破坏度量列表,也能被发现;即使访问了恶意文件,该恶意文件的度量值(hash值)也会在访问该文件之前提交给TPM,而恶意代码无法删除此度量值(如果没有硬件TPM芯片,理论上来说,还是存在恶意代码不被发现的情况下伪造假的度量列表的可能)。

整体上来说,IMA度量、鉴定和证实并不是保护系统的完整性,它的目标是当威胁攻击发生时/后至少能被发现,以便及时处置。

TPM+Linux IMA就构成了可信在Linux操作系统中的落地。下面是框架示意图:基于Linux TPM-IMA可信计算框架底层实现示意图

Linux 完整性子系统及可信计算基础

具体是怎么配合来监测系统安全和可信的?下面先从从系统整体安全目标结合Linux操作系统说起。

一. 系统整体安全目标

系统有三个主要安全目标:完整性、真实性和保密性。

1. 完整性(Integrity)

完整性是最基本的安全属性,没有完整性,真实性或机密性就无从谈起,因为真实性和机密性机制本身可能会受到损害。对于一个文件来说,完整性通常被理解为“不会变”,即一旦安装,文件不会因恶意或意外的修改而变动。从密码学上讲 hash校验可用于检测文件内容是否已变动,比对文件哈希前后是否一致,即可发现文件是否变动。在极端情况下,完整性不仅意味着不会变,而且意味着“不可改变”,任何操作都不能修改文件。例如BSD操作系统具有不可变文件的概念,只能在单用户管理模式下更改。现在流行的Android操作系统也是将其所有系统文件保存在一个分区中,该分区在正常情况下是只读使用,并且只能在引导期间由恢复程序修改。不可变的系统虽然提供了更大的完整性,却难以做到系统组件的正常更新安装或修补。IMA遵循可信计算组(TCG)的完整性开放标准,把hash校验和不可变更机制组合起来用于创建一个新的完整性解决方案。BSD和Android的方法是使文件本身不可变,而TCG的方法是把这些不可变文件的hash值存储在硬件上,如可信平台模块(TPM)、移动可信模块(MTM) 或类似的装置。IMA维护所有被访问文件的hash列表,如果存在硬件安全组件如TPM,即使软件攻击hash列表也不会成功。通过管理平台集中监视、判断、告警它们是否被改变或破坏。

2. 真实性(Authenticity)

真实性是完整性概念的延伸。不仅仅是告诉具有完整性,而且文件的出处也是已知的。例如,我们不仅知道一个文件没有被恶意修改,而且还知道文件是由真实供应商提供的原始文件。简单的hash不足以保证真实性。而数字签名技术能保障文件的真实性, 使攻击者无法伪造出处的证据。通常是公钥签名,如 RSA用于真实性,但也可以使用对称密钥hash,如HMAC。公钥签名的一个优点是,中心机构是唯一必须保护私钥机密性的实体,而所有其他系统只需要保护用于验证的公钥的完整性。公钥签名的问题是,它们只适用于从不变更的文件,如果文件发生变更,本地系统将无法对其重新签名。而系统上的许多安全关键文件需要不定期变更,因此这些文件实际上只能使用基于本地对称密钥的签名进行保护。用于身份验证的本地对称密钥需要妥善保管,否则攻击者可能盗取本地对称秘钥并用它在恶意文件上伪造本地签名。在Linux中,一个新的IMA鉴定扩展和一个新的扩展验证模块(EVM) 使用对称密钥HMAC 一个文件的数据和元数据,使用本地对称密钥签名的方式来保障可允许更改文件的真实性。对于不希望更改的文件,IMA鉴定签名扩展名将存储一个授权的RSA公钥签名。带有RSA签名的保障文件便不会被允许更改(但仍可被删除)。

3. 保密性(Confidentiality)

大家往往误解是加密技术既能做到保密性,又能保护文件的完整性。本质上来说,加密本身并不能保证完整性。比如流密码RC4,它常常被用于无线和互联网(https)通信中的标准加密,但是攻击者还是较为容易在加密流中进行“比特旋转”,使完整性收到破坏。使用块密码的情况下,攻击者也能在文件和会话之间被剪切、粘贴和重放加密块,而且成功率不低。另外加密系统文件会带来很大的性能损失。Linux kernel里已经实现了安全密钥管理机制。1) Linux kernel提供了一个内核密钥环服务(keyring),在该服务中,对称加密密钥对用户空间来说永远不可见。密钥是在内核中创建的,由硬件设备(如TPM)密封,用户空间只看到密封的密钥信息。恶意或受损的应用程序无法窃取受信任的密钥,因为只有内核才能看到未密封的密钥信息。2)通过可信密钥,将获取密钥与完整性度量绑定在一起,这样在脱机攻击中密钥就不能被窃取,例如通过从CD或USB引导未锁定的Linux映像。由于度量结果不同,TPM芯片将拒绝解封密钥,即使对于内核也是如此。这样,Linux将机密性和完整性绑定在了一起,系统的完整性是解密系统机密文件的前提条件,结合起来的自身的基础防御图示例如下:

Linux 完整性子系统及可信计算基础

二. 威胁模型

对文件完整性、真实性和机密性的攻击有许多不同的类型,并且在安全性和成本与性能之间存在重大的权衡,这取决于需要防御哪些威胁。

1.远程攻击

最常见的攻击是远程软件攻击,攻击者试图诱使用户运行攻击者的恶意代码(如木马、蠕虫等),或发送恶意数据以试图利用系统软件中的漏洞(如代码注入、溢出)。

2.本地攻击

本地攻击假定攻击者具有对系统的物理访问权限,例如恶意内部人员(操作员),或者在系统被盗的情况下进行访问。本地攻击可以是基于软件的,例如脱机攻击,也可以是基于硬件的,例如使用JTAG硬件工具读取内存。简单常见的本地攻击是脱机攻击,其中从CD或USB驱动器启动备用操作系统,攻击者使用此操作系统修改目标系统。脱机攻击通常只是试图破解现有密码,或插入已知密码,以便攻击者可以简单地登录。复杂的脱机攻击中,甚至可以插入恶意代码并保留在适当位置,以便在以后捕获敏感数据。

理想的状态当然是能预防所有这些攻击,Linux中可以使用强制访问控制(MAC)来保护系统完整性,例如SELinux、Smack等安全模块来限制不受信任的代码和数据。但即便进行了复杂、严格的规则设置,本地攻击特别是脱机攻击仍可能成功,能够及时检测出此类攻击并进一步处理变得很关键。Linux IMA完整性子系统就是用来检测对文件的任何(恶意)更改的,包括修改文件数据或元数据(例如重命名)、重放旧文件和删除文件等。

三. Linux IMA主要功能模块简介

Linux 完整性子系统及可信计算基础

IMA 度量

用内核命令行参数开启IMA度量:ima_tcb=1。默认ima_tcb度量策略是度量可执行文件、mmapped、库、kernel module、firmware和root用户打开的文件。这些度量、度量列表和聚合完整性值可用于证明系统的运行时完整性。基于这些度量,可以检测关键系统文件是否已被修改,或者是否已执行恶意软件。可以通过Linux Security Modules (LSM)规则自定义设置measure(度量)或dont_measure(不度量)。将自定义IMA策略放在/etc/IMA/IMA policy中。Systemd启动的时候将自动加载自定义策略;或者通过“cat”自定义IMA度量策略并将输出重定向到/IMA/policy”。例如:日志文件一般不用度量,可以添加自定义规则:dont_measure obj_type=var_log_t,这样就不会度量日志文件。

默认的IMA策略在所有内核源码路径Documentation/ABI/testing/ima_policy下有说明.

IMA度量列表可以通过IMA securityfs文件读取,该文件通常安装在/sys/kernel/security/ima/ascii_runtime_measurements。

示例:

root@QTCE-DA-D-03:/boot/grub2#head -5 /sys/kernel/security/ima/ascii_runtime_measurements 
10 719de8e521439498e9b77f6ed41e230b9821111e ima  0000000000000000000000000000000000000000 boot_aggregate 
10 de93dac5eed246b7f81a1f5a23687aa0ecf1fe0b ima  d05bfe5f565cf18da9ab8f996fdf51cf0c947b63 /usr/lib/systemd/systemd 
10 f295e6330ded54f941a67436c33b80b55f136faf ima  92b9165d523063b3c183d7e4c2e32f0a2d0bfa43 /lib64/ld-2.22.so
……

度量列表的格式如下:

/* PCR template-hash template-name filedata-hash filename-hint */

其中:

filedata-hash:是对文件数据的hash值

template-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中。恶意代码不能“收回”自己的度量,也不能伪造“干净”的度量签名。所以如果有这样的恶意软件或行为就能被发现。

可信计算组(TCG)要求的一部分是,在读取/执行文件之前,对所有可信计算基础(TCB)文件进行度量,如果文件已发生变更则重新度量。文件系统挂载的时候开启i_version属性,文件变更后会触发IMA重新度量该文件。但是启动该功能对性能有影响,具体影响与文件量级有关。

在/etc/fstab里面加上默认挂载选项,示例:

/dev/system/lv_home /home ext3 defaults,i_version 1 2

或是对于已经挂载的文件系统进行重新挂载:

mount -o remount,rw,iversion /home

IMA-Appraisal

IMA-Appraisal功能模块实现了本地完整性验证,增加了security.IMA 扩展属性,用来存储“正常”或“基准”值,在访问的时候进行本地完整性验证校验,与security.IMA存储的 “正常”进行比对,如果值不匹配,则拒绝该文件的访问。验证security.IMA的方法既可以基于hash摘要值(因伪造hash值相对容易,仅保证完整性);也可以基于数字签名(既能保证完整性,又能保证真实性)。

默认情况下,security.ima包含hash摘要值,而不是签名。对于需要变更的文件来说这也是很方便,但对于脱机和联机攻击,并不能提供很强的完整性和真实性保护。

内核中定义了一个新的启动参数“ima_appraise=”,用于给已经建立的文件系统中打上’security.ima’扩展属性标签。

ima_appraise= appraise integrity measurements
    Format: { "off" | "enforce" | "fix" | "log" } 
        off - 关闭完整性鉴定验证
        enforce -验证并强制运行时文件完整性(默认)。
        fix-对于非数字签名的文件,更新“security.ima”扩展属性记录值以反映当前的文件哈希。
        log-只记录日志。

如果kernel中开启了IMA-appraisal功能,文件系统也支持i_version功能,在kernel启动的时候加上启动参数:‘ima_appraise_tcb’ and ‘ima_appraise=fix’,支持给文件系统加上security.ima标签。默认只要root打开文件就会对该文件的“security.ima”属性进行写入更新。

对“不允许变更”的文件(如某些可执行文件)可以进行数字签名,将数字签名存储在security.ima’扩展属性。创建数字签名需要生成RSA私钥/公钥对,私钥用于对文件进行签名,而公钥用于验证签名。

“ima=ima-sig”模板除包括文件数据哈希和完整路径名外,“security.ima”扩展属性中还包含文件的数字签名。

IMA 审计

IMA审计功能模块会使审计日志中包含文件哈希,用于增强现有的系统安全分析/取证。IMA audit使用策略操作关键字“audit”扩展IMA策略ABI。

例如:

audit func=BPRM_CHECK    ##审计可执行文件哈希

通过设置audit规则,开启IMA度量函数中的ima_audit_measurement()功能,此时除了更新度量列表并将度量结果写入PCR外,还会向度量日志中写入度量记录,包括被度量文件的摘要值等。

远端证实服务器通过获取被证实系统的基准度量日志建立白名单,在证实阶段用于证实被证实系统加载的文件是否可信。

IMA-鉴定-签名-扩展

IMA鉴定签名扩展功能模块作用是:不用hash摘要,而使用增强的基于权限的数字签名(RSA)来进行IMA鉴定,提高可用于不需要变动的文件的真实性和保证文件不可变。

在IMA鉴定签名扩展中,security.IMA扩展属性的内容则可以是RSA签名。如果设置了此属性(首先应具备完整性能力),在访问之前会验证签名,可以认为该文件是不可变更的。有签名的文件不能被修改,但可以被删除和替换,以便投产更新。这些签名很难被攻击者伪造,因为它们必须拥有系统的私钥。

EVM扩展校验模块

目标是保护敏感的inode元数据免受脱机攻击。启动时加上内核选项数”evm”开启。inode中的敏感元数据包含所有者、组、模式以及扩展属性。EVM保护这些安全扩展属性免受脱机攻击。EVM在一组安全扩展属性中维护一个HMAC-sha1,将HMAC存储为扩展属性“security.evm”。EVM导出evm_verifyxattr()验证扩展属性的完整性。EVM为所有安全扩展属性提供保护,包括:

* security.ima (文件hash或签名)
* security.selinux (文件的selinux属性)
* security.capability (可执行文件的权限范围)

四. 可信在G银行第一阶段的落地实施方案

前面简要概括了Linux IMA机制和可信计算基础,可以看出,主要还是基于静态度量和验证的技术手段,并没有太多涉及运行时的应用行为度量和验证。在G银行的实践中是通过应用行为白名单来实现的,对应用的行为包括系统调用、网络访问关系、文件访问等进行收集和分析,通过大数据分析和机器学习等手段建立应用正常行为规则基线或白名单后,可正式应用于生产实践中,根据实时采集的应用行为数据,对比应用行为规则基线或白名单进行判断。如果应用行为无法匹配任何一条规则,这个行为会被判断为异常,可信平台可以设置处置动作为告警或阻断应用运行。

Linux 完整性子系统及可信计算基础

可以看到,方案里面并没有完全实现TCG框架里面的所有可信基础(如可信硬件、可信网络等)。因我行的服务器暂时不具备TPM/TCM硬件模块,所以当前采用的是TPM模拟器来模拟TPM的功能,虽不能称之为”绝对的可信根”,但考虑到实际严格的封闭环境,在当前阶段来说是可接受的。另外考虑到使用了UEBA(用户行为分析)配合Linux IMA,从性能和收益的角度出发,综合考虑我行实际环境,在我行的现阶段实践中并没有开启本地的鉴权(IMA-appraisal)、元数据校验(EVM)等功能,仅开启了基础可信计算 (IMA-tcb)策略。

现在正在生产落地阶段,最终期待的主要效果如下:

1)非授权者窃取不了重要数据

2)系统和信息篡改不了,程序防注入,防病毒木马

3)异常行为能被发现

4)攻击行为躲不了,赖不掉

5)模式成熟后还能进一步自动阻断和处置

程序版本更新、新程序、修改后的程序加载执行前都会产生新的度量值,对这些新度量值的比对会失败(除非加入白名单或者基准度量列表中),从而判断该平台不可信。后续除了继续丰富和实现可信涵盖的场景范围外,还需要在规范制度及操作流程等层面进行对接和完善,与投产、变更、升级等日常工作有机结合起来。

上一篇:HTMLParser获取属性名


下一篇:用C/C++实现对STORM的执行信息查看和控制