selinux是美國(guó)國(guó)家安全局發(fā)起的1個(gè)項(xiàng)目,它的目的是將系統(tǒng)加固到可以到達(dá)軍方的級(jí)別。這也為L(zhǎng)inux的安全提供了更強(qiáng)有力的保障。
所謂DAC,是自主訪問控制,就是每個(gè)用戶為了能夠?qū)崿F(xiàn)和其他用戶同享文件,在使用ACL之前,只能通過改變這個(gè)文件其他用戶的權(quán)限,但是這類方法給系統(tǒng)安全帶來了很多隱患。所謂CS,就是安全上下文,它取決于發(fā)起用戶的權(quán)限和文本本身的權(quán)限。
所謂MAC,就是Mandatory Access Control,也就是強(qiáng)迫訪問控制,它是selinux實(shí)現(xiàn)訪問控制的基礎(chǔ),selinux通過type enforce(TE)也就是強(qiáng)迫類型來實(shí)現(xiàn)。
標(biāo)準(zhǔn)的Unix安全模型是任意的訪問控制,也就是DAC,任何程序?qū)ζ滟Y源享有完全的控制權(quán)。假定某個(gè)程序打算把含有潛伏重要信息的文件扔到/tmp目錄下,那末在DAC的情況下沒有人能夠禁止它。但是selinux中的MAC也允許程序在/tmp目錄下建立文件,也允許這個(gè)文件依照Unix權(quán)限字的要求對(duì)全球刻度,但是當(dāng)Unix許可檢查利用后,selinux許可檢查還要進(jìn)1步判斷對(duì)資源的訪問是不是被許可。selinux可以限制每個(gè)進(jìn)程對(duì)各種資源的訪問和訪問的權(quán)級(jí)。就是誰(shuí)當(dāng)1個(gè)進(jìn)程在使用含有敏感數(shù)據(jù)時(shí),這些數(shù)據(jù)會(huì)被制止寫入那些低權(quán)級(jí)進(jìn)程可讀的文件中。因此selinux提供了比傳統(tǒng)的Unix權(quán)限更好的訪問控制。
selinux是1種基于"域-類型"的模型的強(qiáng)迫訪問控制的安全系統(tǒng),它被Linux2.6編寫到內(nèi)核中,相應(yīng)的某些安全相干的利用也被打了selinux的補(bǔ)釘,最后還有1個(gè)相應(yīng)的安全策略。
比如管理員可以允許1個(gè)利用程序添加記錄到某1個(gè)日志文件但是不允許其重寫或刪除該日志文件的內(nèi)容,雖然ext3支持append-only標(biāo)簽,我們可以通過chattr來進(jìn)行設(shè)置,但是該屬性是不辨別某1個(gè)進(jìn)程的,不能再為1個(gè)訪問append-only的同時(shí),又允許另外一個(gè)進(jìn)程有完全的可寫的權(quán)利,在另外一方面,1個(gè)利用程序可以被允許在1個(gè)目錄卡中建立文件并向其寫入數(shù)據(jù),但是不能刪除文件。這些特性都是在沒有selinux的普通的Linux內(nèi)核所不能做到的,還有的就是,網(wǎng)絡(luò)利用程序可以綁定到其需要的端口上,但是不能綁定到其他端口上。
我們的selinux通過operation的主語(yǔ)和賓語(yǔ)打1個(gè)"標(biāo)簽",在1個(gè)"類型"里只能由特定的目錄或用戶履行。這里的operation通常是:讀、寫、履行等等。其實(shí)就是1個(gè)主謂賓的結(jié)構(gòu),也就是subject operation object的結(jié)構(gòu)。而且它還有1個(gè)最小權(quán)限法則,比如定義httpd的目錄/var/www為public_content_t類型,那末httpd就只能訪問這個(gè)特定類型的文件或目錄,這些文件就叫做"沙箱",使用selinux時(shí),必須精心設(shè)計(jì)1套訪問法則。比如我們可以給不同的進(jìn)程打上不同的"域",給不同的目錄打上不同的"類型",然后通過定義"類型"和"域"的對(duì)應(yīng)規(guī)則來實(shí)現(xiàn)。
selinux的實(shí)現(xiàn)機(jī)制有兩種,1種是strict,此時(shí)任何進(jìn)程都受selinux的控制,1般不適用,由于它的設(shè)定比較困難。1種是targeted,它由紅帽開發(fā),指定選定的進(jìn)程來受selinux控制,這類機(jī)制使得selinux更加容易遭到控制。
selinux的規(guī)則文件是以2進(jìn)制文件存在的,他是編輯完成以后轉(zhuǎn)換成為2進(jìn)制文件,這樣可以下降系統(tǒng)資源占用,該文件就是/etc/selinux/policy。而selinux可以吧1些規(guī)則里面可以方便控制的功能都設(shè)定為on或off,這些都成為布爾類型,其中g(shù)etsebool -a 可以顯示這些布爾類型的內(nèi)容。
在使用了selinux的系統(tǒng)中,每個(gè)進(jìn)程的上下文都包括了3個(gè)組成部份:1個(gè)ID,也就是identify,1個(gè)角色,也就是role,1個(gè)域,也就是domain。其中的ID是指這個(gè)進(jìn)程的所有者,就是Unix賬戶,但是條件賬是這個(gè)賬戶必須被預(yù)先編譯到selinux策略中,這樣selinux才能夠認(rèn)識(shí)這個(gè)賬戶,不然的話selinux默許地將那些未知的系統(tǒng)進(jìn)程ID標(biāo)記為system_u,將那些未知的用戶進(jìn)程ID標(biāo)記為user_u,通常角色用來判斷某個(gè)處于此角色的ID可以進(jìn)入哪些域,還可以用來避免某個(gè)處于此角色的ID進(jìn)入其他不該進(jìn)入的域。
其實(shí)域也是和1個(gè)進(jìn)程相對(duì)應(yīng)的1個(gè)類型,所以當(dāng)檢查某個(gè)進(jìn)程是不是有權(quán)向另外一個(gè)進(jìn)程發(fā)送信號(hào)的時(shí)候,接受信號(hào)的進(jìn)程的域就會(huì)充當(dāng)"域-類型"模型中的"類型"的角色,從而完成"域-類型"的規(guī)則檢查。也就是完成了進(jìn)程間通訊權(quán)限的檢查。由于對(duì)文件還沒有使用角色這個(gè)機(jī)制,所以目前每一個(gè)文件都被規(guī)定為object_r角色,這個(gè)角色只是1個(gè)位置,對(duì)策略沒有任何影響。
文件的ID就是文件創(chuàng)建者的ID,策略源文件中使用這個(gè)方式來判斷1個(gè)訪問是不是有權(quán)改變這個(gè)文件的上下文描寫符。除非被訪問的文件的描寫符中的ID字段和訪問該文件的進(jìn)程的所有者的ID字段相同,不管是改變前還是改變后,否則進(jìn)程無(wú)權(quán)改變1個(gè)文件的上下文描寫符。
我們可使用ls -Z來顯示文件的標(biāo)簽,我們可使用ps -Z來顯示進(jìn)程的標(biāo)簽,比如我們可使用ps auxZ | grep httpd來查看selinux的具體信息。
我們可使用chcon命令來修改上下文,而chcon是change context的縮寫,chcon -t是修改成特定類型,其中-R是遞歸修改,可以改變目錄下的所有目錄,而--reference=以某個(gè)文件的標(biāo)簽為參照改成1樣的標(biāo)簽,比如我們可使用chcon -R --reference=/var/www/html /www,固然我們還可以直接修改,范例命令是chcon -t default_t /www/index.html。
我們可使用restorecon來恢復(fù)默許安全上下文的修改,該命令的-R參數(shù)表示遞歸,該命令的-F參數(shù)表示強(qiáng)迫,該命令的-v參數(shù)表示顯示詳細(xì)信息,我們可使用restorecon -R -v -F /www來顯示/www目錄的詳細(xì)CS信息。我們也能夠使用semange來進(jìn)行信息的修改,通常它的-d參數(shù)表示刪除,-m表示修改,-a表示附加,-t表示類型。
我們可使用getsebool -a | grep httpd來查看某個(gè)對(duì)應(yīng)的布爾類型的值,我們可以進(jìn)行設(shè)置setsebool httpd_enable_cgi=on,其中加上-p選項(xiàng)表示永久有效。
而有些文件是沒有指定上下文的,也就是那些不支持rwx標(biāo)簽的文件系統(tǒng),比如/sys、/dev、/selinux,ls命令就不會(huì)顯示其上下文,對(duì)不能使用stat命令查看當(dāng)前狀態(tài)的那些文件系統(tǒng),ls命令會(huì)返回?--------,其中所有者和所有組也會(huì)被標(biāo)記為?。而我們的id命令會(huì)返回當(dāng)前shell的上下文。
當(dāng)我們啟動(dòng)1個(gè)selinux時(shí),init所做的第1件事就是掛載/proc文件系統(tǒng),并且判斷selinux是不是被激活i,init通過selinuxfs文件系統(tǒng)來判斷內(nèi)核中是不是有selinux,如果內(nèi)核中沒有selinux參數(shù)或內(nèi)核參數(shù)中selinux=0這1項(xiàng),那末系統(tǒng)就會(huì)以1種叫做non-SE的狀態(tài)繼續(xù)引導(dǎo)啟動(dòng)。如果發(fā)現(xiàn)了selinux,那末/selinux虛擬文件系統(tǒng)將會(huì)被創(chuàng)建,然后init通過/selinux/policyvers來檢查內(nèi)核所支持的selinux版本。最后,相應(yīng)的的策略數(shù)據(jù)/etc/selinux/X/policy/policy.YY就會(huì)被裝載到內(nèi)核當(dāng)中了,這里的X是對(duì)應(yīng)的策略,我們可使用strict或targeted。