SELinux全稱為安全增強式 Security-Enhanced Linux(SELinux),是一個在內核中實踐的強制存取控制(MAC)安全性機制。SELinux 首先在 CentOS 4 出現,並在其后的 CentOS 發行版本獲得重大改善。這些改善代表用 SELinux 解決問題的方法亦隨著時間而改變。
SELinux的原理與架構
SELinux的整體架構和原理都比較簡單,使用也不復雜。其復雜的地方在於規則非常復雜,每個進程都要有規則策略。
SELinux有2個核心組件及一些配套的工具。這兩個核心組件分別是內核邏輯和策略數據庫。當然,策略數據庫本身並非軟件邏輯,而是一個靜態的數據庫,為內核邏輯提供判斷的依據。SELinux 更能遵從最小權限的理念。在開啟SELinux的情況下(enforcing模式),所有訪問默認是被拒絕的,而有一系列例外的策略來允許系統的元素(服務、進程、用戶)具備訪問資源的權限。
整體架構與訪問流程
SELinux的整個架構如圖1所示,最左側的為訪問者,也就是服務,進程或者用戶等內容。最右側的是被訪問者,也就是具體的資源,比如文件、目錄或者套接字等。

當訪問者訪問被訪問者(資源)時,需要調用內核的接口。以讀取某個目錄的文件為例,需要讀取read接口。此時會經過SELinux內核的判斷邏輯,該判斷邏輯根據策略數據庫的內容確定訪問者是否有權訪問被訪問者,如果權利允許則放行,否則則拒絕並記錄審計日志。
SELinux的管理與模式
可以通過/etc/selinux/config文件中的配置項實現對SELinux的管理,包括啟動、停止和修改策略類型等。

如圖所示,這里有2個配置項,也就是SELINUX和SELINUXTYPE。其中SELINUX表示SELinux的啟用狀態,可以有3種模式。
Enforcing: 此選項會在系統上啟用並實施 SELinux 的安全性政策,拒絕存取及記錄審計日志Permissive: 在 Permissive 模式下,SELinux 會被啟用但不會實施安全性政策,而只會發出警告及記錄審計日志Disabled: 該選項表示SELinux 處於非工作狀態SELinux的類型
從上述配置文件還可以看出SELinux有2中類型,分別是targeted和mls。
實例代碼解析
SELinux控制的內容很多,包括文件、套集字和信號量等等。當然,我們不可能介紹到所有的內容,今天我們主要看一下文件相關的內容。
Linux內核提供了一個安全模塊框架層,這個公共框架類似於文件系統中的VFS。它為調用者提供統一的接口。之所以要提供統一接口是因為Linux內核不僅僅支持SELinux安全特性,還支持Apparmor等很多安全特性。
以打開文件為例,當我們調用內核中打開文件的接口是,在其內部會調用security_file_open函數。該函數就是Linux內核安全框架(LSM)的公共接口。然后該函數通過函數指針的方式調用所有注冊到LSM的安全模塊。以SELinux為例,最終會調用到selinux_file_open函數。

然后selinux_file_open函數會調用avc公共函數實現權限鑒定和審計日志的記錄等內容。這里關鍵函數是avc_has_perm。可以看出該函數又調用了另外兩個函數,其中avc_has_perm_noaudit函數實現權限的判斷,而avc_audit函數則實現審計功能。

函數avc_audit實現審計功能,但並非每個操作都需要記錄審計日志。在寫策略文件的時候可以關閉某個策略的審計。也就是說,在關閉該策略的審計的情況下,即使訪問拒絕也不會記錄審計日志。
在函數avc_audit中,avc_audit_required函數用於判斷是否需要記錄審計日志,而slow_avc_audit函數則是進行審計日志的封裝和記錄工作。這部分代碼比較清晰,簡單,本文不再贅述。

查看SELinux狀態:
1、/usr/sbin/sestatus -v ##如果SELinux status參數為enabled即為開啟狀態
SELinux status: enabled
2、getenforce ##也可以用這個命令檢查
關閉SELinux:
1、臨時關閉(不用重啟機器):
setenforce 0 ##設置SELinux 成為permissive模式
##setenforce 1 設置SELinux 成為enforcing模式
2、修改配置文件需要重啟機器:
修改/etc/selinux/config 文件
將SELINUX=enforcing改為SELINUX=disabled
重啟機器即可