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

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

大部分SELinux報(bào)錯(cuò)都是圍繞著客體的安全上下文進(jìn)行的。這些安全上下文格式為:
用戶:角色:類型:多級(jí)安全(MLS)。最后一個(gè)字段“多級(jí)安全”始終隱藏(這在定向策略中是默認(rèn)的)。舉個(gè)例子,如上圖所示,對(duì)于文件hello.pl,用戶是root,角色是object_r,類型是httpd_sys_content_t。在定向策略中,最重要的字段是類型,主要是用它來實(shí)現(xiàn)TE的訪問控制。
類似地,你可以在Linux中使用命令“ps -Z”來列出所有正運(yùn)行進(jìn)程的安全上下文,例如:
- #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進(jìn)程運(yùn)行的類型是“Sendmail_t”。
【編輯推薦】