selinux for android一、 基礎概念
技術標籤:android os
文章目錄
SElinux
Security-Enhanced Linux,安全增強型Linux,一個核心模組,也是Linux的安全子系統。
由美國國家安全域性開發,2.6及以上Linux版本都已經集成了SELinux模組。
SElinux結構及配置非常複雜,而且有大量概念性東西,要學精難度很大,很多Linux系統管理員嫌麻煩把SElinux關了。
SElinu目的在於明確指明某個程序可以訪問哪些資源(檔案,網路埠)強制訪問控制系統的用途在於增強系統抵禦0-Day攻擊(利用尚未公開的漏洞實現的攻擊行為)的能力。
比如:Apache被發現存在一個漏洞,使得某個遠端使用者可以訪問系統上的敏感檔案,(比如/etc/passwd來獲得系統已存在的使用者),而修復該安全漏洞的Apache更新補丁尚未釋放出,此時SELinux可以起到彌補該漏洞的緩和方案,因為/etx/passwd不具有Apache的訪問標籤,所以Apache對於/etc/passed的訪問會被SELinux阻止。
優勢
相比其他強制性訪問控制系統,SELinux有如下優勢
- 控制策略是可查詢
- 可以熱更新策略無需重啟或者停止服務
- 可以從程序初始化,繼承和程式執行三個方面通過策略進行控制。
- 控制範圍覆蓋檔案系統,目錄,檔案,檔案啟動描述符,埠, 訊息介面和網路介面。
SELinux for Android
SELinux for android在架構和機制上與SELinux完全一樣,考慮到移動裝置特點,移植到Android上的只是SELinux的一個子集,SELinux for Android的安全檢查幾乎覆蓋所有重要的系統資源,包括域轉換,型別轉換,程序,核心,檔案,目錄,裝置,App,網路及IPC相關的操作。
android的兩種模式,只能二選一。
-
寬容模式DAC(Discretionary Access control自主訪問控制)
DAC這種模型中,檔案客體的所有者或者系統管理員負責訪問控制
DAC採用ACL(Access Control List訪問控制列表)來給非管理者使用者提供不同的許可權,而root使用者對檔案系統有完全自由的控制權。 -
強制模式 MAC (Manddatory Access Control)
強制執行並記錄安全政策,如果失敗,顯示EPERM錯誤。MAC是任何程序想在SELinux系統中幹任何事情,都必須現在安全策略配置檔案中賦予許可權,
凡是沒有出現在安全策略配置檔案中的許可權,程序就沒有該許可權。
該機制相當於一個白名單,這個白名單上配置了所有程序的許可權,程序只能做白名單上許可權內的事情。否則會被拒絕。
這就需要使用到配置檔案和其對應的te語法
te語法
rule_name source_typ target_type:class perm_set
例如:allow system_app proc_vmstat:file read
語法解析:
語法 | 含義 |
---|---|
source_type(system_app ) | 一個程序或一組程序的標籤,也成為域型別,程序的型別 |
target_type(proc_vmstat) | 一個物件(檔案,套接字)或一組物件的標籤 |
Class(file ) | 要訪問的物件(檔案、套接字)的型別 |
perm_set (read) | 要執行的操作 |
rule_name命令
命令 | 含義 |
---|---|
allow | 允許某個程序執行某個動作 |
audital low | audit含義就是記錄某項操作,預設SELinux只記錄那些許可權檢查失敗的操作 |
dontaudit | 對那些許可權檢查失敗的操作不做記錄 |
neverallow | 沒有被allow到的動作預設就不允許執行,neverallow只是顯式地寫出某個動作不被允許,如果添加了該動作的allow,則會編譯錯誤 |
source_type命令,
指定一個域(donmain)。一般用於描述程序,該域內的程序,受該條TE語句的限制,
用type
關鍵字,把一個自定義的域與原有的域相關聯,最簡單地定義一個新域的方式為:
type shell, domain
意思為賦予shell給domain屬性,同時,shell與屬於domain這個集合裡。
例如:有一個allow domain xxxxx 的語句,同樣地也給了shell xxxxx的屬性
target_type命令
程序需要操作的客體(檔案,資料夾等)型別,(安全上下文),同樣是用type與一些已有的型別,屬性相關聯。
type有兩個作用,定義(宣告)並關聯某個屬性。
可以把這兩個作用分開,type定義,typeattribute進行關聯。
Class命令
class定義在檔案system/sepolicy/private/security_classes中.
SecurityContext語法
SELinux中,每種東西都會被賦予一個安全屬性,它就是SecurityContext(Security Context以下簡稱SContext,安全上下文或安全屬性)是一個字串,主要由三部分組成。
檢視客體安全上下文如下:
coral:/ # ls -Z /proc/vmstat
u:object_r:proc_vmstat:s0 /proc/vmstat
檢視主體安全上下文:
$ 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 | suer:SEAndroid中定義了一個SELinux使用者,值為u |
r | role:角色,它是SELinux中一種比較高層次,更方便的許可權管理思路。RoleBased Access Control(基於角色的訪問控制,簡稱RBAC),簡言之就是一個user可以屬於過個role。不同的role具有不同選前 |
init | init域(Doamain)MAC的基礎管理思路是所謂的TypeEnforcement Access Control(簡稱TEAC一般用te表示),對於程序來說Type就是Domain,比如init這個Donmain有什麼許可權,都需要在策略檔案init.te中定義 |
s0 | SELinux為了滿足軍用和教育行業而設計的Muti_LevelSecurity(MLS)機制有關,簡言之MLS將系統的程序和檔案進行了分級,不同級別的資源需要對應級別的程序才能訪問。 |
SELinux相關程式碼目錄1. kernel/msm-3.18/security/selinux/
- external/selinux/
- 用BOARD_SEPOLICY_DIRS新增的各te檔案和安全配置檔案,主要包括device/<oem_name>/sepolicy/<product_name>/和system/sepolicy/,以及其他功能模組新增的配置檔案。