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= 註冊一個自定義格式的新模板描述符。