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_template
和 ima_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=
注册一个自定义格式的新模板描述符。