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