查看此頁面以熟悉 SELinux 概念。
強制訪問控制
Security Enhanced Linux (SELinux) 是 Linux 操作系統的強制訪問控制 (MAC) 系統。作為一個 MAC 系統,它不同於 Linux 熟悉的自由訪問控制 (DAC) 系統。在 DAC 系統中,存在所有權的概念,即特定資源的所有者控制與其關聯的訪問權限。這通常是粗粒度的,並且會受到意外的權限提升。然而,MAC 系統諮詢中央機構以決定所有訪問嘗試。
SELinux 已作為 Linux 安全模塊 (LSM) 框架的一部分實現,該框架可識別各種內核對像以及對其執行的敏感操作。在將執行這些操作中的每一個時,調用 LSM 掛鉤函數以根據存儲在不透明安全對像中的信息來確定是否應允許該操作。 SELinux 為這些鉤子和這些安全對象的管理提供了一個實現,這些安全對象與它自己的策略相結合,以確定訪問決策。
與其他 Android 安全措施一起,Android 的訪問控制策略極大地限制了受感染機器和帳戶的潛在損害。使用 Android 的自主和強制訪問控制等工具為您提供了一個結構,以確保您的軟件僅在最低權限級別上運行。這減輕了攻擊的影響並降低了錯誤進程覆蓋甚至傳輸數據的可能性。
在 Android 4.3 及更高版本中,SELinux 為傳統的自主訪問控制 (DAC) 環境提供了強制訪問控制 (MAC) 保護傘。例如,軟件通常必須以 root 用戶帳戶運行才能寫入原始塊設備。在傳統的基於 DAC 的 Linux 環境中,如果 root 用戶受到威脅,該用戶可以寫入每個原始塊設備。但是,SELinux 可用於標記這些設備,因此分配了 root 權限的進程只能寫入相關策略中指定的設備。這樣,進程就無法覆蓋特定原始塊設備之外的數據和系統設置。
有關威脅的更多示例以及使用 SELinux 解決這些威脅的方法,請參閱用例。
執行級別
SELinux 可以在不同的模式下實現:
- Permissive - 不強制執行 SELinux 安全策略,僅記錄。
- 強制執行- 強制執行並記錄安全策略。故障顯示為 EPERM 錯誤。
這個選擇是二元的,它決定了您的策略是採取行動還是僅僅允許您收集潛在的故障。 Permissive 在實現過程中特別有用。
類型、屬性和規則
Android 的策略依賴於 SELinux 的類型強制 (TE) 組件。這意味著所有對象(例如文件、進程或套接字)都具有與之關聯的類型。例如,默認情況下,應用程序的類型為untrusted_app
。對於一個進程,它的類型也稱為它的域。可以用一個或多個屬性來註釋一個類型。屬性對於同時引用多種類型很有用。
對象映射到類(例如,文件、目錄、符號鏈接、套接字),並且每個類的不同類型的訪問由權限表示。例如,類file
存在open
權限。雖然類型和屬性會作為 Android SELinux 政策的一部分定期更新,但權限和類是靜態定義的,很少作為新 Linux 版本的一部分進行更新。
策略規則的形式為: allow source target : class permissions ;
在哪裡:
- 來源- 規則主題的類型(或屬性)。誰在請求訪問權限?
- 目標- 對象的類型(或屬性)。請求的訪問權限是什麼?
- 類- 被訪問的對像類型(例如文件、套接字)。
- 權限- 正在執行的操作(或一組操作)(例如讀、寫)。
一個規則的例子是:
allow untrusted_app app_data_file:file { read write };
這表示允許應用程序讀取和寫入標記為app_data_file
的文件。應用程序還有其他類型。例如, isolated_app
用於清單中帶有isolatedProcess=true
的應用服務。 Android 沒有對這兩種類型重複規則,而是為所有涵蓋應用程序的類型使用名為appdomain
的屬性:
# Associate the attribute appdomain with the type untrusted_app. typeattribute untrusted_app, appdomain; # Associate the attribute appdomain with the type isolated_app. typeattribute isolated_app, appdomain; allow appdomain app_data_file:file { read write };
當編寫指定屬性名稱的規則時,該名稱會自動擴展為與該屬性關聯的域或類型的列表。一些值得注意的屬性是:
-
domain
- 與所有進程類型關聯的屬性, -
file_type
- 與所有文件類型關聯的屬性。
宏
特別是對於文件訪問,需要考慮多種權限。例如, read
權限不足以打開文件或對其調用stat
。為了簡化規則定義,Android 提供了一組宏來處理最常見的情況。例如,為了包含open
等缺少的權限,上面的規則可以重寫為:
allow appdomain app_data_file:file rw_file_perms;
有關有用宏的更多示例,請參閱global_macros
和te_macros
文件。應盡可能使用宏來幫助減少由於拒絕相關權限而導致失敗的可能性。
一旦定義了一個類型,它就需要與它所代表的文件或進程相關聯。有關如何完成此關聯的更多詳細信息,請參閱實施 SELinux 。有關規則的更多信息,請參閱SELinux Notebook 。
安全上下文和類別
在調試 SELinux 策略或標記文件時(通過file_contexts
或運行ls -Z
時),您可能會遇到安全上下文(也稱為label )。例如: u:r:untrusted_app:s0:c15,c256,c513,c768
。安全上下文的格式為: user:role:type:sensitivity[:categories]
。您通常可以忽略上下文的user
、 role
和sensitivity
字段(請參閱Specificity )。 type
字段在上一節中進行了解釋。 categories
是 SELinux 中多級安全 (MLS)支持的一部分。自 Android S 以來,類別用於:
- 隔離應用數據與其他應用的訪問,
- 將應用數據從一個物理用戶隔離到另一個物理用戶。
特異性
Android 並未使用 SELinux 提供的所有功能。閱讀外部文檔時,請記住以下幾點:
- AOSP 中的大多數策略都是使用內核策略語言定義的。使用通用中間語言 (CIL) 有一些例外情況。
- 不使用 SELinux用戶。唯一定義的用戶是
u
。必要時,使用安全上下文的類別字段表示物理用戶。 - 不使用 SELinux角色和基於角色的訪問控制 (RBAC)。定義和使用了兩個默認角色:
r
代表主體,object_r
代表客體。 - 不使用 SELinux敏感性。始終設置默認的
s0
靈敏度。 - 不使用 SELinux 布爾值。為設備構建策略後,它不依賴於設備的狀態。這簡化了策略的審計和調試。