1、首要功能
在初期的UNIX系统中,根目次是文件系统中的一个固定点。在当前UNIX变体中,包含Linux,你可以在每个过程的根本上定义根目次。chroot合用法度法度承诺你用根目次(而非/)运行一个过程。
根目次位于目次层次布局的顶部,并且没有父目次。是以,一个过程没法拜候根目次以上的文件,因为不存在。例如,假定运行一个法度(过程),指定其根目次为 /home/sam/jail,该法度没有/home/sam中的任何文件的概念:jail是该法度的根目次,并标识表记标帜为/(不是jail)。
经由过程成立一小我工的根目次,凡是被称为(chroot)jail,可以避免一个法度拜候、履行或点窜(可能歹意)始自其根目次层次布局以外的文件。你必需 准确设置一个chroot jail以进步安然性:假定你没有准确设置chroot jail,歹意用户会比没有chroot jail更等闲获得拜候系统的权限。
2、利用chroot
1)成立chrot jail
成立一个chroot jail很简单:利用root权限,履行/usr/sbin/chroot directory号令。此中directory成为根目次,该过程试图运行默许shell。利用root权限,下面的号令在(现有的)/home /sam/jail目次中设置一个chroot jail:
# /usr/sbin/chroot /home/sam/jail
/usr/sbin/chroot: failed to run command '/bin/bash': No such file or directory
这个例子设置一个chroot jail,可是当系统试图运行bash shell时,把持掉败。一旦设置了jail,名为jail的目次将代替根目次的名称/。是以,chroot环境没法找到由/bin/bash路径名标识 的文件。在这类环境下chroot jail正常工作,但没有效处。
让chroot jail按你想要的编制工作是较为复杂的。要让前面的例子在chroot jail中运行bash,在jail (/home/sam/jail/bin)中成立一个bin目次并将/bin/bash复制这个目次。因为bash二进制文件是到共享库的动态链接,你还 需要将这些库文件(在lib中)复制到jail中。
2)一个具体的例子
下面的示例成立需要的目次、复制bash、利用ldd来显示bash依托的共享库和复制需要的库文件到lib中。 linux-gate.so.1文件是一个动态共享对象(DSO),由内核供给以加快系统调用,没必要复制它。
$ 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/ lib
此刻再次启动chroot jail。当然一个通俗用户可以完成所有设置,但必需利用root权限来运行chroot:
$ su
Password:
#/usr/sbin/chroot .
bash-4.1# pwd
/
bash-4.1# ls
bash: ls: command not found
bash-4.1#
这一次chroot查找并启动bash,显示其默许的提示符(bash-4.1#)。pwd号令工作,因为它是一个shell内置号令。但是,bash无 法找到ls号令,因为它不在chroot jail中。假定想要jail中的用户可以或许利用ls,可以把/bin/ls及其库文件复制到jail中。exit号令承诺你从jail退出。
假定为chroot供给第二个参数,它把该参数作为jail内运行的法度的名称。下面的号令与前一个等价:
# /usr/sbin/chroot /home/sam/jail /bin/bash
要成立一个有效的chroot jail,起首要肯定chroot jail的用户需要哪些合用法度。然后将响应的二进制文件及其库文件复制到jail中。或,可以成立二进制文件的静态副本并把它们放进jail中,无需 安装伶仃的库。(静态链接二进制文件大年夜大年夜超越其对应的动态二进制文件。bash根基系统及其核心东西的范围超越50兆字节。)你可以在bash和 coreutils SRPMS(源RPM)软件包中找到最常常利用东西的源代码。
chroot合用法度将掉败,除非以root权限运行。以root权限运行chroot的成果是一个root shell(具有root权限的shell)运行在chroot jail内。因为具有root权限的用户可以冲破chroot jail,当务之急是在chroot jail中要以降落的特权运行一个法度。
有几种编制可以降落用户的特权。例如,可以把su或sudo放在jail中,然后启动shell或jail内的守护法度,利用这些法度之一,来降落在jail中工作的用户的特权。以下号令以jail中降落的特权启动一个shell:
# /usr/sbin/chroot jailpath /bin/su user -c /bin/bash
此中jailpath是jail目次的路径名,和user是shell以特权运行的用户名。这类环境下的标题问题是sudo和su调用PAM。要运行这些实 用法度之一,需要把所有的PAM,包含它的库和建设文件,与sudo (或 su)和/etc/passwd文件一路放在jail中。或,可以从头编译su或sudo。但是,其源代码调用PAM,所以需要点窜其源代码以便它不调 用PAM。这些手艺既费时又引进了复杂性,从而导致不服安的jail。
下面的C法度以降落的特权运行chroot jail中的一个法度。因为该法度在调用chroot()之前获得你在号令行上指定的用户的UID和GID,不需要把/etc/passwd放进 jail。该法度降落了指定用户的指定法度的特权。该法度为前面的标题问题供给了一个简单的解决方案,所以你可以实验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 [arguments]n",
argv[0]);
return 1;
}
/* Parse arguments */
struct passwd * pass = getpwnam(argv[1]);
if(pass == NULL)
{
printf("Unknown user %sn", 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=%dn",
argv[0],
(int)getuid(),
(int)geteuid()
);
return 3;
}
return execv(argv[3], argv + 3);
}
以下号令的第一行利用cc(gcc软件包)编译uchroot.c,成立一个uchroot可履行文件。后续号令将uchroot移进/usr/local/bin目次,并赐与响应的所有权。
$ 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
利用本节前面的设置,履行下面的号令以chroot jail内用户sam的特权运行一个shell:
# /usr/local/bin/uchroot sam /home/sam/jail /bin/bash
假定你打算摆设多个chroot jail,最好保留bin和lib目次的一个洁净副本。
3、运行chroot Jail中的一个办事
运行jail内的shell,用处不大年夜。在实际中,你更可能要运行jail内的一个特定办事。要运行jail内的办事,确保该办事所需的所有文件在jail内。利用uchroot在chroot jail中启动一个办事的号令格局为:
# /usr/local/bin/uchroot user jailpath daemonname
此中jailpath是jail目次的路径名,user是运行守护过程的用户名,daemonname是供给办事的守护过程的路径名(jail内)。
已设置了某些办事器来操纵chroot jail。例如,可以设置DNS以便named运行在jail中,和vsftpd FTP办事器可觉得客户端主动启动chroot jail。
4、安然性考虑
有些办事需要由具有root权限的用户或过程来运行,但一旦启动就释放其root权限(例如Apache、Procmail和vsftpd)。假定运行如许的办事,没必要利用uchroot或把su或sudo放进jail内。
以root权限运行的过程有可能从chroot jail退出。出于这个启事,在启动一个运行在jail内的法度之前,应当降落特权。别的,慎重对待jail内承诺的setuid二进制文件—此中的安然 缝隙可能会危及jail的安然。别的,确保该用户不克不及拜候他上传到jail的可履行文件。