SELinux旅程Part1-存取控制(Access Control)介紹

起源

早在接觸到 SELinux 之前,就有聽過這是一門入門很難的存取控制(Access Control)機制,而開啟我投身 SELinux 的契機於公司當時來了一位新同事,他和主管發現,為何公司需要自行研發存取控制的產品,既有 GPL 和核心版本的問題而且核心模組開發的程度也沒有到很好,因此與高層激烈打乒乓後說服決定不自行開發存取控制的產品,轉以使用開源軟體為主,就這樣我被我同事拉着踏上開心的 SELinux 旅程。

差不多在去年的這個時候跟公司夥伴們讀了一篇50幾頁的論文 加上官方手冊 SELinux Notebook,才終於抓到一點感覺,話不多說,就讓我先來說說什麼是存取控制,以及在 Linux 上的情況。


存取控制

存取控制的概念存在於日常生活中的每一刻,例如法律規範人民能做什麼、進公司需要有ID卡或是進家門使用卡扣感應等等,這些存取控制簡單由存取主體(Subject)、資源(Object)、存取行為(Access)組成。在資訊安全(Information Security)的領域中,存取控制是進行風險管理(Risk Management)的其中一個部分,目的在於確保資訊存取的機密性(Confidentiality)、完整性(Integrity)、可用性(Availability)不受非法侵害,這 3 種性質簡稱為 CIA triad。
Figure 1. CIA triad in Information System

要完成上述的事情勢必得存在一套機制,當存取資訊時會基於管理者所制定的政策(Policy)規範,來看說存取主體(Subject)是否有權限存取受保護的資訊,此處的存取主體也包括電腦軟體。存取控制最困難的地方莫過於如何制定符合需求的政策,不會將權限設定的過於嚴格或是寬鬆,當然唯有充分了解使用情景和需求才有辦法做到,比如說,我們可以透過評估資訊或是資產的敏感度和價值,並針對評估的結果來設定存取控制的強度。


存取控制模型

在說到存取控制機制之前,我們先來看看 DAC(Discretionary Access Control)自主式存取控制和 MAC(Mandatory Access Control)委任式存取控制,這 2 個常常被拿出來說明的存取控制模型,不同的模型代表不同存取控制方法,根據論文的定義 DAC 和 MAC 分別為


DAC:(authorization-based) policies control access based on the identity of the requestor and on access rules stating what requestors are (or are not) allowed to do. 
MAC:policies control access based on mandated regulations determined by a central authority.

簡單來說,DAC 是根據存取主體的 “身份” 來判斷權限,譬如進公司時會用 ID 卡來識別身份,而 MAC 是根據中央政策規範每個存取主體的 “行為”,譬如中央政策規範明訂某 A 只能負責影印文件,因此某 A 不論用何種身份進入公司都只能影印文件,此處存取主體的 “行為” 跟 “身份” 是分離的。 分離身份與行為的好處在於壞蛋無法透過冒充身份來做壞事,因為不管冒充何種身份也會被中央政策規範的行為限制住。


存取控制機制

在 Linux 環境中,DAC 的實作機制由 uid, euid, gid, egid, suid, sguid, fsuid 等組成,這些東西被稱為程序(Process)的身份驗證資訊(credentials)也就代表此程序的身份,此身份是當使用者登入系統後所給予,前面有提到 DAC 這種沒有把身份跟存取主體(也就是程序)分開的模式有可能會遭受惡意程式的荼毒,例如管理員執行了嵌入惡意程式的計算機程式,此惡意程序即相當於擁有了管理員的身份。

如果我們以 MAC 的角度來看,首先我們明訂政策說明存取主體與資源之間的關係,限定計算機程序只能做計算,其他行為例如存取管理員家目錄機密資料等等都不能做,則當管理員執行了嵌入惡意程式的計算機程式時,惡意程序也無法做壞事。

坊間存在着許多實作 MAC 模型的機制,建立於 Linux 安全模組(Linux Security Modules)之上,例如 SELinux (Security-Enhanced Linux)、Smack(Simplified Mandatory Access Control Kernel)、Apparmor 等等。
  • Smack於 2008 年首次發布,在 Linux 2.6.25 被納入其中,標榜易於使用,目前主要活躍於 Automotive Grade Linux(AGL)社群,詳細Smack介紹以及遇到的問題可以看這篇在2019 Opensource Summit 上的投影片,簡單來說問題為 Root 權限依舊無敵,且在 Kernel 中有預設規則,當預設規則通過時就不會去檢查自己寫的規則。
  • Apparmor:
    於 1998 年首次發布,在 Linux 2.6.36 被納入其中,目前活躍於 Ubuntu、OpenSUSE 社群,其特色為要幫應用程式寫一套規範,內容描述應用程式可存取資源,檢測皆基於路徑,旨在作為原本 Linux DAC 的延伸。
  • SELinux:
    於 2000 年首次發布,在 Linux 2.6.0 被納入其中,主要開發者為 NSA(美國國家安全局)和 Redhat,目前活躍於 Redhat、Fedora、CentOS、Android 社群,實作許多存取控制模型(UBAC, RBAC, Type Enforcement, MLS, MCS)。


Table 1. 3 種機制的差別

3 者差異可由表格看出,SELinux 和 Smack 需要檔案系統支援擴展文件屬性(Extended Attribute)而 Apparmor 則是以路徑為主,另外可以看到 SELinux 的檢查點最多,代表檢查的細緻程度較高,SELinux 和 Apparmor 的比較可以參考 wiki,最後基於 SELinux 活躍的社群、保護程度(檢查點多且可受檢查的權限比較多)和對於存取控制模型的支援,也因此我們在其中選擇了 SELinux。

我們將在下篇開始對 SELinux 做詳細介紹。

附上自製影片,SELinux操作教學[Youtube] : 
https://www.youtube.com/playlist?list=PLHX_vJu8q5Tq42pYJq7ev_WisSk9Cy_Ac


留言