「轉」安全增強 Linux (SELinux) 剖析

Linux® 一直被認為是最安全的操作系統之一,但是通過引入安全增強 Linux(Security-Enhanced Linux,SELinux),National Security Agency (NSA) 將 Linux 的安全性提升到了新的高度。SELinux 通過對內核和用戶空間進行修改,對現有的 GNU/Linux 操作系統進行了擴展,從而使其變得堅不可摧。如果您現在正在使用 2.6 版的內核,就會驚奇地發現您已經在使用 SELinux 了!本文將探究 SELinux 背後的思想及其實現方法.

簡介

公共網絡(比如 Internet)充滿著危險。只要將電腦連接到 Internet(即使只連接很短的時間),您就會感受到這一點。攻擊者可以利用不安全性來獲得對一個系統的訪問,獲得對信息的未授權訪問,或者對一臺計算機進行改造,以利用它發送垃圾郵件或攻擊其他高端系統(使用 SYN 泛洪攻擊,一種分佈式拒絕服務攻擊)。

分佈式拒絕服務攻擊(DDoS)通過 Internet 上的多個系統來實現(所以也稱為殭屍電腦),這些系統消耗目標系統上的資源,(利用 TCP 的三向握手)使其不能被合法的用戶訪問。一種帶有 cookie 的四向握手協議(Stream Control Transmission Protocol [SCTP])可以防禦這種攻擊,更多信息請參見 參考資料 一節。

SELinux 的起源

SELinux 是一個面向政府和行業的產品,由 NSA、Network Associates、Tresys 以及其他組織設計和開發。儘管 NSA 將其作為一個補丁集引入,但從 2.6 版開始,它就被加入到 Linux 內核中。

GNU/Linux 非常安全,但它也非常動態:所做的更改會為操作系統帶來新的漏洞,這些漏洞可能被攻擊者利用,儘管人們都非常關心阻止未授權訪問,但是發生入侵後會發生什麼呢?

本文將探究 SELinux 背後的思想及其基本架構。關於 SELinux 的完整描述涉及一整本書的內容(參見 參考資料 一節),所以本文只關注其基本原理,使您瞭解 SELinux 的重要性及其實現過程。

訪問控制方法

大多數操作系統使用訪問控制來判斷一個實體(用戶或程序)是否能夠訪問給定資源。基於 UNIX® 的系統使用一種自主訪問控制(discretionary access control,DAC)的形式。此方法通常根據對象所屬的分組來限制對對象的訪問。例如,GNU/Linux 中的文件有一個所有者、一個分組和一個權限集。權限定義誰可以訪問給定文件、誰可以讀取它、誰可以向其寫入,以及誰可以執行它。這些權限被劃分到三個用戶集中,分別表示用戶(文件所有者)、分組(一個用戶組的所有成員)和其他(既不是文件所有者,又不是該分組的成員的所有用戶)。

很多這樣的訪問控制都會帶來一個問題,因為所利用的程序能夠繼承用戶的訪問控制。這樣,該程序就可以在用戶的訪問層進行操作。與通過這種方式定義約束相比,使用最小特權原則 更安全:程序只能執行完成任務所需的操作。例如,如果一個程序用於響應 socket 請求,但不需要訪問文件系統,那麼該程序應該能夠監聽給定的 socket,但是不能訪問文件系統。通過這種方式,如果該程序被攻擊者利用,其訪問權限顯然是最小的。這種控制類型稱為強制訪問控制(MAC)。

另一種控制訪問的方法是基於角色的訪問控制(RBAC)。在 RBAC 中,權限是根據安全系統所授予的角色來提供的。角色的概念與傳統的分組概念不同,因為一個分組代表一個或多個用戶。一個角色可以代表多個用戶,但它也代表一個用戶集可以執行的權限。

SELinux 將 MAC 和 RBAC 都添加到了 GNU/Linux 操作系統中。下一節將探討 SELinux 實現,以及如何將安全增強透明地添加到 Linux 內核中。

Linux 安全實現

在早期的 SELinux 中,它還是一個補丁集,它提供了自己的安全性框架。這存在著一些問題,因為它將 GNU/Linux 限制到一個單獨的訪問控制架構。Linux 內核繼承了一種通用框架,將策略從實現中分離了出來,而不是採用單一的方法。該解決方案就是 Linux 安全模塊(Linux Security Module,LSM)框架。LSM 提供了一種通用的安全框架,允許將安全模型實現為可載入內核模塊(參見圖 1)。

「轉」安全增強 Linux (SELinux) 剖析

圖 1. SELinux 將安全策略和實施分離

在訪問內部對象之前對內核代碼進行修改,以調用一個代表實施函數的鉤子,該實施函數實現安全策略。該函數根據預定義的策略驗證操作能否繼續進行。安全函數存儲在一個安全操作結構中,該結構包含必須受到保護的基本操作。例如,security_socket_create 鉤子(security_ops->socket_create)在創建新 socket 之前檢查權限,並考慮協議集、類型、協議,以及 socket 是在內核中創建還是在用戶空間中創建。清單 1 提供了 socket.c 中用於創建 socket 的示例代碼(參見 ./linux/net/socket.c)。

清單 1. 創建 socket 的內核代碼

「轉」安全增強 Linux (SELinux) 剖析

security_socket_create 函數在 ./linux/include/linux/security.h 中定義。它提供了從 security_socket_create 到 security_ops 結構中動態安裝的函數的間接調用(參見清單 2)。

清單 2. 用於 socket 創建檢查的間接調用

static inline int security_socket_create (int family, int type,
int protocol, int kern)
{
return security_ops->socket_create(family, type, protocol, kern);
}

security_ops 結構中的函數通過安全模塊安裝。在本例中,這些鉤子在可載入的 SELinux 內核模塊中定義。每個 SELinux 調用在 hooks 文件內部定義,該文件實現從內核函數到特定安全模塊的動態調用的間接性(參見清單 3 中的 .../linux/security/selinux/hooks.c 代碼)。

清單 3. SELinux socket 創建檢查

「轉」安全增強 Linux (SELinux) 剖析

清單 3 的核心部分是一個調用,用於驗證當前操作是否是當前任務(通過 current->security 定義,其中 current 代表當前正在執行的任務)所允許的。訪問向量緩存(Access Vector Cache,AVC)緩存了之前的 SELinux 決策(提高進程的性能)。此調用包括源安全標識符(sid)、安全類(根據請求操作的詳細信息構造)、特定 socket 調用,以及可選的輔助審計數據。如果未在緩存中找到決策,那麼會調用安全服務器來獲取決策(此過程如圖 2 所示)。

「轉」安全增強 Linux (SELinux) 剖析

圖 2. 分層 Linux 安全進程

初始化到 security_ops 中的回調鉤子被動態定義為一個可載入內核模塊(通過 register_security()),但是在沒有載入安全模塊時,這些鉤子包含偽樁(dummy stub)函數(參見 ./linux/security/dummy.c)。這些樁函數實現標準 Linux DAC 策略。始終存在回調鉤子,其中必須提供對象中介(mediation)來保證安全性。這包括任務管理(創建、通知、等待)、程序載入(execve)、文件系統管理(超級塊、inode、文件鉤子)、IPC(消息隊列、共享內存、信號量(semaphore)操作)、模塊鉤子(插入和刪除)、網絡鉤子(覆蓋 socket、netlink、網絡設備和其他協議接口)。更多信息請參見 參考資料 小節或回顧 security.h 文件。

本文不打算討論 SELinux 策略的管理,但您可以在 參考資料 小節找到關於 SELinux 配置的更多信息。

其他方法

SELinux 是目前最全面的安全框架之一,但它不是惟一的。本節回顧其他一些可用的方法。

AppArmor

AppArmor 最初由 Immunix 開發,隨後由 Novell 維護,它是 SELinux 的替代方法,也使用了 Linux 安全模塊(LSM)框架。由於 SELinux 和 AppArmor 使用了同樣的框架,所以它們可以互換。AppArmor 的開發初衷是因為人們認為 SELinux 太過複雜,不適合普通用戶管理。AppArmor 包含一個完全可配置的 MAC 模型和一個學習模式,在學習模式中,程序的典型行為可以轉換為一個配置文件。

SELinux 的一個問題在於,它需要一個支持擴展屬性的文件系統;而 AppArmor 對文件系統沒有任何要求。您可以在 SUSE、OpenSUSE,以及 Ubuntu 的 Gutsy Gibbon 中找到 AppArmor。

Solaris 10(是受信任的 Solaris)

Solaris 10 操作系統通過其增強了安全性的 Trusted Extensions 組件提供了強制訪問控制。該功能適用於 MAC 和 RBAC。Solaris 通過向所有對象添加敏感性標籤實現了這一點,使您能夠控制設備、文件、連網訪問,甚至窗口管理服務。Solaris 10 中的 RBAC 的優點在於,它通過提供對管理任務(可在以後進行分配)的細粒度控制最小化了對根訪問的需求。

TrustedBSD

TrustedBSD 是一個正在進行中的項目,主要開發可靠的操作系統擴展,這些擴展最終會加入 FreeBSD 操作系統。它包括構建在 Flux Advanced Security Kernel (Flask) 安全架構之上的強制訪問控制,後者包括以插件模塊形式提供的類型強制和多級安全(MLS)。TrustedBSD 還合併了來自 Apple Darwin 操作系統的開源 Basic Security Module (BSM) 審計實現(BSM 最初由 Sun 引入)。BSM 是一個審計 API 和文件格式,它支持普通的審計跟蹤處理。TrustedBSD 還構成了供 Security Ennetlink、網絡設備和其他協議接口)。更多信息請hanced Darwin (SEDarwin) 使用的框架。

操作系統虛擬化

增強操作系統內部安全性的最後一個選擇是操作系統虛擬化(也稱為虛擬專用服務器(virtual private servers))。一個操作系統擁有多個獨立的用戶空間實例,可以實現功能分離。操作系統虛擬化對在獨立用戶空間內部運行的應用程序功能進行了限制。例如,一個用戶空間實例也許不能修改內核(載入或移除內核模塊),也不能掛載或卸載文件系統。並且不允許修改內核參數(例如,通過 proc 文件系統)。任何修改其他用戶實例環境的操作都是不允許的。

許多操作系統都能實現操作系統虛擬化。GNU/Linux 支持 VServer、Parallels Viruozzo Container 和 OpenVZ。在其他操作系統中,您可以找到容器(Solaris)和 jail(BSD)。在 Linux-VServer 中,每個單獨的用戶空間實例稱為一個安全上下文。在每個安全上下文中,會為專用服務器實例啟動一個新的 init。關於操作系統虛擬化和其他虛擬化方法的更多信息,請參見 參考資料 一節。

結束語

對於 Linux 內核來說,強制訪問控制和基於角色的訪問控制都是相對較新的功能。隨著 LSM 框架的引入,新的安全模塊將會出現。除了對框架的增強,還可以堆疊安全模塊,從而允許多個安全模塊共存,而且最大限度地覆蓋了 Linux 的安全需求。隨著對操作系統安全性的深入研究,將會引入新的訪問控制方法。


分享到:


相關文章: