
什么是SELinux
SELinux是安全增強型 Linux(Security-Enhanced Linux)簡稱 SELinux。它是一個 Linux 內(nèi)核模塊,也是 Linux 的一個安全子系統(tǒng)。
SELinux 主要由美國國家安全局開發(fā)。2.6 及以上版本的 Linux 內(nèi)核都已經(jīng)集成了 SELinux 模塊。
SELinux 的結(jié)構(gòu)及配置非常復(fù)雜,而且有大量概念性的東西,要學(xué)精難度較大。很多 Linux 系統(tǒng)管理員嫌麻煩都把 SELinux 關(guān)閉了。
SELinux目的在于明確的指明某個進程可以訪問哪些資源(文件、網(wǎng)絡(luò)端口等)。強制訪問控制系統(tǒng)的用途在于增強系統(tǒng)抵御 0-Day 攻擊(利用尚未公開的漏洞實現(xiàn)的攻擊行為)的能力。
在目前的大多數(shù)發(fā)行版中,已經(jīng)默認在內(nèi)核集成了SELinux。
舉例來說,系統(tǒng)上的 Apache 被發(fā)現(xiàn)存在一個漏洞,使得某遠程用戶可以訪問系統(tǒng)上的敏感文件(比如 /etc/passwd 來獲得系統(tǒng)已存在用戶) ,而修復(fù)該安全漏洞的 Apache 更新補丁尚未釋出。此時 SELinux 可以起到彌補該漏洞的緩和方案。因為 /etc/passwd 不具有 Apache 的 訪問標(biāo)簽,所以 Apache 對于 /etc/passwd 的訪問會被 SELinux 阻止。
優(yōu)勢
相比其他強制性訪問控制系統(tǒng),SELinux 有如下優(yōu)勢:
- 控制策略是可查詢而非程序不可見的。
- 可以熱更改策略而無需重啟或者停止服務(wù)。
- 可以從進程初始化、繼承和程序執(zhí)行三個方面通過策略進行控制。
- 控制范圍覆蓋文件系統(tǒng)、目錄、文件、文件啟動描述符、端口、消息接口和網(wǎng)絡(luò)接口。
SELinux for Android
SELinux for Android在架構(gòu)和機制上與SELinux完全一樣,考慮到移動設(shè)備的特點,所以移植到Android上的只是SELinux的一個子集。SELinux for Android的安全檢查幾乎覆蓋了所有重要的系統(tǒng)資源,包括域轉(zhuǎn)換,類型轉(zhuǎn)換,進程、內(nèi)核、文件、目錄、設(shè)備,App,網(wǎng)絡(luò)及IPC相關(guān)的操作。
Android分為寬容模式(僅記錄但不強制執(zhí)行 SELinux 安全政策 )和強制模式(強制執(zhí)行并記錄安全政策。如果失敗,則顯示為 EPERM 錯誤。 );在選擇強制執(zhí)行級別時只能二擇其一。
您的選擇將決定您的政策是采取操作,還是僅允許您收集潛在的失敗事件。寬容模式在實現(xiàn)過程中尤其有用。
寬容模式 DAC (Discretionary Access Control,自主訪問控制)
DAC是傳統(tǒng)的Linux的訪問控制方式,DAC可以對文件、文件夾、共享資源等進行訪問控制。
在DAC這種模型中,文件客體的所有者(或者管理員)負責(zé)管理訪問控制。
DAC使用了ACL(Access Control List,訪問控制列表)來給非管理者用戶提供不同的權(quán)限,而root用戶對文件系統(tǒng)有完全自由的控制權(quán)。
強制模式 MAC (Mandatory Access Control,強制訪問控制)
MAC是任何進程想在SELinux系統(tǒng)中干任何事情,都必須先在安全策略配置文件中賦予權(quán)限。
凡是沒有出現(xiàn)在安全策略配置文件中的權(quán)限,進程就沒有該權(quán)限。
這個機制相當(dāng)于一個白名單,這個白名單上配置了所有進程的權(quán)限,進程只能做白名單上權(quán)限內(nèi)的事情,一旦它想做一個不屬于它權(quán)限的操作就會被拒絕。
這就需要使用到配置文件和其對應(yīng)的te語法。
te基本語法
rule_name source_type target_type:class perm_set
語法解析:
| 語法 | 含義 |
|---|---|
| source_type | 一個進程或一組進程的標(biāo)簽。也稱為域類型,因為它只是指進程的類型 |
| target_type | 一個對象(例如,文件、套接字)或一組對象的標(biāo)簽 |
| Class | 要訪問的對象(例如,文件、套接字)的類型 |
| perm_set | 要執(zhí)行的操作(例如,讀取、寫入) |
rule_name命令
| rule_name命令 | 含義 |
|---|---|
| allow | 允許某個進程執(zhí)行某個動作 |
| auditallow | audit含義就是記錄某項操作。默認SELinux只記錄那些權(quán)限檢查失敗的操作。 auditallow則使得權(quán)限檢查成功的操作也被記錄。注意,allowaudit只是允許記錄,它和賦予權(quán)限沒關(guān)系。賦予權(quán)限必須且只能使用allow語句 |
| dontaudit | 對那些權(quán)限檢查失敗的操作不做記錄 |
| neverallow | 沒有被allow到的動作默認就不允許執(zhí)行的。neverallow只是顯式地寫出某個動作不被允許,如果添加了該動作的allow,則會編譯錯誤 |
source_type命令
指定一個“域”(domain),一般用于描述進程,該域內(nèi)的的進程,受該條TE語句的限制。
用type關(guān)鍵字,把一個自定義的域與原有的域相關(guān)聯(lián),最簡單地定義一個新域的方式為:
type shell, domain
意思為賦予shell給domain屬性,同時,shell與屬于domain這個集合里。
例如:有一個allow domain xxxxx 的語句,同樣地也給了shell xxxxx的屬性。
target_type命令
進程需要操作的客體(文件,文件夾等)類型(安全上下文),同樣是用type與一些已有的類型,屬性相關(guān)聯(lián)。
type有兩個作用,定義(聲明)并關(guān)聯(lián)某個屬性。
可以把這兩個作用分開,type定義,typeattribute進行關(guān)聯(lián)。
Class命令
class定義在文件system/sepolicy/private/security_classes中.

perm_set命令
定義在system/sepolicy/private/access_vectors。有兩種定義方法。
-
用common命令定義:
image.png -
用class命令定義:
image.png
SecurityContext語法
SELinux中,每種東西都會被賦予一個安全屬性,它就是SecurityContext(Security Context以下簡稱SContext,安全上下文或安全屬性)是一個字符串,主要由三部分組成。
例如在 SELinux for Android中,進程的SContext可以通過PS-Z命令查看,如下:
$ ps -Z
LABEL USER PID PPID NAME
u:r:init:s0 root 1 0 /init
u:r:kernel:s0 root 2 0 kthreadd
u:r:kernel:s0 root 258 2 irq/322-HPH_R O
u:r:logd:s0 logd 259 1 /system/bin/logd
u:r:healthd:s0 root 260 1 /sbin/healthd
u:r:lmkd:s0 root 261 1 /system/bin/lmkd
u:r:servicemanager:s0 system 262 1 /system/bin/servicemanager
u:r:vold:s0 root 263 1 /system/bin/vold
其中:
| 語法 | 含義 |
|---|---|
| u | user:SEAndroid中定義了一個SELinux用戶,值為u |
| r | role:role:角色,它是SELinux中一種比較高層次,更方便的權(quán)限管理思路,即RoleBased Access Control(基于角色的訪問控制,簡稱RBAC)。簡單點說,一個user可以屬于多個role,不同的role具有不同的權(quán)限。 |
| init | init域(Doamin)。MAC的基礎(chǔ)管理思路是所謂的TypeEnforcement Access Control(簡稱TEAC,一般用TE表示)。對進程來說Type就是Domain,比如init這個Domain有什么權(quán)限,都需要在策略文件(init.te)中定義。 |
| s0 | SELinux為了滿足軍用和教育行業(yè)而設(shè)計的Multi-LevelSecurity(MLS)機制有關(guān)。簡單點說,MLS將系統(tǒng)的進程和文件進行了分級,不同級別的資源需要對應(yīng)級別的進程才能訪問。 |
SELINUX相關(guān)的代碼目錄
1. kernel/msm-3.18/security/selinux/
2. external/selinux/
3. 用BOARD_SEPOLICY_DIRS添加的各te文件和安全配置文件,主要包括device/<oem_name>/sepolicy/<product_name>/和system/sepolicy/,以及其他功能模塊添加的配置文件。
參考
一文徹底明白linux中的selinux到底是什么
SELinux之一:SELinux基本概念及基本配置
Android selinux配置和用法
詳解 SEAndroid 以及 Hack 其規(guī)則(sepolicy)
SELinux/SEAndroid 實例簡述(二) TE語言規(guī)則

