SELinux 概念

請參閱這個頁面,熟悉 SELinux 概念。

必要存取權控管

安全強化 Linux (SELinux) 是必要的存取控制 (MAC) 系統 Linux 作業系統主要是 MAC 系統,與 Linux 慣用的存取權控管 (DAC) 系統。在 DAC 系統中 擁有權,而特定資源的擁有者會控管存取權 具備相關權限這通常較為粗略,以及主題 意外提升權限而 MAC 系統則是在 有權決定所有嘗試存取行為

SELinux 已實作為 Linux 安全性模組 (LSM) 的一部分 這個架構:用於辨識各種核心物件和敏感動作 無所要求這些動作會在何時 就會呼叫 LSM 掛鉤函式,以判斷 根據儲存在不透明文字中的資訊,要允許採取何種動作 安全物件SELinux 會提供實作以用於這些掛鉤 這些安全性物件會與自身的政策相結合 決定存取權的決定

Android 也支援其他 Android 安全措施 政策能大幅限制遭入侵機器的潛在損害 帳戶。使用 Android 自行斟酌和必要存取權等工具 控制系統可提供架構,確保您的軟體僅至少執行 的權限等級。這能減輕攻擊造成的影響,並降低 導致錯誤處理覆寫或傳輸資料的可能性

在 Android 4.3 以上版本中,SELinux 會提供必要的存取控制 (MAC) 並未涵蓋傳統的酌情存取控制 (DAC) 環境。適用對象 例如,軟體必須以根使用者帳戶的形式執行,才能寫入原始 封鎖裝置。在傳統 DAC 型 Linux 環境中 (如果是超級使用者) 遭駭後,使用者可寫入每一部原始區塊裝置。不過 SELinux 可用來為裝置加上標籤,以便指派根程序 權限只能寫入相關政策中指定的使用者。在本 否則,該程序無法覆寫 原始區塊裝置

請參閱「用途」一文 ,瞭解更多威脅的例子以及使用 SELinux 的解決方式。

強制執行等級

SELinux 可在不同的模式中實作:

  • 寬容模式 - 系統不會強制執行 SELinux 安全性政策,只會記錄下來。
  • 強制執行:強制執行並記錄安全性政策。失敗 顯示為 EPERM 錯誤。

這項選擇為二元,用於決定您的政策是僅採取行動或僅執行 可讓您收集潛在失敗情形寬容模式特別適合用於 。

類型、屬性與規則

Android 仰賴 SELinux 的 Type Enforcement (TE) 元件 政策。這表示所有物件 (例如檔案、程序或通訊端) 都有 type 屬性值。例如預設使用應用程式 屬於 untrusted_app 類型對於程序,它的類型也是 。您可以為類型加註 許多屬性。屬性可用來參照多種類型 相同的軟體。

物件會對應至類別 (例如檔案、目錄、符號連結、通訊端) 和不同類型的存取權 每個類別都會以權限表示。 例如,類別擁有 open 權限 file。類型和屬性會定期更新 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_macroste_macros 檔案取得更多實用巨集的範例盡量使用巨集 可降低相關錯誤,進而避免 授予其要求的權限。

定義類型後,必須與檔案或程序建立關聯 代表的意義請參閱實作 SELinux 。如要進一步瞭解 相關規則,請參閱 SELinux 筆記本

安全性內容與類別

對 SELinux 政策或為檔案加上標籤時 (透過 file_contextsls -Z時),您可能會出 「安全性內容」 (也稱為「標籤」) 中運作的整體資料。適用對象 範例: u:r:untrusted_app:s0:c15,c256,c513,c768。安全性環境採用以下格式: user:role:type:sensitivity[:categories]。您通常可以忽略 以下欄位的 userrolesensitivity 欄位 內容 (請參閱具體性)。type 欄位的說明。categories隸屬於 多層次安全性 (MLS) SELinux 支援功能。從 Android S 開始,類別的用途如下:

  • 防止其他應用程式存取資料。
  • 將應用程式資料從一名實體使用者區隔開來。

明確性

Android 不會使用 SELinux 提供的所有功能。朗讀時 外部說明文件,請注意以下幾點:

  • Android 開放原始碼計畫的大部分政策都是使用核心政策語言定義。 使用通用中間語言 (CIL) 則有些許例外狀況。
  • 並未使用 SELinux 使用者。唯一定義的使用者是 u。 如有需要,系統會以安全性情境中的類別欄位代表實體使用者。
  • 不使用 SELinux 角色和角色型存取控制 (RBAC)。定義及使用兩種預設角色: r敬上 用於主旨,object_r 則用於物件。
  • 我們不會使用 SELinux 靈敏度。系統一律會設定預設的s0靈敏度。
  • 不使用 SELinux 布林值。為裝置建立政策後 不會影響裝置的狀態。這可以簡化 以及政策的稽核與偵錯功能