移动安全 安全管理 应用案例 网络威胁系统安全 应用安全 数据安全 云安全
当前位置: 主页 > 信息安全 > 系统安全 >

若何利用chroot保障开源系统办事安然

时间:2013-12-24 11:26来源:TuZhiJiaMi企业信息安全专家 点击:
1、首要功能 在初期的UNIX系统中,根目次是文件系统中的一个固定点。在当前UNIX变体中,包含Linux,你可以在每个过程的根本上定义根目次。chroot合用法度法度承诺你用根目次(而非/)运行一个
Tags系统安全(735)系统服务(2)chroot(1)  

  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的可履行文件。

------分隔线----------------------------

推荐内容