什么是SELinux
SELinux是安全增強(qiáng)型 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目的在于明確的指明某個進(jìn)程可以訪問哪些資源(文件、網(wǎng)絡(luò)端口等)扎筒。強(qiáng)制訪問控制系統(tǒng)的用途在于增強(qiáng)系統(tǒng)抵御 0-Day 攻擊(利用尚未公開的漏洞實(shí)現(xiàn)的攻擊行為)的能力莱找。
在目前的大多數(shù)發(fā)行版中,已經(jīng)默認(rèn)在內(nèi)核集成了SELinux嗜桌。
舉例來說奥溺,系統(tǒng)上的 Apache 被發(fā)現(xiàn)存在一個漏洞,使得某遠(yuǎn)程用戶可以訪問系統(tǒng)上的敏感文件(比如 /etc/passwd 來獲得系統(tǒng)已存在用戶) 骨宠,而修復(fù)該安全漏洞的 Apache 更新補(bǔ)丁尚未釋出浮定。此時 SELinux 可以起到彌補(bǔ)該漏洞的緩和方案。因?yàn)?/etc/passwd 不具有 Apache 的 訪問標(biāo)簽层亿,所以 Apache 對于 /etc/passwd 的訪問會被 SELinux 阻止桦卒。
優(yōu)勢
相比其他強(qiáng)制性訪問控制系統(tǒng),SELinux 有如下優(yōu)勢:
- 控制策略是可查詢而非程序不可見的匿又。
- 可以熱更改策略而無需重啟或者停止服務(wù)方灾。
- 可以從進(jìn)程初始化、繼承和程序執(zhí)行三個方面通過策略進(jìn)行控制碌更。
- 控制范圍覆蓋文件系統(tǒng)裕偿、目錄、文件针贬、文件啟動描述符击费、端口、消息接口和網(wǎng)絡(luò)接口桦他。
SELinux for Android
SELinux for Android在架構(gòu)和機(jī)制上與SELinux完全一樣蔫巩,考慮到移動設(shè)備的特點(diǎn),所以移植到Android上的只是SELinux的一個子集快压。SELinux for Android的安全檢查幾乎覆蓋了所有重要的系統(tǒng)資源圆仔,包括域轉(zhuǎn)換,類型轉(zhuǎn)換蔫劣,進(jìn)程坪郭、內(nèi)核、文件脉幢、目錄歪沃、設(shè)備嗦锐,App,網(wǎng)絡(luò)及IPC相關(guān)的操作沪曙。
Android分為寬容模式
(僅記錄但不強(qiáng)制執(zhí)行 SELinux 安全政策 )和強(qiáng)制模式
(強(qiáng)制執(zhí)行并記錄安全政策奕污。如果失敗,則顯示為 EPERM 錯誤液走。 )碳默;在選擇強(qiáng)制執(zhí)行級別時只能二擇其一。
您的選擇將決定您的政策是采取操作缘眶,還是僅允許您收集潛在的失敗事件嘱根。寬容模式在實(shí)現(xiàn)過程中尤其有用。
寬容模式 DAC (Discretionary Access Control巷懈,自主訪問控制)
DAC是傳統(tǒng)的Linux的訪問控制方式该抒,DAC可以對文件、文件夾砸喻、共享資源等進(jìn)行訪問控制柔逼。
在DAC這種模型中,文件客體的所有者(或者管理員)負(fù)責(zé)管理訪問控制割岛。
DAC使用了ACL(Access Control List,訪問控制列表)來給非管理者用戶提供不同的權(quán)限犯助,而root用戶對文件系統(tǒng)有完全自由的控制權(quán)癣漆。
強(qiáng)制模式 MAC (Mandatory Access Control,強(qiáng)制訪問控制)
MAC是任何進(jìn)程想在SELinux系統(tǒng)中干任何事情剂买,都必須先在安全策略配置文件中賦予權(quán)限惠爽。
凡是沒有出現(xiàn)在安全策略配置文件中的權(quán)限,進(jìn)程就沒有該權(quán)限瞬哼。
這個機(jī)制相當(dāng)于一個白名單婚肆,這個白名單上配置了所有進(jìn)程的權(quán)限,進(jìn)程只能做白名單上權(quán)限內(nèi)的事情坐慰,一旦它想做一個不屬于它權(quán)限的操作就會被拒絕较性。
這就需要使用到配置文件和其對應(yīng)的te語法。
te基本語法
rule_name source_type target_type:class perm_set
語法解析:
語法 | 含義 |
---|---|
source_type | 一個進(jìn)程或一組進(jìn)程的標(biāo)簽结胀。也稱為域類型赞咙,因?yàn)樗皇侵高M(jìn)程的類型 |
target_type | 一個對象(例如,文件糟港、套接字)或一組對象的標(biāo)簽 |
Class | 要訪問的對象(例如攀操,文件、套接字)的類型 |
perm_set | 要執(zhí)行的操作(例如秸抚,讀取速和、寫入) |
rule_name命令
rule_name命令 | 含義 |
---|---|
allow | 允許某個進(jìn)程執(zhí)行某個動作 |
auditallow | audit含義就是記錄某項(xiàng)操作歹垫。默認(rèn)SELinux只記錄那些權(quán)限檢查失敗的操作。 auditallow則使得權(quán)限檢查成功的操作也被記錄颠放。注意排惨,allowaudit只是允許記錄,它和賦予權(quán)限沒關(guān)系慈迈。賦予權(quán)限必須且只能使用allow語句 |
dontaudit | 對那些權(quán)限檢查失敗的操作不做記錄 |
neverallow | 沒有被allow到的動作默認(rèn)就不允許執(zhí)行的若贮。neverallow只是顯式地寫出某個動作不被允許,如果添加了該動作的allow痒留,則會編譯錯誤 |
source_type命令
指定一個“域”(domain)谴麦,一般用于描述進(jìn)程,該域內(nèi)的的進(jìn)程伸头,受該條TE語句的限制匾效。
用type
關(guān)鍵字,把一個自定義的域與原有的域相關(guān)聯(lián),最簡單地定義一個新域的方式為:
type shell, domain
意思為賦予shell給domain屬性恤磷,同時面哼,shell與屬于domain這個集合里。
例如:有一個allow domain xxxxx 的語句扫步,同樣地也給了shell xxxxx的屬性魔策。
target_type命令
進(jìn)程需要操作的客體(文件,文件夾等)類型(安全上下文)河胎,同樣是用type與一些已有的類型闯袒,屬性相關(guān)聯(lián)。
type有兩個作用游岳,定義(聲明)并關(guān)聯(lián)某個屬性政敢。
可以把這兩個作用分開,type定義胚迫,typeattribute進(jìn)行關(guān)聯(lián)喷户。
Class命令
class定義在文件system/sepolicy/private/security_classes
中.
perm_set命令
定義在system/sepolicy/private/access_vectors
。有兩種定義方法访锻。
-
用common命令定義:
-
用class命令定義:
SecurityContext語法
SELinux中褪尝,每種東西都會被賦予一個安全屬性,它就是SecurityContext(Security Context以下簡稱SContext朗若,安全上下文或安全屬性)是一個字符串恼五,主要由三部分組成。
例如在 SELinux for Android中哭懈,進(jìn)程的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)容达。簡單點(diǎn)說古涧,一個user可以屬于多個role,不同的role具有不同的權(quán)限花盐。 |
init | init域(Doamin)羡滑。MAC的基礎(chǔ)管理思路是所謂的TypeEnforcement Access Control(簡稱TEAC,一般用TE表示)算芯。對進(jìn)程來說Type就是Domain柒昏,比如init這個Domain有什么權(quán)限,都需要在策略文件(init.te)中定義熙揍。 |
s0 | SELinux為了滿足軍用和教育行業(yè)而設(shè)計(jì)的Multi-LevelSecurity(MLS)機(jī)制有關(guān)职祷。簡單點(diǎn)說,MLS將系統(tǒng)的進(jìn)程和文件進(jìn)行了分級届囚,不同級別的資源需要對應(yīng)級別的進(jìn)程才能訪問有梆。 |
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 實(shí)例簡述(二) TE語言規(guī)則