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