1*ef3d720fSShuo Zhao.. SPDX-License-Identifier: GPL-2.0 2*ef3d720fSShuo Zhao.. include:: ../disclaimer-zh_CN.rst 3*ef3d720fSShuo Zhao 4*ef3d720fSShuo Zhao:Original: Documentation/security/IMA-templates.rst 5*ef3d720fSShuo Zhao 6*ef3d720fSShuo Zhao:翻译: 7*ef3d720fSShuo Zhao 赵硕 Shuo Zhao <zhaoshuo@cqsoftware.com.cn> 8*ef3d720fSShuo Zhao 9*ef3d720fSShuo Zhao=============== 10*ef3d720fSShuo ZhaoIMA模板管理机制 11*ef3d720fSShuo Zhao=============== 12*ef3d720fSShuo Zhao 13*ef3d720fSShuo Zhao 14*ef3d720fSShuo Zhao介绍 15*ef3d720fSShuo Zhao==== 16*ef3d720fSShuo Zhao 17*ef3d720fSShuo Zhao原始的 ``ima`` 模板是固定长度的,包含文件数据的哈希值和路径名。文件数据 18*ef3d720fSShuo Zhao哈希值限制为20字节(md5/sha1)。路径名是一个以空字符终止的字符串,长度限 19*ef3d720fSShuo Zhao制为255个字符内。 20*ef3d720fSShuo Zhao为了克服这些限制并添加额外的文件元数据,通过定义额外的模板来扩展当前版本 21*ef3d720fSShuo Zhao的IMA这是有必要的。例如,可能报告的信息包括索引节点的 UID/GID或索引节点 22*ef3d720fSShuo Zhao及访问它进程的LSM标签。 23*ef3d720fSShuo Zhao 24*ef3d720fSShuo Zhao然而,引入这个功能的主要问题是,每次定义一个新模板时,生成和显示度量列表 25*ef3d720fSShuo Zhao的函数都需要包含处理新格式的代码,因此,这些函数的规模随着时间的推移会 26*ef3d720fSShuo Zhao显著增长。 27*ef3d720fSShuo Zhao 28*ef3d720fSShuo Zhao提出的解决方案通过将模板管理与其余IMA代码分离来解决这个问题。该解决方案 29*ef3d720fSShuo Zhao的核心是定义两个新的数据结构:一个是模板描述符,用于确定度量列表中应包含 30*ef3d720fSShuo Zhao哪些信息;另一个是模板字段,用于生成和显示给定类型的数据。 31*ef3d720fSShuo Zhao 32*ef3d720fSShuo Zhao使用这些结构管理模板非常简单。为了支持一种新的数据类型,开发人员定义字段 33*ef3d720fSShuo Zhao标识符,并实现两个函数,分别为init()和show(),用于生成和显示度量条目。 34*ef3d720fSShuo Zhao定义一个新的模板描述符需要通过 ``ima_template_fmt`` 内核命令行参数指定 35*ef3d720fSShuo Zhao模板格式(一个由 ``|`` 字符分隔的字段标识符字符串)。在启动时,IMA通过将格 36*ef3d720fSShuo Zhao式转换从支持的模板字段集合中选取模板字段数组,来初始化所选的模板描述符。 37*ef3d720fSShuo Zhao 38*ef3d720fSShuo Zhao在初始化步骤之后,IMA将调用 ``ima_alloc_init_template()`` (这是为新模板 39*ef3d720fSShuo Zhao管理机制所打补丁中定义的新函数),通过使用在内核配置选择的模板描述符或者新引 40*ef3d720fSShuo Zhao入的 ``ima_template`` 和 ``ima_template_fmt`` 内核命令行参数,生成一个新 41*ef3d720fSShuo Zhao的度量条目。在这一阶段,新架构的优势得以清晰展示:后一个函数将不会包含处理给 42*ef3d720fSShuo Zhao定模板的特定代码,而是简单地调用与所选模板描述符关联的模板字段的 ``init()`` 43*ef3d720fSShuo Zhao方法,并将结果(指向已分配数据的指针和数据长度)存储在度量条目结构中。 44*ef3d720fSShuo Zhao 45*ef3d720fSShuo Zhao相同的机制也用于显示度量条目。函数 ``ima[_ascii]_measurements_show()`` 会为 46*ef3d720fSShuo Zhao每个条目检索用于生成该条目的模板描述符,并为模板字段结构数组中的每一项调用show() 47*ef3d720fSShuo Zhao方法。 48*ef3d720fSShuo Zhao 49*ef3d720fSShuo Zhao 50*ef3d720fSShuo Zhao 51*ef3d720fSShuo Zhao支持的模板字段和描述符 52*ef3d720fSShuo Zhao====================== 53*ef3d720fSShuo Zhao 54*ef3d720fSShuo Zhao下面是支持的模板字段列表 ``('<identifier>': description)`` ,可以通过将其标识符 55*ef3d720fSShuo Zhao添加到格式字符串中用于定义新的模板描述符(后续将添加对更多数据类型的支持): 56*ef3d720fSShuo Zhao 57*ef3d720fSShuo Zhao - 'd':事件的摘要(即测量文件的摘要),通过SHA1或MD5哈希算法计算; 58*ef3d720fSShuo Zhao - 'n':事件的名称(即文件名),大小至多255字节; 59*ef3d720fSShuo Zhao - 'd-ng':事件的摘要,通过任意哈希算法计算(字段格式:<hash algo>:digest); 60*ef3d720fSShuo Zhao - 'd-ngv2':与d-ng相同,但以"ima"或"verity"摘要类型为前缀 61*ef3d720fSShuo Zhao (字段格式:<digest type>:<hash algo>:digest); 62*ef3d720fSShuo Zhao - 'd-modsig':不含附加modsig的事件摘要; 63*ef3d720fSShuo Zhao - 'n-ng':事件的名称,没有大小限制; 64*ef3d720fSShuo Zhao - 'sig':文件签名,基于文件的/文件系统验证的摘要[1],或EVM便携式签名, 65*ef3d720fSShuo Zhao 如果'security.ima'包含文件哈希; 66*ef3d720fSShuo Zhao - 'modsig':附加的文件签名; 67*ef3d720fSShuo Zhao - 'buf':用于生成哈希的缓冲区数据,没有大小限制; 68*ef3d720fSShuo Zhao - 'evmsig':EVM便携式签名; 69*ef3d720fSShuo Zhao - 'iuid':索引节点的UID; 70*ef3d720fSShuo Zhao - 'igid':索引节点的GID; 71*ef3d720fSShuo Zhao - 'imode':索引节点的模式; 72*ef3d720fSShuo Zhao - 'xattrnames':xattr名称的列表(由``|``分隔),仅当xattr存在时; 73*ef3d720fSShuo Zhao - 'xattrlengths':xattr长度的列表(u32),仅当xattr存在时; 74*ef3d720fSShuo Zhao - 'xattrvalues':xattr值的列表; 75*ef3d720fSShuo Zhao 76*ef3d720fSShuo Zhao 77*ef3d720fSShuo Zhao下面是已定义的模板描述符列表: 78*ef3d720fSShuo Zhao 79*ef3d720fSShuo Zhao - "ima":其格式是 ``d|n`` ; 80*ef3d720fSShuo Zhao - "ima-ng"(默认):其格式是 ``d-ng|n-ng`` ; 81*ef3d720fSShuo Zhao - "ima-ngv2":其格式是 ``d-ngv2|n-ng`` ; 82*ef3d720fSShuo Zhao - "ima-sig":其格式是 ``d-ng|n-ng|sig`` ; 83*ef3d720fSShuo Zhao - "ima-sigv2":其格式是 ``d-ngv2|n-ng|sig`` ; 84*ef3d720fSShuo Zhao - "ima-buf":其格式是 ``d-ng|n-ng|buf`` ; 85*ef3d720fSShuo Zhao - "ima-modsig":其格式是 ``d-ng|n-ng|sig|d-modsig|modsig`` ; 86*ef3d720fSShuo Zhao - "evm-sig":其格式是 ``d-ng|n-ng|evmsig|xattrnames|xattrlengths|xattrvalues|iuid|igid|imode`` ; 87*ef3d720fSShuo Zhao 88*ef3d720fSShuo Zhao 89*ef3d720fSShuo Zhao 90*ef3d720fSShuo Zhao使用 91*ef3d720fSShuo Zhao==== 92*ef3d720fSShuo Zhao 93*ef3d720fSShuo Zhao要指定用于生成度量条目的模板描述符,目前支持以下方法: 94*ef3d720fSShuo Zhao 95*ef3d720fSShuo Zhao - 从内核配置所支持模板描述符中选择一个模板描述符( ``ima-ng`` 是默认选择); 96*ef3d720fSShuo Zhao - 通过 ``ima_template=`` 参数从内核命令行指定模板描述符名称; 97*ef3d720fSShuo Zhao - 通过内核命令行参数 ``ima_template_fmt=`` 注册一个具有自定义格式的新模板描述符。 98