IMA 模板管理机制

简介

原始的 ima 模板是固定长度的,包含文件数据哈希值和路径名。文件数据哈希值限制为 20 字节(md5/sha1)。路径名是一个以空字符结尾的字符串,限制为 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’:事件的摘要,使用任意哈希算法计算(字段格式:<hash algo>:digest);

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

  • ‘d-modsig’:没有附加 modsig 的事件摘要;

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

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

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

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

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

  • ‘iuid’:inode UID;

  • ‘igid’:inode GID;

  • ‘imode’:inode 模式;

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

    存在;

  • ‘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= 注册具有自定义格式的新模板描述符。