SELinux簡介:Linux內(nèi)核安全
雖然SELinux已在Linux內(nèi)核中存在了近十年,但至今仍有很多管理員由于擔(dān)心其配置的復(fù)雜性而棄之不用。雖然許多Linux管理員在他們的Linux服務(wù)器中禁用SELinux來避免在安裝應(yīng)用程序時對它進行配置,但在Linux安全性方面SELinux是一個非常有用的工具。下面讓我們了解一下它的工作原理,用SELinux策略和訪問控制的管理方式來保護你的Linux服務(wù)器吧。
在Linux操作系統(tǒng)中,SELinux實現(xiàn)了強制訪問控制(MAC)的安全模式。在標(biāo)準(zhǔn)的Linux環(huán)境中開啟了自由訪問控制(DAC)后,這一機制就會在Linux內(nèi)核中對所有操作的安全性進行檢查。
理解DAC和MAC的Linux安全模型
由于SELinux以MAC為基礎(chǔ),所以了解DAC(默認(rèn)的Linux安全模型)的不足以及MAC相對于DAC的優(yōu)勢就變得非常重要。
在MAC模式下,管理員控制了系統(tǒng)中軟件的所有交互行為。采用了最小特權(quán)方式后,默認(rèn)情況下應(yīng)用程序和用戶沒有任何權(quán)限,因為作為系統(tǒng)安全策略的一部分,所有的權(quán)限都必須由管理員授予。在DAC模式下,文件所有權(quán)在用戶,且該用戶對它們有完全的控制權(quán)限。黑客們攻擊用戶帳戶后,便可以對該用戶擁有的文件做任何事情。例如,黑客攻擊FTP服務(wù)器后將完全控制FTP服務(wù)器帳戶擁有的所有文件。更糟的是,如果一個應(yīng)用程序在根帳號下(常見的如Web和FTP服務(wù))運行時,攻擊者將完全控制整個操作系統(tǒng)。
MAC模式為每一個應(yīng)用程序都提供了一個虛擬“沙漏”,只允許應(yīng)用程序執(zhí)行它設(shè)計需要且在安全策略中明確允許的任務(wù)。例如,Web服務(wù)器可能只能夠讀取網(wǎng)站發(fā)布的文件,并監(jiān)聽在指定網(wǎng)絡(luò)的端口。即使攻擊者將其攻破,他們也無法執(zhí)行在安全策略中沒有明確允許的任何活動,即使這個進程在根用戶下運行。
標(biāo)準(zhǔn)Unix權(quán)限仍然會在系統(tǒng)中存在。當(dāng)文件被訪問時,標(biāo)準(zhǔn)Unix權(quán)限將先于SELinux安全策略生效。如果標(biāo)準(zhǔn)權(quán)限拒絕訪問,訪問直接被拒絕,SELinux在整個過程中沒有參與。但是,如果標(biāo)準(zhǔn)權(quán)限允許訪問,SELinux此時將參與進來并根據(jù)其源進程和目標(biāo)對象的安全上下文來判斷允許還是拒絕訪問。
SELinux中主體和客體的定義
在MAC的安全上下文中有兩個重要概念,主體和客體。MAC(或非自由訪問控制)框架允許你規(guī)定所有進程(稱為主體)與系統(tǒng)其它部分如文件、設(shè)備、套接字、端口以及其它進程(稱為客體)進行交互的權(quán)限。它通過對所有進程和對象定義安全策略來實現(xiàn)。這些進程和對象都由內(nèi)核控制,安全的決定基于所有可用的信息,而不僅僅是用戶的身份。在此模型中,一個進程可被授予的權(quán)限只是它需要且能發(fā)揮作用的權(quán)限。這遵循了最小權(quán)限原則,不同于DAC完全權(quán)限的概念。
舉例來說,在MAC模式下,用戶通常是將自己的數(shù)據(jù)存放在主目錄中來保護自己的數(shù)據(jù),但是使用chmod命令修改文件的權(quán)限將會暴露自己的數(shù)據(jù),這時受管制的進程如果沒有權(quán)限無法接觸這些文件或試圖修改相應(yīng)的策略。
SELinux安全策略:嚴(yán)格和定向
SELinux遵循最小特權(quán)模式。默認(rèn)情況下,所有的行為都遭到拒絕,然后我們會針對系統(tǒng)的每個單元(服務(wù)、程序、用戶、進程)單獨增加策略以允許它們執(zhí)行特定的功能。如果一個服務(wù),程序或用戶試圖訪問或修改一個不是它們所必須的的文件或資源,訪問就會被拒絕且系統(tǒng)會將其記錄到日志中。因為SELinux在內(nèi)核中運行,每個應(yīng)用程序并不需要針對它進行特別的修改。如果SELinux阻止了某個操作,應(yīng)用程序只是會收到一個普通的“拒絕訪問”的報錯。
下圖描述的是SELinux默認(rèn)定向策略的的工作流程:

策略是SELinux最重要的概念之一。最小特權(quán)模式就很能說明“嚴(yán)格”策略。SELinux可以允許很多不同的策略,在CentOS5和RHEL中默認(rèn)的策略是“定向”,它主要針對的范圍是關(guān)鍵的系統(tǒng)進程。在RHEL中,有超過200個這樣的客體存在(包括httpd,named,dhcpd,mysqld)。除此之外,系統(tǒng)中其它的進程都在一個非限制域中運行,不受SELinux影響。定向策略的目標(biāo)是讓每一個啟動時就默認(rèn)安裝和運行的進程都在限制域中運行。“定向”策略目的是在不嚴(yán)重影響終端用戶體驗的情況下盡可能保護最多的重要進程,大多數(shù)用戶甚至完全感覺不到SELinux在運行。
另一個重要的概念是SELinux的訪問控制。訪問控制有三種類型,它們是類型加強(TE)的訪問控制、基于角色的訪問控制(RBAC)和多級安全(MLS)訪問控制。在定向策略中TE是首要的訪問控制機制。
建立SELinux的安全上下文
對于理解SELinux很重要的一點是:在SELinux模型中所有的進程和文件都有一個SELinux的安全上下文。可以簡單的使用“-Z”參數(shù)來顯示其安全上下文,如下所示:

大部分SELinux報錯都是圍繞著客體的安全上下文進行的。這些安全上下文格式為:
用戶:角色:類型:多級安全(MLS)。最后一個字段“多級安全”始終隱藏(這在定向策略中是默認(rèn)的)。舉個例子,如上圖所示,對于文件hello.pl,用戶是root,角色是object_r,類型是httpd_sys_content_t。在定向策略中,最重要的字段是類型,主要是用它來實現(xiàn)TE的訪問控制。
類似地,你可以在Linux中使用命令“ps -Z”來列出所有正運行進程的安全上下文,例如:
- #ps -efZ | grep mail
- system_u:system_r:sendmail_t root 2661 1 0
- 12:30 ? 00:00:00 sendmail: accepting connections
- system_u:system_r:sendmail_t smmsp 2670 1 0
- 12:30 ? 00:00:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
上面的輸出顯示我的Linux服務(wù)器中的sendmail進程運行的類型是“Sendmail_t”。
【編輯推薦】