Linux安全模組:Linux通用安全鉤子

作者:

Stephen Smalley

作者:

Timothy Fraser

作者:

Chris Vance

注意

本書中描述的API已過時。

引言

2001年3月,美國國家安全域性(NSA)在2.5版Linux核心峰會上就安全增強型Linux(SELinux)進行了演示。SELinux是Linux核心中靈活細粒度非自主訪問控制的實現,最初是作為其自身的特定核心補丁實現的。其他幾個安全專案(例如RSBAC、Medusa)也為Linux核心開發了靈活的訪問控制架構,並且各種專案也為Linux開發了特定的訪問控制模型(例如LIDS、DTE、SubDomain)。每個專案都開發並維護了自己的核心補丁,以滿足其安全需求。

針對NSA的演示,Linus Torvalds發表了一系列評論,描述了他願意考慮納入主流Linux核心的一個安全框架。他描述了一個通用框架,該框架將提供一套安全鉤子來控制核心物件上的操作,以及核心資料結構中一組不透明的安全欄位,用於維護安全屬性。然後,可載入的核心模組就可以使用此框架來實現任何所需的安全性模型。Linus還建議將Linux能力程式碼遷移到此類模組中。

Linux安全模組(LSM)專案由WireX發起,旨在開發這樣一個框架。LSM是多個安全專案(包括Immunix、SELinux、SGI和Janus)以及多位個人(包括Greg Kroah-Hartman和James Morris)共同努力的成果,旨在開發一個實現此框架的Linux核心補丁。這項工作於2003年12月被納入主流。本技術報告概述了該框架和能力安全模組。

LSM框架

LSM框架提供了一個通用的核心框架來支援安全模組。具體來說,LSM框架主要側重於支援訪問控制模組,儘管未來的開發可能會解決其他安全需求,例如沙盒。該框架本身不提供任何額外的安全性;它僅僅提供支援安全模組的基礎設施。LSM框架是可選的,需要啟用CONFIG_SECURITY。能力邏輯是作為安全模組實現的。這個能力模組將在LSM能力模組中進一步討論。

LSM框架在核心資料結構中包含安全欄位,並在核心程式碼的關鍵點呼叫鉤子函式,以管理安全欄位和執行訪問控制。它還添加了用於註冊安全模組的函式。介面/sys/kernel/security/lsm報告系統中活動的以逗號分隔的安全模組列表。

LSM安全欄位就是簡單的void*指標。這些資料被稱為“blob”,可以由框架管理,也可以由使用它的各個安全模組管理。被多個安全模組使用的安全blob通常由框架管理。對於程序和程式執行安全資訊,安全欄位包含在struct task_structstruct cred中。對於檔案系統安全資訊,安全欄位包含在struct super_block中。對於管道、檔案和套接字安全資訊,安全欄位包含在struct inodestruct file中。對於System V IPC安全資訊,安全欄位已新增到struct kern_ipc_permstruct msg_msg中;此外,struct msg_msg、struct msg_queue和struct shmid_kernel的定義已移至標頭檔案(include/linux/msg.hinclude/linux/shm.h,視情況而定),以允許安全模組使用這些定義。

對於資料包和網路裝置安全資訊,安全欄位已新增到struct sk_buffstruct scm_cookie中。與其他安全模組資料不同,這裡使用的資料是32位整數。安全模組需要將這些值對映或以其他方式與真實的安全屬性關聯起來。

LSM鉤子以列表形式維護。每個鉤子都維護一個列表,鉤子按CONFIG_LSM指定的順序呼叫。每個鉤子的詳細文件都包含在security/security.c原始檔中。

LSM框架提供了一種通用安全模組堆疊的近似實現。它定義了security_add_hooks()函式,每個安全模組都會向其傳遞一個struct security_hooks_list結構體,這些結構體會被新增到列表中。LSM框架不提供移除已註冊鉤子的機制。SELinux安全模組實現了一種自移除方式,但該功能已被廢棄。

這些鉤子可分為兩大類:用於管理安全欄位的鉤子和用於執行訪問控制的鉤子。第一類鉤子的示例包括security_inode_alloc()security_inode_free()。這些鉤子用於為inode物件分配和釋放安全結構。第二類鉤子的一個示例是security_inode_permission()鉤子。此鉤子在訪問inode時檢查許可權。

LSM能力模組

POSIX.1e能力邏輯作為安全模組維護,儲存在檔案security/commoncap.c中。該能力模組使用lsm_info描述的order欄位,將其標識為第一個要註冊的安全模組。與其他模組不同,能力安全模組不使用通用的安全blob。這些原因具有歷史性,並基於開銷、複雜性和效能考量。