新聞中心
本文中,作者將為大家講述如何使用chroot保障開源系統(tǒng)服務(wù)安全。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、興平網(wǎng)絡(luò)推廣、小程序定制開發(fā)、興平網(wǎng)絡(luò)營銷、興平企業(yè)策劃、興平品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供興平建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
1、主要功能
在早期的UNIX系統(tǒng)中,根目錄是文件系統(tǒng)中的一個固定點(diǎn)。在當(dāng)前UNIX變體中,包括Linux,你可以在每個進(jìn)程的基礎(chǔ)上定義根目錄。chroot實(shí)用程序程序允許你用根目錄(而非/)運(yùn)行一個進(jìn)程。
根目錄位于目錄層次結(jié)構(gòu)的頂部,并且沒有父目錄。因此,一個進(jìn)程無法訪問根目錄以上的文件,因?yàn)椴淮嬖?。例如,如果運(yùn)行一個程序(進(jìn)程),指定其根目錄為/home/sam/jail,該程序沒有/home/sam中的任何文件的概念:jail是該程序的根目錄,并標(biāo)記為/(不是jail)。
通過創(chuàng)建一個人工的根目錄,通常被稱為(chroot)jail,可以防止一個程序訪問、執(zhí)行或修改(可能惡意)始自其根目錄層次結(jié)構(gòu)之外的文件。你必須正確設(shè)置一個chroot jail以提高安全性:如果你沒有正確設(shè)置chroot jail,惡意用戶會比沒有chroot jail更容易獲得訪問系統(tǒng)的權(quán)限。
2、使用chroot
1)創(chuàng)建chrot jail
創(chuàng)建一個chroot jail很簡單:使用root權(quán)限,執(zhí)行/usr/sbin/chroot directory命令。其中directory成為根目錄,該進(jìn)程試圖運(yùn)行默認(rèn)shell。使用root權(quán)限,下面的命令在(現(xiàn)有的)/home/sam/jail目錄中設(shè)置一個chroot jail:
# /usr/sbin/chroot /home/sam/jail /usr/sbin/chroot: failed to run command '/bin/bash': No such file or directory
這個例子設(shè)置一個chroot jail,但是當(dāng)系統(tǒng)試圖運(yùn)行bash shell時,操作失敗。一旦設(shè)置了jail,名為jail的目錄將取代根目錄的名稱/。因此,chroot環(huán)境無法找到由/bin/bash路徑名標(biāo)識的文件。在這種情況下chroot jail正常工作,但沒有用處。
讓chroot jail按你想要的方式工作是較為復(fù)雜的。要讓前面的例子在chroot jail中運(yùn)行bash,在jail (/home/sam/jail/bin)中創(chuàng)建一個bin目錄并將/bin/bash復(fù)制這個目錄。由于bash二進(jìn)制文件是到共享庫的動態(tài)鏈接,你還需要將這些庫文件(在lib中)復(fù)制到j(luò)ail中。
2)一個具體的例子
下面的示例創(chuàng)建必要的目錄、復(fù)制bash、使用ldd來顯示bash依賴的共享庫以及復(fù)制必要的庫文件到lib中。 linux-gate.so.1文件是一個動態(tài)共享對象(DSO),由內(nèi)核提供以加速系統(tǒng)調(diào)用,不必復(fù)制它。
$ pwd
/home/sam/jail
$ mkdir bin lib
$ cp /bin/bash bin
$ ldd bin/bash
linux-gate.so.1 => (0×00988000)
libtinfo.so.5 => /lib/libtinfo.so.5 (0×0076b000)
libdl.so.2 => /lib/libdl.so.2 (0×00afb000)
libc.so.6 => /lib/libc.so.6 (0×00110000)
/lib/ld-linux.so.2 (0×00923000)
$ cp /lib/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux.so.2} lib現(xiàn)在再次啟動chroot jail。雖然一個普通用戶可以完成所有設(shè)置,但必須使用root權(quán)限來運(yùn)行chroot:
$ su Password: #/usr/sbin/chroot . bash-4.1# pwd / bash-4.1# ls bash: ls: command not found bash-4.1#
這一次chroot查找并啟動bash,顯示其默認(rèn)的提示符(bash-4.1#)。pwd命令工作,因?yàn)樗且粋€shell內(nèi)置命令。然而,bash無法找到ls命令,因?yàn)樗辉赾hroot jail中。如果想要jail中的用戶能夠使用ls,可以把/bin/ls及其庫文件復(fù)制到j(luò)ail中。exit命令允許你從jail退出。
如果為chroot提供第二個參數(shù),它把該參數(shù)作為jail內(nèi)運(yùn)行的程序的名稱。下面的命令與前一個等價:
# /usr/sbin/chroot /home/sam/jail /bin/bash
要建立一個有用的chroot jail,首先要確定chroot jail的用戶需要哪些實(shí)用程序。然后將相應(yīng)的二進(jìn)制文件及其庫文件復(fù)制到j(luò)ail中?;蛘?,可以建立二進(jìn)制文件的靜態(tài)副本并把它們放入jail中,無需安裝單獨(dú)的庫。(靜態(tài)鏈接二進(jìn)制文件大大超過其對應(yīng)的動態(tài)二進(jìn)制文件。bash基本系統(tǒng)及其核心工具的規(guī)模超過50兆字節(jié)。)你可以在bash和coreutils SRPMS(源RPM)軟件包中找到最常用工具的源代碼。
chroot實(shí)用程序?qū)⑹。且詒oot權(quán)限運(yùn)行。以root權(quán)限運(yùn)行chroot的結(jié)果是一個root shell(具有root權(quán)限的shell)運(yùn)行在chroot jail內(nèi)。由于具有root權(quán)限的用戶可以突破chroot jail,當(dāng)務(wù)之急是在chroot jail中要以降低的特權(quán)運(yùn)行一個程序。
有幾種方法可以降低用戶的特權(quán)。例如,可以把su或sudo放在jail中,然后啟動shell或jail內(nèi)的守護(hù)程序,使用這些程序之一,來降低在jail中工作的用戶的特權(quán)。以下命令以jail中降低的特權(quán)啟動一個shell:
# /usr/sbin/chroot jailpath /bin/su user -c /bin/bash
其中jailpath是jail目錄的路徑名,以及user是shell以特權(quán)運(yùn)行的用戶名。這種情況下的問題是sudo和su調(diào)用PAM。要運(yùn)行這些實(shí)用程序之一,需要把所有的PAM,包括它的庫和配置文件,與sudo (或 su)和/etc/passwd文件一起放在jail中?;蛘?,可以重新編譯su或sudo。然而,其源代碼調(diào)用PAM,所以需要修改其源代碼以便它不調(diào)用PAM。這些技術(shù)既費(fèi)時又引入了復(fù)雜性,從而導(dǎo)致不安全的jail。
下面的C程序以降低的特權(quán)運(yùn)行chroot jail中的一個程序。因?yàn)樵摮绦蛟谡{(diào)用chroot()之前獲取你在命令行上指定的用戶的UID和GID,不需要把/etc/passwd放入jail。該程序降低了指定用戶的指定程序的特權(quán)。該程序?yàn)榍懊娴膯栴}提供了一個簡單的解決方案,所以你可以試驗(yàn)chroot jail并更好地理解其工作原理。
$ cat uchroot.c
/* See svn.gna.org/viewcvs/etoile/trunk/Etoile/LiveCD/uchroot.c for terms of use. */
#include
#include
#include
int main(int argc, char * argv[])
{
if(argc < 4)
{
printf("Usage: %s {username} {directory} {program} [arguments]\n",
argv[0]);
return 1;
}
/* Parse arguments */
struct passwd * pass = getpwnam(argv[1]);
if(pass == NULL)
{
printf("Unknown user %s\n", argv[1]);
return 2;
}
/* Set the required UID */
chdir(argv[2]);
if(chroot(argv[2])
||
setgid(pass->pw_gid)
||
setuid(pass->pw_uid))
{
printf("%s must be run as root. Current uid=%d, euid=%d\n",
argv[0],
(int)getuid(),
(int)geteuid()
);
return 3;
}
return execv(argv[3], argv + 3);
}以下命令的第一行使用cc(gcc軟件包)編譯uchroot.c,創(chuàng)建一個uchroot可執(zhí)行文件。后續(xù)命令將uchroot移入/usr/local/bin目錄,并給予相應(yīng)的所有權(quán)。
$ cc -o uchroot uchroot.c $ su password: # mv uchroot /usr/local/bin # chown root:root /usr/local/bin/uchroot # exit $ ls -l /usr/local/bin/uchroot -rwxrwxr-x. 1 root root 5704 12-31 15:00 /usr/local/bin/uchroot
使用本節(jié)前面的設(shè)置,執(zhí)行下面的命令以chroot jail內(nèi)用戶sam的特權(quán)運(yùn)行一個shell:
# /usr/local/bin/uchroot sam /home/sam/jail /bin/bash
如果你計劃部署多個chroot jail,最好保存bin和lib目錄的一個干凈副本。
3、運(yùn)行chroot Jail中的一個服務(wù)
運(yùn)行jail內(nèi)的shell,用處不大。在現(xiàn)實(shí)中,你更可能要運(yùn)行jail內(nèi)的一個特定服務(wù)。要運(yùn)行jail內(nèi)的服務(wù),確保該服務(wù)所需的所有文件在jail內(nèi)。使用uchroot在chroot jail中啟動一個服務(wù)的命令格式為:
# /usr/local/bin/uchroot user jailpath daemonname
其中jailpath是jail目錄的路徑名,user是運(yùn)行守護(hù)進(jìn)程的用戶名,daemonname是提供服務(wù)的守護(hù)進(jìn)程的路徑名(jail內(nèi))。
已經(jīng)設(shè)置了某些服務(wù)器來利用chroot jail。例如,可以設(shè)置DNS以便named運(yùn)行在jail中,以及vsftpd FTP服務(wù)器可以為客戶端自動啟動chroot jail。
4、安全性考慮
有些服務(wù)需要由具有root權(quán)限的用戶或進(jìn)程來運(yùn)行,但一旦啟動就釋放其root權(quán)限(例如Apache、Procmail和vsftpd)。如果運(yùn)行這樣的服務(wù),不必使用uchroot或者把su或sudo放入jail內(nèi)。
以root權(quán)限運(yùn)行的進(jìn)程有可能從chroot jail退出。出于這個原因,在啟動一個運(yùn)行在jail內(nèi)的程序之前,應(yīng)該降低特權(quán)。此外,慎重對待jail內(nèi)允許的setuid二進(jìn)制文件—其中的安全漏洞可能會危及jail的安全。此外,確保該用戶不能訪問他上傳到j(luò)ail的可執(zhí)行文件。
網(wǎng)頁標(biāo)題:如何使用chroot保障開源系統(tǒng)服務(wù)安全
鏈接地址:http://www.dlmjj.cn/article/dpigeco.html


咨詢
建站咨詢
