SELINUX的管理原則和運作模式

SELinux 管理原則

SELinux 使用所謂的委任式訪問控制 (Mandatory Access Control, MAC) ,他可以針對特定的程序與特定的檔案資源來進行權限的控管! 也就是說,即使你是 root ,那麼在使用不同的程序時,你所能取得的權限並不一定是 root ,而得要看當時該程序的設定而定。 如此一來,我們針對控制的主體變成了程序而不是使用者!因此,這個權限的管理模式就特別適合網絡服務的程序了! 因為,即使你的程序使用 root 的身份去啟動,如果這個程序被攻擊而被取得操作權,那該程序能作的事情還是有限的, 因為被 SELinux 限制住了能進行的工作了!

舉例來說, WWW 服務器軟件的達成程序為 httpd 這支程序, 而默認情況下, httpd 僅能在 /var/www/ 這個目錄底下存取檔案,如果 httpd 這個程序想要到其他目錄去存取數據時,除了規則設定要開放外,目標目錄也得要設定成 httpd 可讀取的模式 (type) 才行!限制非常多! 所以,即使不小心 httpd 被 cracker 取得了控制權,他也無權瀏覽 /etc/shadow 等重要的配置文件

SELinux 的運作模式

再次的重複說明一下,SELinux 是透過 MAC 的方式來控管程序,他控制的主體是程序, 而目標則是該程序能否讀取的檔案資源!所以先來說明一下這些的相關性

  • 主體 (Subject):

SELinux 主要想要管理的就是程序,因此你可以將主體跟本文談到的 process 劃上等號;

  • 目標 (Object):

主體程序能否存取的目標資源一般就是文件系統。因此這個目標項目可以等文件系統劃上等號;

  • 政策 (Policy):

由於程序與檔案數量龐大,因此 SELinux 會依據某些服務來制訂基本的存取安全性政策。這些政策內還會有詳細的規則 (rule) 來指定不同的服務開放某些資源的存取與否。在目前的 CentOS 6.x 裡面僅有提供兩個主要的政策如下,一般來說,使用預設的 target 政策即可。

targeted:針對網絡服務限制較多,針對本機限制較少,是預設的政策;

mls:完整的 SELinux 限制,限制方面較為嚴格。

  • 安全性本文 (security context):

我們剛剛談到了主體、目標與政策面,但是主體能不能存取目標除了要符合政策指定之外,主體與目標的安全性本文必須一致才能夠順利存取。 這個安全性本文 (security context) 有點類似文件系統的 rwx 啦!安全性本文的內容與設定是非常重要的! 如果設定錯誤,你的某些服務(主體程序)就無法存取文件系統(目標資源),當然就會一直出現『權限不符』的錯誤訊息了!

SELINUX的管理原則和運作模式

SELinux 運作的各組件之相關性

SELinux 的啟動、關閉與觀察

並非所有的 Linux distributions 都支持 SELinux 的,所以你必須要先觀察一下你的系統版本為何! 目前 SELinux 支持三種模式,分別如下:

  • enforcing:強制模式,代表 SELinux 運作中,且已經正確的開始限制 domain/type 了;
  • permissive:寬容模式:代表 SELinux 運作中,不過僅會有警告訊息並不會實際限制 domain/type 的存取。這種模式可以運來作為 SELinux 的 debug 之用;
  • disabled:關閉,SELinux 並沒有實際運作。

那你怎麼知道目前的 SELinux 模式呢?就透過 getenforce 吧!

[root@www ~]# getenforceEnforcing <==諾!就顯示出目前的模式為 Enforcing 囉!

另外,我們又如何知道 SELinux 的政策 (Policy) 為何呢?這時可以來觀察配置文件啦:

[root@www ~]# vim /etc/selinux/configSELINUX=enforcing <==調整 enforcing|disabled|permissiveSELINUXTYPE=targeted <==目前僅有 targeted 與 mls

SELinux 的啟動與關閉

上面是默認的政策與啟動的模式!你要注意的是,如果改變了政策則需要重新啟動;如果由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他兩個,那也必須要重新啟動。這是因為 SELinux 是整合到核心裡面去的, 你只可以在 SELinux 運作下切換成為強制 (enforcing) 或寬容 (permissive) 模式,不能夠直接關閉 SELinux 的! 如果剛剛你發現 getenforce 出現 disabled 時,請到上述檔案修改成為 enforcing 然後重新啟動吧!

不過你要注意的是,如果從 disable 轉到啟動 SELinux 的模式時, 由於系統必須要針對檔案寫入安全性本文的信息,因此開機過程會花費不少時間在等待重新寫入 SELinux 安全性本文 (有時也稱為 SELinux Label) ,而且在寫完之後還得要再次的重新啟動一次!你必須要等待一段時間! 等到下次開機成功後,再使用 getenforce 來觀察看看有否成功的啟動到 Enforcing 的模式!

如果你已經在 Enforcing 的模式,但是可能由於一些設定的問題導致 SELinux 讓某些服務無法正常的運作, 此時你可以將 Enforcing 的模式改為寬容 (permissive) 的模式,讓 SELinux 只會警告無法順利聯機的訊息, 而不是直接抵擋主體程序的讀取權限。讓 SELinux 模式在 enforcing 與 permissive 之間切換的方法為:

[root@www ~]# setenforce [0|1]選項與參數:0 :轉成 permissive 寬容模式;1 :轉成 Enforcing 強制模式# 範例一:將 SELinux 在 Enforcing 與 permissive 之間切換與觀察[root@www ~]# setenforce 0[root@www ~]# getenforcePermissive[root@www ~]# setenforce 1[root@www ~]# getenforceEnforcing

不過請注意, setenforce 無法在 Disabled 的模式底下進行模式的切換


分享到:


相關文章: