歡迎您光臨本站 註冊首頁

揭開SELinux的秘密

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

深入探討 NSA 的 Linux 安全性增強型版本的代碼

美國國家安全局 (NSA) 不同尋常地向開放源碼社區公布了安全性增強型版本的 Linux -- 包括代碼和所有部分。這篇 developerWorks 的第 2 部分專門深入研究了該代碼,剖析了 security_av 是如何計算的以及檢查如何調用其它 SE Linux 安全性特性。


幼蟲、沙礫和代碼

讓我們看一下 SE Linux 分發版中的一些 C 代碼,檢驗安全性增強的實現細節。

讓我們從頭開始。在分發版目錄 include/linux/flask/flask types.h. 中有包含基本 Flask 類型和常量的頭文件,現摘錄如下:
QUOTE:
/*The security context type
* is defined as a variable-length string that can be
* interpreted by any application or user.
*/
typedef char* security_context_t;

/*
* A security identifier (SID) is a fixed-size value
* that is mapped by the security server to a
* particular security context.
*/
typedef __u32 security_id_t;
#define SECSID_NULL??????0x00000000 /* unspecified SID */
#define SECSID_WILD??????0xFFFFFFFF /* wildcard SID */

/*
* Each object class is identified by a fixed-size value.
.
*/
typedef __u16 security_class_t;
#define SECCLASS_NULL??????0x0000 /* no class */

/*
* A persistent security identifier (PSID) is a fixed-size
* value that is assigned by the file system component
* to each security context associated with an object
* in the file system.?
*/
typedef __u32 psid_t;
struct psidtab;


/*
* An access vector (AV) is a collection of related permissions
* for a pair of SIDs.
*/
typedef __u32 access_vector_t;


在 kernel/flask/access_vectors,我們發現這些結構進一步定義了安全性伺服器 AV:

class security
{
? compute_av
? notify_perm
? transition_sid
? member_sid
? sid_to_context
? context_to_sid
? load_policy
? get_sids
? register_avc
? change_sid
}

與過程相關的對象有一個類似於這樣的 AV:
QUOTE:
class process
{
? execute
? fork
? transition
? sigchld
? sigkill
? sigstop
? signal
? ptrace
? getsched
? setsched
? getsession
? getpgid
? setpgid
? getcap
? setcap
? entrypoint
}

文件對象 AV 是如下結構:
QUOTE:
class filesystem
{
? mount
? remount
? unmount
? getattr
? relabelfrom
? relabelto
? transition
? associate
}

class dir
inherits file
{
? add_name
? remove_name
? reparent
? search
? rmdir
? mounton
? mountassociate
}

由於我們進入了 AV 聲明,讓我們看一下在安全性伺服器中進行 AV 計算的代碼。記住,如果未擊中緩存,那麼核心調用 AVC,AVC 調用安全性伺服器。

該代碼片段來自己提供最小實現,該實現提供單一 SID 並授予所有許可權。這不是很安全。在該段代碼中,計算 AV 併產生一個 SID。請注意,ssid 是源 SID,tsid 是目標 SID。由於我進行了一些註釋,破壞了原有的良好格式。

這就是現狀。它可能是最簡單的,而且不是很有用。想要了解添加了 RBAC、TE 和 MLS 的 security_compute_av 有些什麼,請查看 kernel/security/services.c 中的代碼。


安全性調用

在 SE Linux 中安全性調用是如何工作的?對於那一點,請參閱代碼樣本,在其發行版中概述了 call_security.c。包括代碼片段和註釋。為簡短起見,我忽略了在主菜單選項之前出現的正確性檢查函數。


該代碼樣本是類似的代碼片段,但它來自於上篇文章(請參閱參考資料)提到的 checkpolicy 程序。它顯示了其它安全性函數調用的代碼,並且完全不需加以說明。checkpolicy 程序包含安全性伺服器代碼的完整副本,只要執行這個副本,使其允許:(1) 測試/調試用戶空間中的代碼,(2) 在引導之前檢查策略,(3) 把策略編譯成其二進位表示。

這個簡單示例說明了只可以使用這些調用的方式之一。內核訪問向量高速緩存調用 kernel/include/linux/flask/avc.h 中的內聯函數 avc_has_perm_ref_audit 中的 security_compute_av。然後,可以通過對象管理器調用 kernel/fs/namei.c 中的 do_link 函數中的 avc_has_perm_ref_audit。這提供了內核如何調用 AVC 以及 AVC 如何調用安全性伺服器(如果有高速緩存失配)的示例。

應用程序如何調用 security_compute_av 的示例在 utils/vixie-cron-3.0.1/database.c 的 process_crontab 函數中。這顯示了應用程序如何調用安全性伺服器。作者已聲明他們計劃提供一個應用程序 AVC 庫,以便於應用程序也可以緩存安全性策略以及使用與核心風格一致的介面。這將極大地簡化編程工作,我們只能希望這會儘快出現。


結束語

安全性增強型 Linux 的前途非常光明,因為它看起來能滿足安全 OS 的需要。當然,要達到實際可用的形式還有很多事要做,但是開放源碼社團可能會處理這件事。


本文檢查了一些代碼的內幕,從而顯示了它們的工作機制。請記住,這只是從分發的完整代碼中抽取的一部分代碼片段。應該經常查閱分發站點(請參閱參考資料),以確保您拿到的是最新版本。


致謝

本文已由那些很有資歷的同仁們進行了技術審閱,他們不想讓我在這公共的場合提到他們。也好,他們知道他們是誰。謝謝。


參考資料


通過合併一個稱為 NetTop 的商業產品,據稱 NSA 將替換一些物理上分隔的計算機。
在國家安全局的網站上有新的基於 2.4.2 的 SE Linux 發行版。
SE Linux 的文檔包括內核安全性機制的設計和實現,以及安全性策略配置的詳細信息。
從 NSA 站點下載源代碼。

關於作者

Larry Loeb 是上一世紀許多「死刑架」計算機雜誌的編輯或撰稿人。他出版了一本有關 SET 的書籍,SET 是由 Visa 和 MasterCard 為安全電子交易而開發的一種協議。可以通過 larryloeb@prodigy.net 與他聯繫,大多數情況下您會得到答覆。

[火星人 ] 揭開SELinux的秘密已經有619次圍觀

http://coctec.com/docs/linux/show-post-136870.html