一、SELinux的歷史 SELinux全稱是Security Enhanced Linux,由美國國家安全部(National Security Agency)領導開發的GPL項目,它擁有一個靈活而強制性的訪問控制結構,旨在提高Linux系統的安全性,提供強健的安全保證,可防禦未知攻擊,相當於B1 ...
一、SELinux的歷史
SELinux全稱是Security Enhanced Linux,由美國國家安全部(National Security Agency)領導開發的GPL項目,它擁有一個靈活而強制性的訪問控制結構,旨在提高Linux系統的安全性,提供強健的安全保證,可防禦未知攻擊,相當於B1級的軍事安全性能。比MS NT的C2等高得多。
SELinux起源於自1980開始的微內核和操作系統安全的研究,這兩條研究線路最後形成了一個叫做的分散式信任電腦(Distribute Trusted Mach (DTMach))的項目,它融合了早期研究項目的成果(LOCK【鎖】,它包含一組安全內核類型強制;Trusted Mach【信任電腦】,它將多層安全控制合併到電腦微內核中)。美國國家安全局的研究組織參加了DTMach項目,付出了巨大努力,並且繼續參與了大量的後續安全微內核項目。最終,這些工作和努力導致了一個新的項目產生,那就是Flask,它支持更豐富的動態類型的強制機制。
由於不同平臺對這這項技術沒有廣泛使用,NAS認為需要在大量的社團中展示這個技術,以說明它的持久生命力,並收集廣泛的使用支持意見。在1999年夏天,NSA開始在Linux內核中實現Flask安全架構,在2000年十二月,NSA發佈了這項研究的第一個公共版本,叫做安全增強的Linux。因為是在主流的操作系統中實現的,所以SELinux開始受到Linux社區的註意,SELinux最遲是在2.2.x內核中以一套內核補丁的形式發佈的。
隨著2001年Linux內核高級會議在加拿大渥太華順利召開,Linux安全模型(LSM[7])項目開始為Linux內核創建靈活的框架,允許不同的安全擴展添加到Linux中。NSA和SELinux社區是SELinux的主要貢獻者,SELinux幫助LSM實現了大量的需求,為了與LSM一起工作,NSA開始修改SELinux使用LSM框架。2002年八月LSM核心特性被集成到Linux內核主線,同時被合併到Linux 2.6內核。2003年八月,NSA在開源社區的幫助下,完成了SELinux到LSM框架的遷移,至此,SELinux進入Linux 2.6內核主線,SELinux已經成為一種全功能的LSM模塊,包括在核心Linux代碼集中。
數個Linux發行版開始在2.6內核中不同程度使用SELinux特性,但最主要是靠Red Hat發起的Fedora Core項目才使SELinux具備企業級應用能力,NSA和Red Hat開始聯合集成SELinux,將其作為Fedora Core Linux發行版的一部分。在Red Hat參與之前,SELinux總是作為一個附加的軟體包,需要專家級任務才能進行集成。Red Hat開始採取行動讓SELinux成為主流發行版的一部分,完成了用戶空間工具和服務的修改,預設開啟增強的安全保護。從Fedora Core 2開始,SELinux和它的支持基礎架構以及工具得到改進。在2005年早些時候,Red Hat發佈了它的Enterprise Linux 4(REL 4),在這個版本中,SELinux預設就是完全開啟的,SELinux和強制訪問控制已經進入了主流操作系統和市場。
SELinux仍然是一個相對較新和複雜的技術,重要的研究和開發在繼續不斷地改進它的功能。
應用SELinux後,可以減輕惡意攻擊或惡意軟體帶來的災難,並提供對機密性和完整性有很高要求的信息很高的安全保障。普通Linux安全和傳統Unix系統一樣,基於自主存取控制方法,即DAC,只要符合規定的許可權,如規定的所有者和文件屬性等,就可存取資源。在傳統的安全機制下,一些通過setuid/setgid的程式就產生了嚴重安全隱患,甚至一些錯誤的配置就可引發巨大的漏洞,被輕易攻擊。
而SELinux則基於強制存取控制方法,即MAC,透過強制性的安全策略,應用程式或用戶必須同時符合DAC及對應SELinux的MAC才能進行正常操作,否則都將遭到拒絕或失敗,而這些問題將不會影響其他正常運作的程式和應用,並保持它們的安全系統結構。
二、SELinux 的作用及許可權管理機制
2.1 SELinux 的作用
SELinux 主要作用就是最大限度地減小系統中服務進程可訪問的資源(最小許可權原則)。
2.2 DAC
在沒有使用 SELinux 的操作系統中,決定一個資源是否能被訪問的因素是:某個資源是否擁有對應用戶的許可權(讀、寫、執行)。
只要訪問這個資源的進程符合以上的條件就可以被訪問。
而最致命問題是,root 用戶不受任何管制,系統上任何資源都可以無限制地訪問。
這種許可權管理機制的主體是用戶,也稱為自主訪問控制(DAC);
2.3 MAC
在使用了 SELinux 的操作系統中,決定一個資源是否能被訪問的因素除了上述因素之外,還需要判斷每一類進程是否擁有對某一類資源的訪問許可權。
這樣一來,即使進程是以 root 身份運行的,也需要判斷這個進程的類型以及允許訪問的資源類型才能決定是否允許訪問某個資源。進程的活動空間也可以被壓縮到最小。
即使是以 root 身份運行的服務進程,一般也只能訪問到它所需要的資源。即使程式出了漏洞,影響範圍也只有在其允許訪問的資源範圍內。安全性大大增加。
這種許可權管理機制的主體是進程,也稱為強制訪問控制(MAC)。
而 MAC 又細分為了兩種方式,一種叫類別安全(MCS)模式,另一種叫多級安全(MLS)模式。
三、SELinux 基本概念
3.1 主體(Subject)
可以完全等同於進程。
3.2 對象(Object)
被主體訪問的資源。可以是文件、目錄、埠、設備等。
3.3 政策和規則(Policy & Rule)
一套政策裡面有多個規則。部分規則可以按照需求啟用或禁用(以下把該類型的規則稱為布爾型規則)。
3.4 安全上下文(Security Context)
安全上下文是 SELinux 的核心。
安全上下文我自己把它分為「進程安全上下文」和「文件安全上下文」。
一個「進程安全上下文」一般對應多個「文件安全上下文」。只有兩者的安全上下文對應上了,進程才能訪問文件。它們的對應關係由政策中的規則決定。
3.5 SELinux 的工作模式
SELinux 有三種工作模式,分別是:
1. enforcing:強制模式。違反 SELinux 規則的行為將被阻止並記錄到日誌中。
2. permissive:寬容模式。違反 SELinux 規則的行為只會記錄到日誌中。一般為調試用。
3. disabled:關閉 SELinux。
3.6 SELinux 工作流程
這裡引用一張圖片,不必過多解釋。
四、SELinux 基本操作
4.1 查詢文件或目錄的安全上下文
1 ls -Z
查詢 /etc/hosts 的安全上下文。
4.2 查詢進程的安全上下文
1 ps auxZ | grep -v grep | grep
舉例:
查詢 Nginx 相關進程的安全上下文。
1 ps auxZ | grep -v grep | grep nginx
4.3 手動修改文件或目錄的安全上下文
1 chcon [...]
選項功能-u 修改安全上下文的用戶欄位-r 修改安全上下文的角色欄位-t 修改安全上下文的類型欄位-l 修改安全上下文的級別欄位--reference 修改與指定文件或目錄相一致的安全上下文-R遞歸操作-h修改軟鏈接的安全上下文(不加此選項則修改軟鏈接對應文件)
4.4 把文件或目錄的安全上下文恢復到預設值
1 restorecon [選項] [...]
選項功能-v列印操作過程-R遞歸操作