■ 河南 郭建偉
編者按:為了增加Linux對Root權(quán)限的有效管控,利用Linux內(nèi)核提供的Chroot機制,讓某個服務(wù)器軟件在限定的目錄中運行,為對應(yīng)的服務(wù)設(shè)置“牢籠”,來更加有效的保護系統(tǒng)安全。
在Linux中,各種服務(wù)都是以Root權(quán)限來啟動的。這是因為相應(yīng)的服務(wù)(例如Apache等)需要綁定特定的端口,才可以監(jiān)聽連接請求。這就需要依靠Root權(quán)限才可以實現(xiàn)。
隨著針對緩沖區(qū)漏洞攻擊的頻繁出現(xiàn),如果受到黑客攻擊的某個網(wǎng)絡(luò)服務(wù)存在安全漏洞,黑客就可以借此控制整個服務(wù)器,這對系統(tǒng)安全的危害是很大的。
為了避免出現(xiàn)這種情況,當前的服務(wù)器軟件一般采取了先以Root權(quán)限啟動,之后放棄Root權(quán)限,并以具有較低權(quán)限的賬戶運行服務(wù)。這樣即使黑客利用某服務(wù)的漏洞侵入系統(tǒng),得到的也只能是較低的權(quán)限,對系統(tǒng)危害不是很大。
為了進一步提高安全性,防止黑客利用其他的系統(tǒng)漏洞來非法提升權(quán)限,可以使用Chroot機制,為對應(yīng)的服務(wù)設(shè)置“牢籠”,來更加有效的保護系統(tǒng)安全。
這里所說的“牢籠”,其實指的是利用Linux內(nèi)核提供的Chroot機制,讓某個服務(wù)器軟件在限定的目錄中運行,使其只能對該目錄以及子目錄中的數(shù)據(jù)進行操作,而無法看到之外的目錄(例如根目錄等),來最大限度的保護系統(tǒng)安全。即使黑客控制了該服務(wù)器軟件,對系統(tǒng)也不會造成大的損壞。對服務(wù)器軟件進行Chroot處理,需要將該軟件運行所需的全部程序,配置文件和庫文件安裝到Chroot目錄中,該Chroot目錄就會成為“監(jiān)牢”。
在這里就以Apache和DHCP服務(wù)為例,來說明如何將其置于“牢籠”中安全運行。
如果在“牢籠”中運行DHCP服務(wù),那么訪問者根本看不到Linux中真實的目錄。使用Chroot技術(shù)保護DHCP,一般需要先創(chuàng)建對應(yīng)的目錄,并將守護進程的可執(zhí)行文件DHCPD以及其所需的庫文件復(fù)制進來。
利用JAIL工具,可以輕松高效的創(chuàng)建Choot“牢籠”。首先將“jail_x.x.tar.gz”安裝包下載到某個位置,其中的“x.x”表示其版本號。然后運行“tar xzvf jail.tar.gz &&cd jail/src”“make”命令,來編譯和安裝jail。在這里將jail安裝到“/usr/local”目錄中。
在其中的“bin”目錄中提供了一些核心命令,“mk jailenv”命令用于創(chuàng)建“監(jiān)牢”目錄,并且從真實的文件系統(tǒng)中復(fù)制基本的軟件環(huán)境?!癮ddjailsw”命令的作用是從真實的文件系統(tǒng)中復(fù)制二進制可執(zhí)行文件及其相關(guān)的庫文件、設(shè)備文件、輔助文件的資源?!癮ddjailuser”命令用來創(chuàng)建chroot“監(jiān)牢”中的賬戶。
對于DHCP服務(wù)來說,創(chuàng)建“牢籠”的步驟是先執(zhí)行“service dhcpd stop”命令,停止DHCP服務(wù),并執(zhí)行“mk jailenv/var/chapad”命令,創(chuàng)建“牢籠”目錄。之后執(zhí)行“addjailsw/var/chapad/-P/usr/sbin/dhcpd”命令,在“牢籠”目錄中添加dhcpd程序。
對于該命令出現(xiàn)的警告信息,用戶不必在意。因為JAIL會使用ldd功能來檢查DHCPD用到的庫文件。接下來執(zhí)行以下命令:
mkdr -p/var/chapad/dhcp/etc
cp/etc/dhcpd.conf/root/chroot/dhcp/etc
mkdir -p/var/chapad/dhcp/var/dhcp
touch/var/chapad/dhcp/var/dhcp/dhcp.leases
將和DHCPD相關(guān)的文件復(fù)制到“監(jiān)牢”目錄中。其中的“/etc/dhcpd.conf”文件是DHCPD的配置文件。執(zhí)行“/var/chapad/usr/sbin/dhcpd”命令,來重新啟動DHCPD。之后執(zhí)行“ps -ef |grep dhcpd”命令,可以看到DHCPD已經(jīng)運行在上述“監(jiān)牢”目錄中。
Apache實際是安裝在“/usr/local/httpd”目錄中的,以Root用戶(或者同權(quán)限的賬戶)身份啟動,該Root權(quán)限的父進程會派生多個具有nobody的子進程。Apache的父進程會監(jiān)聽TCP 80端口,并將外界的連接請求非配給某個子進程。子進程所處的目錄依然是“/usr/local/httpd”。
如果黑客對Apache的子進程攻擊生效,就會利用存在目錄權(quán)限設(shè)置上的漏洞,對“/usr/local/”等目錄甚至整個文件系統(tǒng)進行滲透攻擊。為了避免出現(xiàn)這種不利情況,可以利用Chroot機制,將Apache限定的“/usr/local/httpd”目錄中運行。這樣,Apache所能接觸的文件只能是該目錄及其子目錄中的文件,即將Apache進程權(quán)限限制在文件系統(tǒng)中的某個目錄中。
通過執(zhí)行“service httpd stop”命令,可關(guān)閉Apache服務(wù)。執(zhí)行“/usr/local/bin/mkjailenv/var/chapa”命令,可以針對“/var/chapa”目錄來創(chuàng)建“監(jiān)牢”。接下來執(zhí)行“/usr/local/bin/addjailsw/var/chapa”命令,可以將一些基本的命令(例如ls、cp)等添加到該“監(jiān)牢”中。這里需要將Apache服務(wù)器軟件添加進來。
執(zhí)行“addjailsw/var/chapa -P/usr/local/httpd/bin/httpd”命令,JAIL會自動調(diào)用LDD來檢查httpd用到的所有庫文件。LDD(Library Dependency Display,庫從屬關(guān)系顯示)的作用是顯示一個可執(zhí)行程序必須使用的共享庫。執(zhí)行“cp -a/usr/local/httpd//var/chapa/usr/local/”命令,將和Apache相關(guān)的文件復(fù)制到“/var/chapa”。對于其他一些需要的文件,可以使用同樣的方法,將其復(fù)制到上述“監(jiān)牢”中。
僅僅有了“監(jiān)牢”是不夠的,還必須在其中添加相關(guān)的賬戶。例如,Apache服務(wù)就需要httpd、nobody賬戶的支持。
執(zhí)行“useradd -d/var/chapa -s/usr/local/bin/jail httpd”命令,在真實的系統(tǒng)中創(chuàng)建名為“httpd”的賬戶,其Home目錄為“/var/chapa”,所登錄的Shell是“jail”。執(zhí)行“/usr/local/bin/addjailuser/var/chapa/usr/local/httpd//usr/sbin/httpd httpd”命令,在“/var/chapa”中創(chuàng)建httpd賬戶。
使用VI命令,對“/var/chapa/usr/local/conf/httpd.conf”文件進行編輯,將其中的“User nobody”修改為“User httpd”,將“Port 80”修改為“Port 8001”。因為只有Root權(quán)限才可以將端口綁定在低于1024的端口上。
執(zhí)行“/usr/local/bin/addjailsw/var/chapa -P httpd "-k start -DSSL"” “/usr/local/bin/addjailsw/var/chapa -P httpd "-k$ARGV"”命令,將保證Apache完整運行的所有庫文件添加進來。執(zhí)行“su -httpd &”命令,讓Apache在“監(jiān)牢”中運行。
訪問Apache服務(wù)時,必須在網(wǎng)址后添加8001端口號。