SELinux進(jìn)階篇 應(yīng)用目標(biāo)策略管理非限制進(jìn)程和用戶
原創(chuàng)一、管理非限制進(jìn)程
非限制的進(jìn)程運(yùn)行在非限制域中。比如,init進(jìn)程運(yùn)行在非限制的initrc_t域中,非限制的kernel進(jìn)程運(yùn)行在kernel_t域中,非限制的用戶運(yùn)行在unconfined_t域中。對于非限制的進(jìn)程,SELinux策略規(guī)則仍然適用,然而有關(guān)允許進(jìn)程運(yùn)行在非限制域中的規(guī)則允許幾乎所有的訪問。因此,如果一個非限制進(jìn)程被黑客控制的話,那么SELinux將不能阻止黑客獲取對系統(tǒng)資源和數(shù)據(jù)的訪問權(quán)限,當(dāng)然DAC規(guī)則仍然適用,因?yàn)镾ELinux機(jī)制是在DAC層次上附加一層對Linux的增強(qiáng),而不是簡單地替代DAC。
下面將給出一個具體的例子來說明Apache Http服務(wù)器(httpd進(jìn)程)在非限制的條件下運(yùn)行,是如何能夠訪問本應(yīng)由Samba服務(wù)器訪問的數(shù)據(jù)的。值得注意的是:在Fedora 10中,httpd進(jìn)程默認(rèn)是限制運(yùn)行在httpd_t域中的。下面的例子假設(shè)用戶系統(tǒng)中安裝了httpd、wget(一種類似于Windows系統(tǒng)下Flashget軟件的多線程下載工具)、settroubleshoot-server、audit等工具包,并且SELinux機(jī)制運(yùn)行在enforcing模式下。
(1)運(yùn)行sestatus命令來確認(rèn)Linux中SELinux是運(yùn)行的,且運(yùn)行在enforcing模式下,運(yùn)行結(jié)果與圖1所示一致:
圖1 運(yùn)行sestatus命令來確認(rèn)Linux中SELinux是否運(yùn)行
(2)以root用戶身份,創(chuàng)建一個新的測試文件testfile2,該文件路徑為httpd進(jìn)程的工作目錄下,如下所示:
- #touch /var/www/html/testfile2
(3)使用ls -z命令來查看新創(chuàng)建的文件的SELinux上下文信息,如圖2所示:
圖2 使用ls-Z命令查看新創(chuàng)建文件的SELinux上下文信息
從上述結(jié)果中可以清楚看到:Linux用戶默認(rèn)運(yùn)行在非限制域中,所以testfile2文件上下文信息標(biāo)識為unconfined_u。并且,RBAC用于進(jìn)程,而不是文件。另外,對于文件來說角色也沒有特別的含義,因此賦予其object_r為較為通用的角色。而httpd_sys_content類型則允許httpd進(jìn)程對該文件進(jìn)行訪問。
(4)采用chron命令暫時(shí)對文件的標(biāo)識進(jìn)行改變。一旦系統(tǒng)重啟,該改變將會失效。若要***改變文件的標(biāo)識,可以采用semanage命令進(jìn)行操作。使用root用戶身份,運(yùn)行如下命令來將文件類型改為由Samba服務(wù)器可訪問的類型:
- #chcon -t samba_share_t /var/www/html/testfile2
然后,采用ls -z命令來查看修改后的結(jié)果:
- # ls -Z /var/www/html/testfile2
- -rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile2
(5)在將httpd進(jìn)程從限制修改為非限制之前,需要將該進(jìn)程停止,使用如下命令:
- #/sbin/service httpd stop
(6)以root用戶身份運(yùn)行如下命令,來改變httpd進(jìn)程的類型,以將其從限制改為非限制:
- #chcon -t unconfined_exec_t /usr/sbin/httpd
然后,使用ls -z命令來查看進(jìn)程,以確保修改生效,如下所示:
- # ls -Z /usr/sbin/httpd
- -rwxr-xr-x root root system_u:object_r:unconfined_exec_t:s0 /usr/sbin/httpd
(7)為了使httpd在運(yùn)行時(shí)該修改生效,需要重新啟動httpd進(jìn)程,如圖6-22所示:
(8)采用ps -ez | grep httpd命令來查看httpd進(jìn)程運(yùn)行在非限制域中的情況,如圖3所示:
圖3 啟動httpd進(jìn)程并查看#p#
(9)在有權(quán)限許可的目錄下,運(yùn)行如下命令來測試httpd進(jìn)程運(yùn)行在非限制情況下的效果,如圖4所示:
圖4 wget命令成功執(zhí)行
上述的運(yùn)行結(jié)果顯示,該命令能夠成功運(yùn)行。雖然httpd進(jìn)程原來沒有訪問標(biāo)記為samba_share_t類型文件的權(quán)限,然而由于修改,httpd進(jìn)程現(xiàn)在運(yùn)行在非限制環(huán)境下(unconfined_t),所以SELinux轉(zhuǎn)為執(zhí)行DAC機(jī)制,而wget命令可以訪問該文件,所以成功執(zhí)行。
(10)測試結(jié)束后,需要使用如下命令來恢復(fù)該httpd進(jìn)程本來的運(yùn)行限制:
- #restorecon -v /user/sbin/httpd
然而,采用如下命令來進(jìn)行查看,發(fā)現(xiàn)httpd進(jìn)程又從非限制狀態(tài)恢復(fù)為限制狀態(tài):
- # ls -Z /usr/sbin/httpd
- -rwxr-xr-x root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
(11)使用如下命令重新啟動httpd,以時(shí)修改在httpd進(jìn)程運(yùn)行時(shí)生效,并通過ps -ez命令來查看進(jìn)程的運(yùn)行狀態(tài),如圖5所示:
- #/sbin/service httpd restart
- # ps -eZ | grep httpd
- unconfined_u:system_r:httpd_t:s0 2963 ? 00:00:00 httpd
- unconfined_u:system_r:httpd_t:s0 2965 ? 00:00:00 httpd
- unconfined_u:system_r:httpd_t:s0 2966 ? 00:00:00 httpd
- unconfined_u:system_r:httpd_t:s0 2967 ? 00:00:00 httpd
- unconfined_u:system_r:httpd_t:s0 2968 ? 00:00:00 httpd
- unconfined_u:system_r:httpd_t:s0 2969 ? 00:00:00 httpd
- unconfined_u:system_r:httpd_t:s0 2970 ? 00:00:00 httpd
- unconfined_u:system_r:httpd_t:s0 2971 ? 00:00:00 httpd
- unconfined_u:system_r:httpd_t:s0 2972 ? 00:00:00 httpd
- unconfined_u:system_r:httpd_t:s0 2973 ? 00:00:00 httpd
圖5 恢復(fù)httpd進(jìn)程的運(yùn)行限制
到此為止,上述例子詳細(xì)的演示了SELinux是如何通過限制進(jìn)程的運(yùn)行來保證Linux系統(tǒng)安全的,也看到了如果將進(jìn)程改為unconfined運(yùn)行狀態(tài)的安全隱患,因此提醒廣大用戶在實(shí)際應(yīng)用過程中切忌不要隨便將進(jìn)程默認(rèn)的限制運(yùn)行狀態(tài)改為非限制狀態(tài),以免給Linux系統(tǒng)帶來不必要的麻煩和安全隱患。
二、管理限制和非限制用戶
在前面的介紹中曾經(jīng)提到過,每個傳統(tǒng)的Linux用戶在SELinux中都被映射為一個SELinux用戶。這使得Linux用戶能夠繼承在SELinux用戶上的訪問控制。用戶可以使用semanage login -l命令來查看兩類用戶之間的具體映射情況,如圖6所示:
圖6 使用semanage命令查看用戶映射#p#
舉個例子,在Fedora 10中,Linux用戶默認(rèn)被映射到SELinux的_default_login中,從而映射為unconfined_u用戶類型。
下面通過一個更加具體的在SELinux中添加新用戶的例子,來說明SELinux是怎么來映射Linux用戶的。該例子的具體操作步驟如下,如圖7所示:
圖7 在SELinux中添加新用戶
(1)以root用戶身份,運(yùn)行useradd命令,添加一個新用戶liyang:
- #useradd liyang
(2)以root用戶身份,運(yùn)行passwd命令,修改該用戶的密碼:
- #passwd liyang
(3)退出當(dāng)前的root運(yùn)行身份,以liyang的身份重新登錄Linux。重新登錄后,SELinux將為用戶liyang生成SELinux上下文,查看該用戶的上下文:
- # id -Z
- unconfined_u:unconfined_r:unconfined_t:s0
可以清楚地看到,當(dāng)Linux添加一個新用戶時(shí),SELinux將默認(rèn)地映射該用戶為unconfined_u類型,角色為unconfined_r,以及unconfined_t級別。
限制和非限制用戶都需要接受可執(zhí)行和可寫的內(nèi)存檢查,并且受MCS和MLS機(jī)制的約束。如果一個非限制的用戶執(zhí)行了一個從unconfined_t域向一個允許的域轉(zhuǎn)變的應(yīng)用程序,非限制用戶仍要接受那個轉(zhuǎn)表到的域的限制。這個就保證了即使一個用戶是非限制的,這個應(yīng)用也是受限的,因此,軟件的漏洞所引起的風(fēng)險(xiǎn)就能得到限制
【51CTO.com獨(dú)家特稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載!合作媒體轉(zhuǎn)載請注明原文出處及出處!】