SELinux有Disabled、Permissive和Enforcing3種工作模式。在Disable模式中,SELinux關閉,預設的DAC存取控制方式被使用。在Permissive模式中,SELinux被啟用,但安全性原則規則並沒有被強制執行;當安全性原則規則應該拒絕存取時,存取仍然被允許。在Enforcing模式中,SELinux被啟動,並強制執行所有的安全性原則規則。
本教學操作環境:linux7.3系統、Dell G3電腦。
#SELinux,Security Enhanced Linux 的縮寫,也就是安全強化的Linux,是由美國國家安全局(NSA)聯合其他安全機構(如SCC 公司)共同開發的,旨在增強傳統Linux 作業系統的安全性,解決傳統Linux 系統中自主存取控制(DAC)系統中的各種權限問題(如root 權限過高等)。
SELinux 專案在 2000 年以 GPL 協定的形式開源,當 Red Hat 在其 Linux 發行版本中包含了 SELinux 之後,SELinux 才逐步變得流行起來。現在,SELinux 已經被許多組織廣泛使用,幾乎所有的 Linux 核心 2.6 以上版本,都整合了 SELinux 功能。
對於 SELinux,初學者可以這麼理解,它是部署在 Linux 上用於增強系統安全的功能模組。
我們知道,在傳統的Linux 系統中,預設權限是對檔案或目錄的擁有者、所屬群組和其他人的讀取、寫入和執行權限進行控制,這種控制方式稱為自主存取控制(DAC)方式;而在SELinux 中,採用的是強制存取控制(MAC)系統,也就是控制一個行程對特定檔案系統上面的檔案或目錄是否擁有存取權限,而判斷行程是否可以存取檔案或目錄的依據,取決於SELinux 中設定的許多策略規則。
說到這裡,讀者有必要詳細地了解這兩個存取控制系統的特點:
這樣一來,SELinux 控制的就不會單單只是使用者及權限,還有進程。每個行程能夠存取哪個檔案資源,以及每個檔案資源可以被哪些行程訪問,都靠 SELinux 的規則策略來決定。
注意,在SELinux 中,Linux 的預設權限還是有作用的,也就是說,一個用戶要能存取一個文件,既要求這個用戶的權限符合rwx 權限,也要求這個用戶的進程符合SELinux 的規定。
不過,系統中有這麼多的進程,也有這麼多的文件,如果手工來進行分配和指定,那麼工作量過大。所以 SELinux 提供了許多預設的策略規則,這些策略規則已經設定得比較完善,我們稍後再來學習如何檢視和管理這些策略規則。
為了讓讀者清楚地了解 SELinux 所扮演的角色,這裡舉一個例子,假設 apache 上發現了一個漏洞,使得某個遠端使用者可以存取系統的敏感檔案(如 /etc/shadow)。如果我們的Linux 中啟用了SELinux,那麼,因為apache 服務的進程並不具備存取/etc/shadow 的權限,所以這個遠端使用者透過apache 存取/etc/shadow檔案就會被SELinux 所阻擋,起到保護Linux系統的作用。
在傳統 Linux 系統使用存取控制方式的基礎上,附加使用 SELinux 可增強系統安全。那麼,SELinux 是如何運作的呢?
在解釋 SELinux 的工作模式之前,先解釋幾個概念。
1.主體(Subject):就是想要存取檔案或目錄資源的程序。想要得到資源,基本流程是這樣的:由使用者呼叫指令,由指令產生進程,由進程去存取檔案或目錄資源。在自主存取控制系統中(Linux 預設權限中),靠權限控制的主體是使用者;而在強制存取控制系統中(SELinux 中),靠策略規則控制的主體則是流程。
2. 目標(Object) :這個概念比較明確,就是需要存取的檔案或目錄資源。
3. 策略(Policy) :Linux 系統中進程與檔案的數量龐大,那麼限制進程是否可以存取檔案的SELinux 規則數量就更加煩瑣,如果每個規則都需要管理員手工設定,那麼SELinux 的可用性就會極低。還好我們不用手動定義規則,SELinux 預設定義了兩個策略,規則都已經在這兩個策略中寫好了,預設只要呼叫策略就可以正常使用了。這兩個預設策略如下:
4. 安全上下文(Security Context) :每個進程、檔案和目錄都有自己的安全上下文,進程具體是否能夠存取檔案或目錄,就要看這個安全上下文是否匹配。如果進程的安全上下文和檔案或目錄的安全上下文能夠匹配,則該進程可以存取此檔案或目錄。當然,判斷進程的安全上下文和檔案或目錄的安全上下文是否匹配,則需要依靠策略中的規則。
舉個例子,我們需要找對象,男人可以看作主體,女人就是目標了。而男人是否可以追到女人(主體是否可以訪問目標),主要看兩個人的性格是否合適(主體和目標的安全上下文是否匹配)。不過,兩個人的性格是否合適,是需要靠生活習慣、為人處世、家庭環境等具體的條件來進行判斷的(安全上下文是否匹配是需要透過策略中的規則來確定的)。
我們畫一張示意圖,來表示這幾個概念之間的關係,如圖 1 所示。
圖1 SELinux 運行模式的相關概念
解釋一下這張示意圖:當主體想要存取目標時,如果系統中啟動了SELinux,則主體的存取請求首先需要和SELinux 中定義好的策略進行比對。如果進程符合策略中定義好的規則,則允許訪問,這時進程的安全上下文就可以和目標的安全上下文進行匹配;如果比較失敗,則拒絕訪問,並透過AVC(Access Vector Cache,訪問向量緩存,主要用於記錄所有和SELinux 相關的存取統計資料)產生拒絕存取資訊。如果安全性上下文匹配,則可以正常存取目標檔案。當然,最終是否可以真正地存取到目標文件,還要匹配產生進程(主體)的使用者是否對目標文件擁有合理的讀取、寫入、執行權限。
我們在進行SELinux 管理的時候,一般只會>修改檔案或目錄的安全上下文,使其和存取進程的安全上下文匹配或不匹配,用來控制進程是否可以存取檔案或目錄資源;而很少會去修改策略中的具體規則,因為規則實在太多了,修改起來過於複雜。不過,我們是可以人為定義規則是否生效,用以控制規則的啟用與關閉的。
SELinux 的工作模式
#SELinux 提供了3 個工作模式:Disabled、Permissive 和Enforcing,而每種模式都為Linux 系統安全提供了不同的好處。
Disable工作模式(關閉模式)
在Disable 模式中,SELinux 關閉,預設的DAC 訪問控制方式被使用。對於那些不需要增強安全性的環境來說,該模式是非常有用的。
例如,若從你的角度看正在運行的應用程式工作正常,但是卻產生了大量的 SELinux AVC 拒絕訊息,最終可能會填滿日誌文件,從而導致系統無法使用。在這種情況下,最直接的解決方法就是停用 SELinux,當然,你也可以在應用程式所存取的檔案上設定正確的安全上下文。
要注意的是,在停用SELinux 之前,需要考慮一下是否可能會在系統上再次使用SELinux,如果決定以後將其設定為Enforcing 或Permissive,那麼當下次重新啟動系統時,系統將會透過一個自動SELinux 檔案重新進程標記。
關閉 SELinux 的方式也很簡單,只需編輯設定檔 /etc/selinux/config,並將文字中 SELINUX= 更改為 SELINUX=disabled 即可,重新啟動系統後,SELinux 就停用了。
Permissive工作模式(寬容模式)
#在Permissive 模式中,SELinux 被啟用,但安全性原則規則並沒有被強制執行。當安全性原則規則應該拒絕存取時,存取仍然被允許。然而,此時會向日誌檔案發送訊息,表示該存取應該被拒絕。
SELinux Permissive 模式主要用於以下幾種情況:
審核當前的SELinux 策略規則;
測試新應用程序,看看將SELinux 策略規則應用到這些程式時會有什麼效果;
解決某一特定服務或應用程式在SELinux 下不再正常運作的故障。
某些情況下,可使用audit2allow 指令來讀取SELinux 審核日誌並產生新的SELinux 規則,從而有選擇性地允許被拒絕的行為,而這也是一種在不停用SELinux 的情況下,讓應用程式在Linux 系統上運作的快速方法。
Enforcing工作模式(強制模式)
#從此模式的名稱就可以看出,在Enforcing 模式中, SELinux 被啟動,並強制執行所有的安全性原則規則。
相關推薦:《Linux影片教學》
以上是SELinux有哪3種工作模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!