selinux-概念

SELinux 概念

請查看此頁中的內容,熟悉 SELinux 中使用的概念。

強制訪問控制

安全增強型 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。

  • 寬容模式 - 僅記錄但不強制執行 SELinux 安全政策。
  • 強制模式 - 強制執行並記錄安全政策。如果失敗,則顯示爲 EPERM 錯誤。

在選擇強制執行級別時只能二擇其一,您的選擇將決定您的政策是採取操作,還是僅允許您收集潛在的失敗事件。寬容模式在實現過程中尤其有用。

  • 不受限 - 一種非常寬鬆的政策,會在開發過程中禁止執行某些任務並提供暫時的權宜之計。不應對 Android 開放源代碼項目 (AOSP) 之外的任何內容使用這種政策。
  • 受限 - 針對相應服務編寫的自定義政策。這種政策應精確定義允許的事項。

不受限政策可用於協助在 Android 中快速實現 SELinux。這種政策適用於大多數 Root 級應用。但應儘可能逐漸將這種政策轉換爲受限政策,以精確限制每個應用只能使用所需的資源。

您的政策最好是處於強制模式的受限政策。處於強制模式的不受限政策可以掩蓋採用受限政策時在寬容模式下會記錄的可能違規行爲。因此,我們強烈建議設備實現人員實現真正的受限政策。

標籤、規則和域

SELinux 依靠標籤來匹配操作和政策。標籤用於決定允許的事項。套接字、文件和進程在 SELinux 中都有標籤。SELinux 決定基本上是根據爲這些對象分配的標籤以及定義這些對象可以如何交互的政策做出的。在 SELinux 中,標籤採用以下形式:user:role:type:mls_level,其中 type 是訪問決定的主要組成部分,可通過構成標籤的其他組成部分進行修改。對象會映射到類,對每個類的不同訪問類型由權限表示。

政策規則採用以下形式:allow domains types:classes permissions;,其中:

  • Domain - 一個進程或一組進程的標籤。也稱爲域類型,因爲它只是指進程的類型。
  • Type - 一個對象(例如,文件、套接字)或一組對象的標籤。
  • Class - 要訪問的對象(例如,文件、套接字)的類型。
  • Permission - 要執行的操作(例如,讀取、寫入)。

使用政策規則時將遵循的結構示例:

allow appdomain app_data_file:file rw_file_perms;

這表示所有應用域都可以讀取和寫入帶有 app_data_file 標籤的文件。請注意,該規則依賴於在 global_macros 文件中定義的宏,您還可以在 te_macros 文件中找到一些其他非常實用的宏。這兩個文件均位於 AOSP 源代碼樹的 system/sepolicy目錄中,其中提供了一些適用於常見的類、權限和規則分組的宏。應儘可能使用這些宏,以便降低因相關權限被拒而導致失敗的可能性。

除了在規則中逐個列出域或類型之外,還可以通過屬性引用一組域或類型。簡單來說,屬性是一組域或類型的名稱。每個域或類型都可以與任意數量的屬性相關聯。當編寫的規則指定了某個屬性名稱時,該名稱會自動擴展爲列出與該屬性關聯的所有域或類型。例如,domain 屬性與所有進程域相關聯,file_type 屬性與所有文件類型相關聯。

使用上述語法可以創建構成 SELinux 政策基本內容的 avc 規則。規則採用以下形式:

<rule variant> <source_types> <target_types> : <classes> <permissions>

該規則指明瞭,當帶有任何 source_types 標籤的主體嘗試對某個對象執行與任何 permissions 對應的操作時,如果該對象包含帶有任何 target_types 標籤的任何 classes 類,會發生什麼情況。這些規則的一個最常見示例是 allow 規則,例如:

allow domain null_device:chr_file { open };

該規則允許具有與“domain”屬性關聯的任何域的進程對 target_type 標籤爲“null_device”的“chr_file”類(字符設備文件)的對象執行“open”權限所描述的操作。在實際中,該規則可能會擴展爲包含其他權限:

allow domain null_device:chr_file { getattr open read ioctl lock append write};

當瞭解到“domain”是分配給所有進程域的屬性,並且 null_device 是字符設備 /dev/null 的標籤時,該規則基本上會允許對/dev/null 進行讀寫操作。

一個 domain 通常對應一個進程,而且具有與其關聯的標籤。

例如,典型的 Android 應用會在自己的進程中運行,並且具有授予其特定受限權限的 untrusted_app 標籤。

系統中內置的平臺應用會以單獨的標籤運行,並會被授予一組不同的權限。作爲核心 Android 系統的一部分,系統 UID 應用以表示另一組權限的 system_app 標籤運行。

在任何情況下,都不應直接允許域訪問以下通用標籤;而應爲一個或多個對象創建一個更具體的類型:

  • socket_device
  • device
  • block_device
  • default_service
  • system_data_file
  • tmpfs
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章