1*943b764cSShuo Zhao.. SPDX-License-Identifier: GPL-2.0 2*943b764cSShuo Zhao.. include:: ../disclaimer-zh_CN.rst 3*943b764cSShuo Zhao 4*943b764cSShuo Zhao:Original: Documentation/security/sak.rst 5*943b764cSShuo Zhao 6*943b764cSShuo Zhao:翻译: 7*943b764cSShuo Zhao 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn> 8*943b764cSShuo Zhao 9*943b764cSShuo Zhao完整性策略执行(IPE)-内核文档 10*943b764cSShuo Zhao============================== 11*943b764cSShuo Zhao 12*943b764cSShuo Zhao.. NOTE:: 13*943b764cSShuo Zhao 14*943b764cSShuo Zhao 这是针对开发人员而不是管理员的文档。如果您正在 15*943b764cSShuo Zhao 寻找有关IPE使用的文档,请参阅 :doc:`IPE admin 16*943b764cSShuo Zhao guide </admin-guide/LSM/ipe>`。 17*943b764cSShuo Zhao 18*943b764cSShuo Zhao历史背景 19*943b764cSShuo Zhao-------- 20*943b764cSShuo Zhao 21*943b764cSShuo Zhao最初促使IPE实施的原因,是需要创建一个锁定式系统。该系统将 22*943b764cSShuo Zhao从一开始就具备安全性,并且在可执行代码和系统功能关键的特定 23*943b764cSShuo Zhao数据文件上,提供强有力的完整性保障。只有当这些特定数据文件 24*943b764cSShuo Zhao符合完整性策略时,它们才可以被读取。系统中还将存在强制访问 25*943b764cSShuo Zhao控制机制,因此扩展属性(xattrs)也必须受到保护。这就引出了 26*943b764cSShuo Zhao需要选择能够提供完整性保证的机制。当时,有两种主要机制被考 27*943b764cSShuo Zhao虑,用以在满足这些要求的前提下保证系统完整性: 28*943b764cSShuo Zhao 29*943b764cSShuo Zhao 1. IMA + EVM Signatures 30*943b764cSShuo Zhao 2. DM-Verity 31*943b764cSShuo Zhao 32*943b764cSShuo Zhao这两个选项都经过了仔细考虑,然而在原始的IPE使用场景 33*943b764cSShuo Zhao中,最终选择DM-Verity而非IMA+EVM作为完整性机制,主 34*943b764cSShuo Zhao要有三个原因: 35*943b764cSShuo Zhao 36*943b764cSShuo Zhao 1. 防护额外的攻击途径 37*943b764cSShuo Zhao 38*943b764cSShuo Zhao * 使用IMA+EVM时,如果没有加密解决方案,系统很容易受到 39*943b764cSShuo Zhao 离线攻击,特别是针对上述特定数据文件的攻击。 40*943b764cSShuo Zhao 41*943b764cSShuo Zhao 与可执行文件不同,读取操作(如对受保护数据文件的读 42*943b764cSShuo Zhao 取操作)无法强制性进行全局完整性验证。这意味着必须 43*943b764cSShuo Zhao 有一种选择机制来决定是否应对某个读取操作实施完整性 44*943b764cSShuo Zhao 策略。 45*943b764cSShuo Zhao 46*943b764cSShuo Zhao 在当时,这是通过强制访问控制标签来实现的,IMA策略会 47*943b764cSShuo Zhao 指定哪些标签需要进行完整性验证,这带来了一个问题: 48*943b764cSShuo Zhao EVM虽然可以保护标签,但如果攻击者离线修改文件系统, 49*943b764cSShuo Zhao 那么攻击者就可以清除所有的扩展属性(xattrs)——包括 50*943b764cSShuo Zhao 用于确定文件是否应受完整性策略约束的SELinux标签。 51*943b764cSShuo Zhao 52*943b764cSShuo Zhao 使用DM-Verity,由于xattrs被保存为Merkel树的一部分, 53*943b764cSShuo Zhao 如果对由dm-verity保护的文件系统进行了离线挂载,校验 54*943b764cSShuo Zhao 和将不在匹配,文件将无法读取。 55*943b764cSShuo Zhao 56*943b764cSShuo Zhao * 由于用户空间的二进制文件在Linux中是分页加载的,dm- 57*943b764cSShuo Zhao verity同样提供了对抗恶意块设备的额外保护。在这样的 58*943b764cSShuo Zhao 攻击中,块设备最初报告适当的内容以供IMA哈希计算,通 59*943b764cSShuo Zhao 过所需的完整性检查。然后,在访问真实数据时发生的页面 60*943b764cSShuo Zhao 错误将报告攻击者的有效载荷。由于dm-verity会在页面错 61*943b764cSShuo Zhao 误发生时检查数据(以及磁盘访问),因此这种攻击得到了 62*943b764cSShuo Zhao 缓解。 63*943b764cSShuo Zhao 64*943b764cSShuo Zhao 2. 性能: 65*943b764cSShuo Zhao 66*943b764cSShuo Zhao * dm-verity在块被读取时按需提供完整性验证,而不需要将整 67*943b764cSShuo Zhao 个文件读入内存进行验证。 68*943b764cSShuo Zhao 69*943b764cSShuo Zhao 3. 签名的简化性: 70*943b764cSShuo Zhao 71*943b764cSShuo Zhao * 不需要两个签名(IMA 然后是 EVM):一个签名可以覆盖整个 72*943b764cSShuo Zhao 块设备。 73*943b764cSShuo Zhao * 签名可以存储在文件系统元数据之外。 74*943b764cSShuo Zhao * 该签名支持基于 x.509 的签名基础设施。 75*943b764cSShuo Zhao 76*943b764cSShuo Zhao下一步是选择一个策略来执行完整性验证机制,该策略的最低 77*943b764cSShuo Zhao要求是: 78*943b764cSShuo Zhao 79*943b764cSShuo Zhao 1. 策略本身必须经过完整性验证(防止针对它的简单攻击)。 80*943b764cSShuo Zhao 2. 策略本身必须抵抗回滚攻击。 81*943b764cSShuo Zhao 3. 策略执行必须具有类似宽松模式的功能。 82*943b764cSShuo Zhao 4. 策略必须能够在不重启的情况下,完整地进行更新。 83*943b764cSShuo Zhao 5. 策略更新必须是原子性的。 84*943b764cSShuo Zhao 6. 策略必须支持撤销先前创建的组件。 85*943b764cSShuo Zhao 7. 策略必须在任何时间点都能进行审计。 86*943b764cSShuo Zhao 87*943b764cSShuo Zhao当时,IMA作为唯一的完整性策略机制,被用来与这些要求进行对比, 88*943b764cSShuo Zhao但未能满足所有最低要求。尽管考虑过扩展IMA以涵盖这些要求,但 89*943b764cSShuo Zhao最终因两个原因被放弃: 90*943b764cSShuo Zhao 91*943b764cSShuo Zhao 1. 回归风险;这其中许多变更将导致对已经存在于内核的IMA进行 92*943b764cSShuo Zhao 重大代码更改,因此可能会影响用户。 93*943b764cSShuo Zhao 94*943b764cSShuo Zhao 2. IMA在该系统中用于测量和证明;将测量策略与本地完整性策略 95*943b764cSShuo Zhao 的执行分离被认为是有利的。 96*943b764cSShuo Zhao 97*943b764cSShuo Zhao由于这些原因,决定创建一个新的LSM,其职责是仅限于本地完整性 98*943b764cSShuo Zhao策略的执行。 99*943b764cSShuo Zhao 100*943b764cSShuo Zhao职责和范围 101*943b764cSShuo Zhao---------- 102*943b764cSShuo Zhao 103*943b764cSShuo ZhaoIPE顾名思义,本质上是一种完整性策略执行解决方案;IPE并不强制规定 104*943b764cSShuo Zhao如何提供完整性保障,而是将这一决策权留给系统管理员,管理员根据自身 105*943b764cSShuo Zhao需求,选择符合的机制来设定安全标准。存在几种不同的完整性解决方案, 106*943b764cSShuo Zhao它们提供了不同程度的安全保障;而IPE允许系统管理员理论上为所有这些 107*943b764cSShuo Zhao解决方案制定策略。 108*943b764cSShuo Zhao 109*943b764cSShuo ZhaoIPE自身没有内置确保完整性的固有机制。相反,在构建具备完整性保障能力 110*943b764cSShuo Zhao的系统时,存在更高效的分层方案可供使用。需要重点注意的是,用于证明完 111*943b764cSShuo Zhao整性的机制,与用于执行完整性声明的策略是相互独立的。 112*943b764cSShuo Zhao 113*943b764cSShuo Zhao因此,IPE依据以下方面进行设计: 114*943b764cSShuo Zhao 115*943b764cSShuo Zhao 1. 便于与完整性提供机制集成。 116*943b764cSShuo Zhao 2. 便于平台管理员/系统管理员使用。 117*943b764cSShuo Zhao 118*943b764cSShuo Zhao设计理由: 119*943b764cSShuo Zhao--------- 120*943b764cSShuo Zhao 121*943b764cSShuo ZhaoIPE是在评估其他操作系统和环境中的现有完整性策略解决方案后设计的。 122*943b764cSShuo Zhao在对其他实现的调查中,发现了一些缺陷: 123*943b764cSShuo Zhao 124*943b764cSShuo Zhao 1. 策略不易为人们读取,通常需要二进制中间格式。 125*943b764cSShuo Zhao 2. 默认情况下会隐式采取单一的、不可定制的操作。 126*943b764cSShuo Zhao 3. 调试策略需要手动来确定违反了哪个规则。 127*943b764cSShuo Zhao 4. 编写策略需要对更大系统或操作系统有深入的了解。 128*943b764cSShuo Zhao 129*943b764cSShuo ZhaoIPE尝试避免所有这些缺陷。 130*943b764cSShuo Zhao 131*943b764cSShuo Zhao策略 132*943b764cSShuo Zhao~~~~ 133*943b764cSShuo Zhao 134*943b764cSShuo Zhao纯文本 135*943b764cSShuo Zhao^^^^^^ 136*943b764cSShuo Zhao 137*943b764cSShuo ZhaoIPE的策略是纯文本格式的。相较于其他Linux安全模块(LSM), 138*943b764cSShuo Zhao策略文件体积略大,但能解决其他平台上部分完整性策略方案存在 139*943b764cSShuo Zhao的两个核心问题。 140*943b764cSShuo Zhao 141*943b764cSShuo Zhao第一个问题是代码维护和冗余的问题。为了编写策略,策略必须是 142*943b764cSShuo Zhao以某种形式的字符串形式呈现(无论是 XML、JSON、YAML 等结构化 143*943b764cSShuo Zhao格式,还是其他形式),以便策略编写者能够理解所写内容。在假设 144*943b764cSShuo Zhao的二进制策略设计中,需要一个序列化器将策略将可读的形式转换为 145*943b764cSShuo Zhao二进制形式,同时还需要一个反序列化器来将二进制形式转换为内核 146*943b764cSShuo Zhao中的数据结构。 147*943b764cSShuo Zhao 148*943b764cSShuo Zhao最终,还需要另一个反序列化器将是必要的,用于将二进制形式转换 149*943b764cSShuo Zhao为人类可读的形式,并尽可能保存所有信息,这是因为使用此访问控 150*943b764cSShuo Zhao制系统的用户必须维护一个校验表和原始文件,才能理解哪些策略已 151*943b764cSShuo Zhao经部署在该系统上,哪些没有。对于单个用户来说,这可能没问题, 152*943b764cSShuo Zhao因为旧的策略可以在更新生效后很快被丢弃。但对于管理成千上万、 153*943b764cSShuo Zhao甚至数十万台计算机的用户,且这些计算机有不同的操作系统和不同 154*943b764cSShuo Zhao的操作需求,这很快就成了一个问题,因为数年前的过时策略可能仍然 155*943b764cSShuo Zhao存在,从而导致需要快速恢复策略或投资大量基础设施来跟踪每个策略 156*943b764cSShuo Zhao的内容。 157*943b764cSShuo Zhao 158*943b764cSShuo Zhao有了这三个独立的序列化器/反序列化器,维护成本非常昂贵。如果策略 159*943b764cSShuo Zhao避免使用二进制格式,则只需要一个序列化器;将人类可读的形式转换 160*943b764cSShuo Zhao为内核中的数据结构。从而节省了代码维护成本,并保持了可操作性。 161*943b764cSShuo Zhao 162*943b764cSShuo Zhao第二个关于二进制格式的问题是透明性,由于IPE根据系统资源的可信度 163*943b764cSShuo Zhao来控制访问,因此其策略也必须可信,以便可以被更改。这是通过签名来 164*943b764cSShuo Zhao完成的,这就需要签名过程。签名过程通常具有很高的安全标准,因为 165*943b764cSShuo Zhao任何被签名的内容都可以被用来攻击完整性执行系统。签署时,签署者 166*943b764cSShuo Zhao必须知道他们在签署什么,二进制策略可能会导致这一点的模糊化;签署 167*943b764cSShuo Zhao者看到的只是一个不透明的二进制数据块。另一方面,对于纯文本策略中, 168*943b764cSShuo Zhao签署者看到的则是实际提交的策略。 169*943b764cSShuo Zhao 170*943b764cSShuo Zhao启动策略 171*943b764cSShuo Zhao~~~~~~~~ 172*943b764cSShuo Zhao 173*943b764cSShuo Zhao如果配置得当,IPE能够在内核启动并进入用户模式时立即执行策略。 174*943b764cSShuo Zhao这意味着需要在用户模式开始的那一刻就存储一定的策略。通常,这种 175*943b764cSShuo Zhao存储可以通过一下三种方式之一来处理: 176*943b764cSShuo Zhao 177*943b764cSShuo Zhao 1. 策略文件存储在磁盘上,内核在进入可能需要做出执行决策的代码 178*943b764cSShuo Zhao 路径之前,先加载该策略。 179*943b764cSShuo Zhao 2. 策略文件由引导加载程序传递给内核,内核解析这些策略。 180*943b764cSShuo Zhao 3. 将一个策略文件编译到内核中,内核在初始化过程中对其进行解析并 181*943b764cSShuo Zhao 执行。 182*943b764cSShuo Zhao 183*943b764cSShuo Zhao第一种方式存在问题:内核从用户空间读取文件通常是不推荐的,并且在 184*943b764cSShuo Zhao内核中极为罕见。 185*943b764cSShuo Zhao 186*943b764cSShuo Zhao第二种选项同样存在问题:Linux在其整个生态系统中支持多种引导加载程序, 187*943b764cSShuo Zhao所有引导加载程序都必须支持这种新方法,或者需要有一个独立的来源,这 188*943b764cSShuo Zhao可能会导致内核启动过程发生不必要的重大变化。 189*943b764cSShuo Zhao 190*943b764cSShuo Zhao第三种选项是最佳选择,但需要注意的是,编译进内核的策略会占用磁盘空间。 191*943b764cSShuo Zhao重要的是要使这一策略足够通用,以便用户空间能够加载新的、更复杂的策略, 192*943b764cSShuo Zhao同时也要足够严格,以防止过度授权并避免引发安全问题。 193*943b764cSShuo Zhao 194*943b764cSShuo Zhaoinitramfs提供了一种建立此启动路径的方法。内核启动时以最小化的策略启动, 195*943b764cSShuo Zhao该策略仅信任initramfs。在initramfs内,当真实的根文件系统已挂载且尚未 196*943b764cSShuo Zhao切换时,它会部署并激活一个信任新根文件系统的策略。这种方法防止了在任何 197*943b764cSShuo Zhao步骤中出现过度授权,并保持内核策略的最小化。 198*943b764cSShuo Zhao 199*943b764cSShuo Zhao启动 200*943b764cSShuo Zhao^^^^ 201*943b764cSShuo Zhao 202*943b764cSShuo Zhao然而,并不是每个系统都以initramfs启动,因此编译进内核的启动策略需要具备 203*943b764cSShuo Zhao一定的灵活性,以明确如何为启动的下一个阶段建立信任。为此,如果我们将编译 204*943b764cSShuo Zhao进内核的策略设计为一个完整的IPE策略,这样系统构建者便能合理定义第一阶段启 205*943b764cSShuo Zhao动的需求。 206*943b764cSShuo Zhao 207*943b764cSShuo Zhao可更新、无需重启的策略 208*943b764cSShuo Zhao~~~~~~~~~~~~~~~~~~~~~~ 209*943b764cSShuo Zhao 210*943b764cSShuo Zhao随着时间的推移,系统需求发生变化(例如,之前信任的应用程序中发现漏洞、秘钥 211*943b764cSShuo Zhao轮换等)。更新内核以满足这些安全目标并非始终是一个合适的选择,因为内核更新并 212*943b764cSShuo Zhao非完全无风险的,而搁置安全更新会使系统处于脆弱状态。这意味着IPE需要一个可以 213*943b764cSShuo Zhao完全更新的策略(允许撤销现有的策略),并且这个更新来源必须是内核外部的(允许 214*943b764cSShuo Zhao再不更新内核的情况下更新策略)。 215*943b764cSShuo Zhao 216*943b764cSShuo Zhao此外,由于内核在调用之间是无状态的,并且从内核空间读取磁盘上的策略文件不是一 217*943b764cSShuo Zhao个好主意,因此策略更新必须能够在不重启的情况下完成。 218*943b764cSShuo Zhao 219*943b764cSShuo Zhao为了允许从外部来源进行更新,考虑到外部来源可能是恶意的,因此该策略需要具备可被 220*943b764cSShuo Zhao识别为可信的机制。这一机制通过签名链实现:策略的签名需与内核中的某个信任源相 221*943b764cSShuo Zhao关联。通常,这个信任源是 ``SYSTEM_TRUSTED_KEYRING`` ,这是一个在内核编译时就被 222*943b764cSShuo Zhao初始化填充的密钥环,因为这符合上述编译进来策略的制作者与能够部署策略更新的实体 223*943b764cSShuo Zhao相同的预期。 224*943b764cSShuo Zhao 225*943b764cSShuo Zhao防回滚 / 防重放 226*943b764cSShuo Zhao~~~~~~~~~~~~~~~ 227*943b764cSShuo Zhao 228*943b764cSShuo Zhao随着时间的推移,系统可能会发现漏洞,曾经受信任的资源可能不再可信,IPE的 229*943b764cSShuo Zhao策略也不例外。可能会出现的情况是,策略制作者误部署了一个不安全的策略, 230*943b764cSShuo Zhao随后再用一个安全的策略进行修正。 231*943b764cSShuo Zhao 232*943b764cSShuo Zhao假设一旦不安全的策略被部署,攻击者获取了这个不安全的策略,IPE需要有一种 233*943b764cSShuo Zhao方式来防止从安全的策略更新回滚到不安全的策略。 234*943b764cSShuo Zhao 235*943b764cSShuo Zhao最初,IPE的策略可以包含一个policy_version字段,声明系统上所有可激活策略 236*943b764cSShuo Zhao所需的最低版本号。这将在系统运行期间防止回滚。 237*943b764cSShuo Zhao 238*943b764cSShuo Zhao.. WARNING:: 239*943b764cSShuo Zhao 240*943b764cSShuo Zhao 然而,由于内核每次启动都是无状态的,因此该策略版本将在下次 241*943b764cSShuo Zhao 启动时被重置为0.0.0。系统构建者需要意识到这一点,并确保在启 242*943b764cSShuo Zhao 动后尽快部署新的安全策略,以确保攻击者部署不安全的策略的几 243*943b764cSShuo Zhao 率最小化。 244*943b764cSShuo Zhao 245*943b764cSShuo Zhao隐式操作: 246*943b764cSShuo Zhao~~~~~~~~~ 247*943b764cSShuo Zhao 248*943b764cSShuo Zhao隐式操作的问题只有在考虑系统中多个操作具有不同级别时才会显现出来。 249*943b764cSShuo Zhao例如,考虑一个系统,该系统对可执行代码和系统中对其功能至关重要的 250*943b764cSShuo Zhao特定数据提供强大的完整性保障。在这个系统中,可能存在三种类型的 251*943b764cSShuo Zhao策略: 252*943b764cSShuo Zhao 253*943b764cSShuo Zhao 1. 一种策略,在这种策略中,如果操作未能匹配到任何规则,则该操 254*943b764cSShuo Zhao 作将被拒绝。 255*943b764cSShuo Zhao 2. 一种策略,在这种策略中,如果操作未能匹配到任何规则,则该操 256*943b764cSShuo Zhao 作将被允许。 257*943b764cSShuo Zhao 3. 一种策略,在这种策略中,如果操作未能匹配到任何规则,则执行 258*943b764cSShuo Zhao 操作由策略作者指定。 259*943b764cSShuo Zhao 260*943b764cSShuo Zhao第一种类型的策略示例如下:: 261*943b764cSShuo Zhao 262*943b764cSShuo Zhao op=EXECUTE integrity_verified=YES action=ALLOW 263*943b764cSShuo Zhao 264*943b764cSShuo Zhao在示例系统中,这对于可执行文件来说效果很好,因为所有可执行文件 265*943b764cSShuo Zhao都应该拥有完整性保障。但问题出现在第二个要求上,即关于特定数据 266*943b764cSShuo Zhao文件的要求。这将导致如下策略(假设策略按行依次执行):: 267*943b764cSShuo Zhao 268*943b764cSShuo Zhao op=EXECUTE integrity_verified=YES action=ALLOW 269*943b764cSShuo Zhao 270*943b764cSShuo Zhao op=READ integrity_verified=NO label=critical_t action=DENY 271*943b764cSShuo Zhao op=READ action=ALLOW 272*943b764cSShuo Zhao 273*943b764cSShuo Zhao若阅读过文档,了解策略按顺序执行且默认动作是拒绝,那么这个策略的 274*943b764cSShuo Zhao逻辑还算清晰;但最后一行规则实际上将读取操作的默认动作改成了允许。 275*943b764cSShuo Zhao这种设计是必要的,因为在实际系统中,存在一些无需验证的读取操作(例 276*943b764cSShuo Zhao如向日志文件追加内容时的读取操作)。 277*943b764cSShuo Zhao 278*943b764cSShuo Zhao第二种策略类型(未匹配任何规则时默认允许)在管控特定数据文件时逻辑 279*943b764cSShuo Zhao更清晰,其策略可简化为:: 280*943b764cSShuo Zhao 281*943b764cSShuo Zhao op=READ integrity_verified=NO label=critical_t action=DENY 282*943b764cSShuo Zhao 283*943b764cSShuo Zhao但与第一种策略类似,这种默认允许的策略在管控执行操作时会存在缺陷, 284*943b764cSShuo Zhao因此仍需显式覆盖默认动作:: 285*943b764cSShuo Zhao 286*943b764cSShuo Zhao op=EXECUTE integrity_verified=YES action=ALLOW 287*943b764cSShuo Zhao op=EXECUTE action=DENY 288*943b764cSShuo Zhao 289*943b764cSShuo Zhao op=READ integrity_verified=NO label=critical_t action=DENY 290*943b764cSShuo Zhao 291*943b764cSShuo Zhao这就引出了第三种策略类型(自定义默认动作)。该类型无需让用户绞尽脑汁 292*943b764cSShuo Zhao通过空规则覆盖默认动作,而是强制用户根据自身场景思考合适的默认动作是 293*943b764cSShuo Zhao什么,并显式声明:: 294*943b764cSShuo Zhao 295*943b764cSShuo Zhao DEFAULT op=EXECUTE action=DENY 296*943b764cSShuo Zhao op=EXECUTE integrity_verified=YES action=ALLOW 297*943b764cSShuo Zhao 298*943b764cSShuo Zhao DEFAULT op=READ action=ALLOW 299*943b764cSShuo Zhao op=READ integrity_verified=NO label=critical_t action=DENY 300*943b764cSShuo Zhao 301*943b764cSShuo Zhao策略调试: 302*943b764cSShuo Zhao~~~~~~~~~ 303*943b764cSShuo Zhao 304*943b764cSShuo Zhao在开发策略时,知道策略违反了哪一行有助于减少调试成本;可以 305*943b764cSShuo Zhao将调查的范围缩小到导致该行为的确切行。有些完整性策略系统并 306*943b764cSShuo Zhao不提供这一信息,而是提供评估过程中使用的信息。这随后需要将 307*943b764cSShuo Zhao这些信息和策略进行关联,以分析哪里了问题。 308*943b764cSShuo Zhao 309*943b764cSShuo Zhao相反,IPE只会输出匹配到的规则。这将调查范围限制到确切到策略行 310*943b764cSShuo Zhao(在特定规则的情况下)或部分(在DEFAULT规则的情况下)。当在 311*943b764cSShuo Zhao评估策略时观察到策略失败时,这可以减少迭代和调查的时间。 312*943b764cSShuo Zhao 313*943b764cSShuo ZhaoIPE的策略引擎还被设计成让人类容易理解如何调查策略失败。每一 314*943b764cSShuo Zhao行都会按编写顺序进行评估,因此算法非常简单,便于人类重现步 315*943b764cSShuo Zhao骤并找出可能导致失败的原因。而在调查其他的系统中,加载策略 316*943b764cSShuo Zhao时会进行优化(例如对规则排序)。在这些系统中,调试需要多个 317*943b764cSShuo Zhao步骤,而且没有先阅读代码的情况下,终端用户可能无法完全理解 318*943b764cSShuo Zhao该算法的原理。 319*943b764cSShuo Zhao 320*943b764cSShuo Zhao简化策略: 321*943b764cSShuo Zhao~~~~~~~~~ 322*943b764cSShuo Zhao 323*943b764cSShuo Zhao最后,IPE的策略是为系统管理员设计的,而不是内核开发人员。 324*943b764cSShuo ZhaoIPE不涉及单独的LSM钩子(或系统调用),而是涵盖操作。这 325*943b764cSShuo Zhao意味着,系统管理员不需要知道像 ``mmap`` 、 ``mprotect`` 、 326*943b764cSShuo Zhao``execve`` 和 ``uselib`` 这些系统调用必须有规则进行保护, 327*943b764cSShuo Zhao而只需要知道他们想要限制代码执行。这减少了由于缺乏对底层 328*943b764cSShuo Zhao系统的了解而可能导致的绕过情况;而IPE的维护者作为内核开发 329*943b764cSShuo Zhao人员,可以做出正确的选择,确定某些操作是否与这些操作匹配, 330*943b764cSShuo Zhao以及在什么条件下匹配。 331*943b764cSShuo Zhao 332*943b764cSShuo Zhao实现说明 333*943b764cSShuo Zhao-------- 334*943b764cSShuo Zhao 335*943b764cSShuo Zhao匿名内存 336*943b764cSShuo Zhao~~~~~~~~ 337*943b764cSShuo Zhao 338*943b764cSShuo Zhao在IPE中,匿名内存的处理方式与其他任何类型的访问没有区别。当匿 339*943b764cSShuo Zhao名内存使用 ``+X`` 映射时,它仍然会进入 ``file_mmp`` 或 340*943b764cSShuo Zhao``file_mprotect`` 钩子,但此时会带有一个 ``NULL`` 文件对象 341*943b764cSShuo Zhao这会像其他文件一样提交进行评估。然而,所有当前的信任属性都会 342*943b764cSShuo Zhao评估为假,因为它们都是基于文件的,而此次操作并不与任何文件相关联。 343*943b764cSShuo Zhao 344*943b764cSShuo Zhao.. WARNING:: 345*943b764cSShuo Zhao 346*943b764cSShuo Zhao 这也适用于 ``kernel_load_data`` 钩子,当内核从一个没有文件 347*943b764cSShuo Zhao 支持的用户空间缓冲区加载数据时。在这种情况下,所有当前的信任 348*943b764cSShuo Zhao 属性也将评估为false。 349*943b764cSShuo Zhao 350*943b764cSShuo ZhaoSecurityfs接口 351*943b764cSShuo Zhao~~~~~~~~~~~~~~ 352*943b764cSShuo Zhao 353*943b764cSShuo Zhao每个策略的对应的securityfs树是有些独特的。例如,对于一个标准的 354*943b764cSShuo Zhaosecurityfs策略树:: 355*943b764cSShuo Zhao 356*943b764cSShuo Zhao MyPolicy 357*943b764cSShuo Zhao |- active 358*943b764cSShuo Zhao |- delete 359*943b764cSShuo Zhao |- name 360*943b764cSShuo Zhao |- pkcs7 361*943b764cSShuo Zhao |- policy 362*943b764cSShuo Zhao |- update 363*943b764cSShuo Zhao |- version 364*943b764cSShuo Zhao 365*943b764cSShuo Zhao策略存储在MyPolicy对应节点的 ``->i_private`` 数据中。 366*943b764cSShuo Zhao 367*943b764cSShuo Zhao测试 368*943b764cSShuo Zhao---- 369*943b764cSShuo Zhao 370*943b764cSShuo ZhaoIPE为策略解析器提供了KUnit测试。推荐kunitconfig:: 371*943b764cSShuo Zhao 372*943b764cSShuo Zhao CONFIG_KUNIT=y 373*943b764cSShuo Zhao CONFIG_SECURITY=y 374*943b764cSShuo Zhao CONFIG_SECURITYFS=y 375*943b764cSShuo Zhao CONFIG_PKCS7_MESSAGE_PARSER=y 376*943b764cSShuo Zhao CONFIG_SYSTEM_DATA_VERIFICATION=y 377*943b764cSShuo Zhao CONFIG_FS_VERITY=y 378*943b764cSShuo Zhao CONFIG_FS_VERITY_BUILTIN_SIGNATURES=y 379*943b764cSShuo Zhao CONFIG_BLOCK=y 380*943b764cSShuo Zhao CONFIG_MD=y 381*943b764cSShuo Zhao CONFIG_BLK_DEV_DM=y 382*943b764cSShuo Zhao CONFIG_DM_VERITY=y 383*943b764cSShuo Zhao CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG=y 384*943b764cSShuo Zhao CONFIG_NET=y 385*943b764cSShuo Zhao CONFIG_AUDIT=y 386*943b764cSShuo Zhao CONFIG_AUDITSYSCALL=y 387*943b764cSShuo Zhao CONFIG_BLK_DEV_INITRD=y 388*943b764cSShuo Zhao 389*943b764cSShuo Zhao CONFIG_SECURITY_IPE=y 390*943b764cSShuo Zhao CONFIG_IPE_PROP_DM_VERITY=y 391*943b764cSShuo Zhao CONFIG_IPE_PROP_DM_VERITY_SIGNATURE=y 392*943b764cSShuo Zhao CONFIG_IPE_PROP_FS_VERITY=y 393*943b764cSShuo Zhao CONFIG_IPE_PROP_FS_VERITY_BUILTIN_SIG=y 394*943b764cSShuo Zhao CONFIG_SECURITY_IPE_KUNIT_TEST=y 395*943b764cSShuo Zhao 396*943b764cSShuo Zhao此外,IPE 具有一个基于 Python 的集成 397*943b764cSShuo Zhao`测试套件 <https://github.com/microsoft/ipe/tree/test-suite>`_ 398*943b764cSShuo Zhao可以测试用户界面和强制执行功能。 399