IMA 模板管理机制

简介

原始的 ima 模板是固定长度的,包含文件数据哈希和路径名。文件数据哈希限制为 20 字节(MD5/SHA1)。路径名是一个以 null 结尾的字符串,限制为 255 个字符。为了克服这些限制并添加额外的文件元数据,有必要通过定义更多模板来扩展当前版本的 IMA。例如,可能报告的信息包括 inode 的 UID/GID,或 inode 和访问它的进程的 LSM 标签。

然而,引入此功能的主要问题是,每次定义新模板时,生成和显示度量列表的函数都将包含处理新格式的代码,从而随着时间的推移显著增长。

所提出的解决方案通过将模板管理与其余 IMA 代码分离来解决此问题。该解决方案的核心是定义两种新的数据结构:模板描述符,用于确定应包含在度量列表中的信息;模板字段,用于生成和显示给定类型的数据。

使用这些结构管理模板非常简单。为了支持新的数据类型,开发人员需要定义字段标识符并实现两个函数,init() 和 show(),分别用于生成和显示度量条目。定义新的模板描述符需要通过 ima_template_fmt 内核命令行参数指定模板格式(由 | 字符分隔的字段标识符字符串)。在启动时,IMA 会将所选模板描述符的格式转换为支持的模板字段结构数组,并进行初始化。

初始化步骤完成后,IMA 将调用 ima_alloc_init_template()(在新模板管理机制的补丁中定义的新函数),使用通过内核配置或新引入的 ima_templateima_template_fmt 内核命令行参数选择的模板描述符来生成新的度量条目。正是在此阶段,新架构的优势才得以清晰展现:后者函数不包含处理给定模板的特定代码,而是简单地调用与所选模板描述符关联的模板字段的 init() 方法,并将结果(指向已分配数据和数据长度的指针)存储在度量条目结构中。

相同的机制也用于显示度量条目。函数 ima[_ascii]_measurements_show() 会为每个条目检索用于生成该条目的模板描述符,并为模板字段结构数组中的每个项调用 show() 方法。

支持的模板字段和描述符

以下是支持的模板字段列表 ('<identifier>': description),可以通过将其标识符添加到格式字符串来定义新的模板描述符(未来将添加更多数据类型的支持):

  • ‘d’:事件的摘要(即被度量文件的摘要),使用 SHA1 或 MD5 哈希算法计算;

  • ‘n’:事件的名称(即文件名),大小不超过 255 字节;

  • ‘d-ng’:事件的摘要,使用任意哈希算法计算(字段格式:<哈希算法>:摘要);

  • ‘d-ngv2’:与 d-ng 相同,但以“ima”或“verity”摘要类型为前缀(字段格式:<摘要类型>:<哈希算法>:摘要);

  • ‘d-modsig’:事件的摘要,不包含附加的 modsig;

  • ‘n-ng’:事件的名称,没有大小限制;

  • ‘sig’:文件签名,基于文件/fsverity 的摘要[1],或者如果‘security.ima’包含文件哈希,则基于 EVM 可移植签名。

  • ‘modsig’:附加的文件签名;

  • ‘buf’:用于生成哈希的缓冲区数据,没有大小限制;

  • ‘evmsig’:EVM 可移植签名;

  • ‘iuid’:inode UID;

  • ‘igid’:inode GID;

  • ‘imode’:inode 模式;

  • ‘xattrnames’:xattr 名称列表(由 | 分隔),仅当 xattr 存在时;

    present;

  • ‘xattrlengths’:xattr 长度列表 (u32),仅当 xattr 存在时;

  • ‘xattrvalues’:xattr 值列表;

下面是已定义的模板描述符列表:

  • “ima”:其格式为 d|n

  • “ima-ng”(默认):其格式为 d-ng|n-ng

  • “ima-ngv2”:其格式为 d-ngv2|n-ng

  • “ima-sig”:其格式为 d-ng|n-ng|sig

  • “ima-sigv2”:其格式为 d-ngv2|n-ng|sig

  • “ima-buf”:其格式为 d-ng|n-ng|buf

  • “ima-modsig”:其格式为 d-ng|n-ng|sig|d-modsig|modsig

  • “evm-sig”:其格式为 d-ng|n-ng|evmsig|xattrnames|xattrlengths|xattrvalues|iuid|igid|imode

使用

目前支持以下方法来指定用于生成度量条目的模板描述符:

  • 在内核配置中选择一个受支持的模板描述符(ima-ng 是默认选项);

  • 通过 ima_template= 参数从内核命令行指定模板描述符名称;

  • 通过内核命令行参数 ima_template_fmt= 注册一个自定义格式的新模板描述符。