Security Enhanced Linux(以下簡稱為SELinux)是RedHat Enterprise Linux 4(以下簡稱為RHEL4)上新的安全機制,在以往的RHEL系統(tǒng)中從未使用,這使得很多資深的系統(tǒng)管理員已開始使用RHEL4時弄得一頭霧水,出現(xiàn)了很多莫名其妙的錯誤,隨后尋找?guī)椭虐l(fā)現(xiàn)原來是SELinux弄的。由于SELinux有著嚴格的安全控制和管理權(quán)使得系統(tǒng)管理員一時不知如何設(shè)定,索性就關(guān)閉了,很是可惜。究其原因,是當一個事物出現(xiàn)時,如果他給你帶來了麻煩,增加了工作量,便對其產(chǎn)生了厭惡感,這是人之常情。本文暫不探討SELinux 復(fù)雜的內(nèi)部運作機制,只是先讓讀者對SELinux有個初步的認識和了解,希望能在您的心里對SELinux留下一個好的印象,并認識到盡管一開始時有些麻煩,但當你熟悉了它以后,系統(tǒng)的管理會變得更輕松。
二.認識DAC與MAC
在介紹SELinux之前,讀者需要了解兩個基本的系統(tǒng)訪問控制機制: ☆ DAC(Discretionary access control,自主訪問控制):DAC機制就是指對象(比如程序、文件或進程等)的的擁有者可以任意的修改或授予此對象相應(yīng)的權(quán)限。例如傳統(tǒng)Linux,Windows等。 ☆ MAC(Mandatory Access Control,強制訪問控制):MAC機制是指系統(tǒng)不再允許對象(比如程序、文件或文件夾等)的擁有者隨意修改或授予此對象相應(yīng)的權(quán)限,而是透過強制的方式為每個對象統(tǒng)一授予權(quán)限,例如SELinux。 
圖1 DAC與MAC的不同(引自 Security Features in Red Hat Enterprise Linux 4)
三.SELinux的出身 National Security Agency(美國國家安全局,以下簡稱為NSA)一直非常關(guān)注計算機操作系統(tǒng)的安全領(lǐng)域。畢竟他們的工作任務(wù)之一就是要確保美國政府使用的計算機的安全,保證在其面臨沒完沒了的攻擊時仍能安全可靠的運行。NSA發(fā)現(xiàn)大部分操作系統(tǒng)的安全機制,包括Windows和大部分UNIX以及Linux系統(tǒng),都是以DAC機制為安全認證基礎(chǔ)的。由于DAC機制的設(shè)計很不利于系統(tǒng)安全,NSA便一直致力于開發(fā)出一套好的MAC安全認證機制。 MAC 并不是由NSA發(fā)明的,它很早就出現(xiàn)了,但由于MAC的諸多問題,使得大型系統(tǒng)提供商對于將MAC集成到自己的系統(tǒng)中始終沒有興趣。即使是那些集成了 MAC 的提供商也通常是將其做為可選件提供,而沒有默認安裝使用。原因很多,一是因為MAC還不夠靈活,二是對于像Windows客戶系統(tǒng)這種面向普通用戶的系統(tǒng)來說,MAC加大了系統(tǒng)管理和使用的復(fù)雜性,得不償失。于是NSA的為了推廣MAC,確立了MAC下一步的研究方向,為使MAC更靈活并且并更容易被嵌入到操作系統(tǒng)。 起初,NSA的MAC系統(tǒng)是在LOCK系統(tǒng)上基于類型增強而且策略靈活的強制訪問控制體系,并且隨后發(fā)展為兩個基于Mach的系統(tǒng):DTMach和DTOS,后來在猶他大學的微內(nèi)核操作系統(tǒng)Fluke上實現(xiàn)出來,并命名為Flask安全體系。NSA希望有操作系統(tǒng)商能支持其開發(fā)的MAC機制,但由于所有的這些工作都是基于實驗室,極少可以在實驗室之外來進行嘗試,以查看這些思想在真實的應(yīng)用程序的可行性,加之為保密項目,因此很難說服某個系統(tǒng)商采用,誰也不敢頭一個吃這個螃蟹。于是,NSA決定選擇開源代碼的Linux系統(tǒng)為實際市場試驗系統(tǒng)。NSA把Flask安全體系集成到Linux操作系統(tǒng)中,SELinux便孕育而生,為了真正配合SELinux在Linux系統(tǒng)上的應(yīng)用實施, NSA將SELinux作為一個開放源碼項目發(fā)布出來,從而能獲得更加廣泛的開發(fā)者和用戶支持。 毫無意外,使用真正的系統(tǒng)讓 NSA 研究人員可以更好的理解SELinux在實際中的應(yīng)用,而其中體現(xiàn)出的問題是在試驗系統(tǒng)中無法找到的。NSA的這一開源措施,在開源界猶如一顆原子彈,業(yè)界普遍對此是歡迎的,但也不能說NSA是為此作出了犧牲,因為這是個雙贏的舉措,因為沒有Linux這個試驗田,NSA的SELinux很難修得正果。另外選擇Linux不是毫無理由的:首先,Linux系統(tǒng)擁有著眾多的使用用戶,而且很多用戶本身具有很高的技術(shù)水平;其次,Linux基于開源,這樣使得 SELinux不屬用任何商業(yè)組織或公司,防止依此來牟利,也不利于SELinux的發(fā)展;最后,對于Linux,它作為新興的操作系統(tǒng),在桌面領(lǐng)域很難打敗Windows,因此它主要面對服務(wù)器領(lǐng)域,而安全就顯得至關(guān)重要,SELinux正好是它所迫切需要的。RedHat 是個很聰明的公司,F(xiàn)edora是其領(lǐng)導的Linux開源組織。其實說穿了,F(xiàn)edora就是其企業(yè)發(fā)行版的實驗田。RedHat首先選擇了Fedora Core 2作為第一個SELinux實驗操作系統(tǒng),但是預(yù)設(shè)為不開啟,但SELinux在其平臺上的表現(xiàn)還是取得了成功。到了Fedora Core3,SELinux已經(jīng)默認為開啟,然后經(jīng)過修改,我們便在RHEL4上也看到SELinux。 另外需要補充說明的是,讀者不要以為僅僅存在SELinux這一個MAC項目,還有很多其他的MAC實現(xiàn)項目,用于其他不同的系統(tǒng)中。
四.SELinux原理 在SELinux 中,每個對象(程序、檔案、進程等)都擁有一個Security Context(安全上下文),它就像標簽一樣,貼在每個對象身上,上面記載著這個對象所具有的權(quán)限。而我們可以通過制定Security Policy(安全策略)來定義這些Security Context,從而定義哪種對象具有哪些權(quán)限。當一個對象需要執(zhí)行某個動作時,系統(tǒng)會依照Security Policy所制定的內(nèi)容來檢查相對應(yīng)的權(quán)限,如果全部權(quán)限都符合的話,系統(tǒng)就會允許這個操作的執(zhí)行,否則都將遭到拒絕或失敗。這些過程不會影響到其它正常運行的對象,系統(tǒng)會保證它們的安全系統(tǒng)結(jié)構(gòu)以及穩(wěn)定運行。這里還要說明的是,到目前為止,SELinux系統(tǒng)中的某個對象需要執(zhí)行某個動作的時,系統(tǒng)權(quán)限認證不僅僅單獨根據(jù)Security Policy所制定的內(nèi)容來檢查,同時還要根據(jù)傳統(tǒng)DAC來檢測,只有DAC以及SELinux全部認證通過了才能進行正常操作。 如果讀者了解chroot,那么就能很好的理解SELinux。 chroot 就是把某程序置于文件系統(tǒng)下的某一處,而當運行的時候,就不會離開這個文件系統(tǒng)的部份,也就是不會影響整個的文件系統(tǒng)。就好比如果把所有的對象都分配到不同的domain(域)中。而不同的 domain 卻彼此獨立,而且如果沒有經(jīng)過授權(quán)的對象就不可以在domain之間傳遞數(shù)據(jù),也就是說對象不能沒有授權(quán)就由domain A 跳到 domain B中,情況就如 chroot 一樣。 在傳統(tǒng)的類Unix中,root擁有著所有權(quán)限,有些用戶使用采用SELinux的Linux時發(fā)現(xiàn)自己就是root,但為何有些事情卻不允許執(zhí)行。其實說穿了就是因為 root 所屬的 domain 沒有授權(quán)可以跳到所需要執(zhí)行某程序的domain下,也就無法做希望的工作了。 在 SELinux系統(tǒng)啟動的時候,會加載一個叫做 policy,* 的安全策略權(quán)限文件,這文件內(nèi)中就定義了相關(guān)權(quán)限。如果你之前設(shè)定了 SELinux 是不能在開機后轉(zhuǎn)回 permissive 模式的話,那你的 root 則可能無法修改當中的設(shè)定!也就是說root在SELinux中已經(jīng)不具有默認的所有權(quán)限。那到底這有什么好處呢?其實好處就如 chroot 一樣把系統(tǒng)內(nèi)任何東西都加上一層保護層。那就算是入侵進入了你的計算機,也只能在他破壞他入侵的這個domain環(huán)境! 對于RHEL4系統(tǒng),如何檢測是否已經(jīng)安裝了SELinux呢。首先檢查你的Linux系統(tǒng)的核心是否有支持ACL的功能。因為Linux系統(tǒng)并不是每一個版本的核心都有支持ACL的功能,而最簡單的方法就是檢查系統(tǒng)目前的核心能否支持:
# cat /boot/config-2.6.9-11.EL | grep ACL
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
注:config-2.6.9-11.EL位置根據(jù)系統(tǒng)的不同而不同,這里用的是RHEL4.1。
此時如果能看到上面的幾項則表示已經(jīng)編譯到核心中,ext3文件系統(tǒng)已支持ACL功能,這些功能在編譯核心選項中也可以找到。
五.傳統(tǒng)Linux 與SELinux
傳統(tǒng)Linux的安全認證基于內(nèi)核的DAC機制,這種機制在遇到一個有缺陷或是惡意編寫的程序時就會導致很大的問題出現(xiàn),尤其是對于 setuid/setgid這種權(quán)限的設(shè)計。有些程序員在程序設(shè)計時,當需要設(shè)置執(zhí)行權(quán)限的時候,為了省事就直接用 setuid root,這樣的好處是給予程序最大的用戶權(quán)限r(nóng)oot來運行,避免了因權(quán)限引起的問題,大大簡化程序的設(shè)計,但是這種方式是極其危險的。本文已經(jīng)提及過,類Unix系統(tǒng)中的root擁有絕對的權(quán)限,如果某個有缺陷的程序以root用戶運行,可能會破壞系統(tǒng)文件甚至系統(tǒng)核心部分。如果是網(wǎng)絡(luò)服務(wù)程序,其漏洞很容易被黑客利用并發(fā)起攻擊,造成不可預(yù)知的后果。 SELinux的安全認證基于內(nèi)核外的MAC機制,這種機制使得系統(tǒng)管理員可以定義整個系統(tǒng)的安全策略,這個策略可以基于其他因素,例如用戶的角色、程序的可信性及預(yù)期使用、程序?qū)⒁褂玫臄?shù)據(jù)的類型等等,來限制對象所具有的權(quán)限。當你正確配置了SELinux系統(tǒng),不正常的應(yīng)用程序只會影響自己權(quán)限內(nèi)的domain,而對其它domain中的對象沒有絲毫影響。其它用戶程序的安全性和他們的后臺程序仍然可以正常運行,并保持著它們的安全系統(tǒng)結(jié)構(gòu)。例如你某個服務(wù)是以 root 的權(quán)限執(zhí)行的。而此服務(wù)存在著一個極嚴重的 bug ,而使得入侵者可以通過這個服務(wù)的漏洞進入系統(tǒng)。但如果你的 Linux 系統(tǒng)有SELinux 保護的話,那么入侵者仍沒有辦法破壞整個系統(tǒng),因為它被這個服務(wù)所屬的 domain 所限制。但是沒有 SELinux 保護的系統(tǒng),它就可能因此而入侵整個系統(tǒng),而產(chǎn)生不可預(yù)料的后果。 但是前提是要有好的安全原則,SELinux 最麻煩的就是需要配置一個好的Policy 才可以讓 SELinux 發(fā)揮效果。制定的太寬松會使 SELinux 毫無用武之地,而太嚴格又會讓使用者連日常工作都變的麻煩至極。NSA讓制定安全原則的工作由系統(tǒng)地發(fā)行者來做,而像Fedora、Redhat、 Novell SUSE 、Debian、Gentoo 等都制定了一套基本的安全原則用于自己的系統(tǒng)。 憑借著SELinux在Linux 上這一個十分重要技術(shù)的應(yīng)用,使其在加強了安全級別,傳統(tǒng)的Linux 安全級別一直是 C1 級或 C2 級,和 Windows 服務(wù)器的安全級別相同,而 SELinux 把 Linux 的安全級別提升至 B1 級,達到了基本的軍事級別。
在RHEL4 中,SELinux 與一系列因特網(wǎng)服務(wù)加以整合,包括 BIND、Network Time Protocol (NTP)、Apache等,使得其優(yōu)點能夠更輕易地拓展。其要求極度安全環(huán)境的組織,可以于更多的應(yīng)用程序上實作更廣泛的SELinux 功能,甚至為 每一服務(wù)制定嚴格的SELinux 原則。。比如,傳統(tǒng)的Linux 系統(tǒng)若遭黑客侵入Web Server,可能導致整個系統(tǒng)的癱瘓;但有了SELinux 的保護,我們可以很容易的建立一個只能在特定程序及特定的安全系絡(luò)中才能執(zhí)行的 Web 服務(wù)器,盡管Web Server被入侵,那么他也只能破壞這個Web Server,無法影響到其它的系統(tǒng)區(qū)域,將受害范圍減至最少。
六.SELinux在RHEL4上的安裝 下面對SELinux在RHEL 4上的安裝過程中加以介紹。在安裝過程中,會出現(xiàn)如圖3 的畫面,詢問是否啟用SELinux,默認安裝選項「Active」。 
圖2 安裝時SELinux 的選項 這3個選項的不同之處在于: □ 已禁用:停用SELinux 功能 □ 警告:僅顯示警告訊息 □ 活躍(默認值):啟動SELinux 功能 系統(tǒng)是否啟用SELinux 的設(shè)定,記錄在/etc/selinux/config文件中(/etc/sysconfig/selinux為此文件的鏈接),安裝完成后,可檢查其中的內(nèi)容,便可得知系統(tǒng)SELinux現(xiàn)在的狀態(tài)。文件內(nèi)容如下:
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - SELinux is fully disabled. SELINUX=enforcing # SELINUXTYPE= type of policy in use. Possible values are: # targeted - Only targeted network daemons are protected. # strict - Full SELinux protection. SELINUXTYPE=targeted
SELINUX 參數(shù)值:有「enforcing、permissive、disabled」分別對應(yīng)安裝時的 選項「活躍、警告、已禁用」。 SELINUXTYPE 參數(shù)值:有「targeted、strict」兩種 SELINUXTYPE=targeted:保護網(wǎng)絡(luò)相關(guān)服務(wù)。 SELINUXTYPE=strict:完整的保護功能,包含網(wǎng)絡(luò)服務(wù)、一般指令及應(yīng)用程序 注:RHEL 4 目前尚未支持strict policy,只提供targeted policy,如果您強行的將SELINUXTYPE=targeted改為strict,系統(tǒng)啟動時將會出現(xiàn)以下的提示而無法啟動。 
圖3 強行修改機制導致無法啟動 在/etc/selinux/targeted文件夾中定義的就是targeted屬性,它是RHEL 4 巳定義好的policy,這個targeted policy 的用途可為保護下列的網(wǎng)絡(luò)服務(wù): |