📜  Linux 虚拟化 – Chroot Jail

📅  最后修改于: 2022-05-13 01:57:28.282000             🧑  作者: Mango

Linux 虚拟化 – Chroot Jail

什么是 chroot 监狱?

Unix 操作系统上的 chroot 是更改当前运行进程及其子进程的明显根目录的操作。在此修改后的环境中运行的程序无法访问指定目录树之外的文件。这实质上限制了他们对目录树的访问,因此他们获得了“chroot jail”的名称。

这个想法是您创建一个目录树,您可以在其中复制或链接进程运行所需的所有系统文件。然后,您使用 chroot 系统调用将根目录更改为位于此新树的底部,并启动在该 chroot 环境中运行的进程。由于它实际上无法引用修改后的根目录之外的路径,因此它无法恶意读取或写入这些位置。

为什么需要它,它与虚拟机有何不同?
这是操作系统级别的虚拟化,通常用于代替虚拟机来创建主机操作系统的多个隔离实例。这是一个内核级虚拟化,与虚拟机相比几乎没有开销,虚拟机是应用层虚拟化,因此它提供了一种在同一硬件上创建多个隔离实例的非常好的方法。虚拟机 (VM) 是机器的软件实现,它们经常利用所谓的硬件虚拟化来呈现工作操作系统的虚拟映像。

我如何使用它?
创建 chroot jail 的基本命令如下:



chroot /path/to/new/root command
                OR
   chroot /path/to/new/root /path/to/server
                OR
   chroot [options] /path/to/new/root /path/to/server

注意:只有 root/特权用户才能使用 chroot 系统调用。有权访问该命令的非特权用户可以绕过 chroot jail。

为“bash”和“ls”命令创建迷你监狱的步骤

1. 创建一个目录作为命令的根目录。

$ mkdir jailed
  $ cd jailed

2. 为要运行的命令创建所有必要的目录:根据您的操作系统,所需的目录可能会有所不同。从逻辑上讲,我们创建所有这些目录来保留所需库的副本。要查看所需的所有目录,请参阅步骤 4。

$ mkdir -p bin lib64/x86_64-linux-gnu lib/x86_64-linux-gnu

3.运行'which'命令:运行'which'命令查找ls和bash命令的位置。运行which命令后,将这些二进制文件复制到我们jail的'bin'目录中。确保您没有任何这些命令的别名。从现在开始,为了方便起见,我们将我们的目录称为“Jailed”目录。

$ unalias ls          # Required only if you have aliased ls command
  $ unalias bash        # Required only if you have aliased bash command
  $ cp $(which ls) ./bin/
  $ cp $(which bash) ./bin/

4. 复制适当的库/对象:为了让Jailed目录中的可执行文件正常工作,我们需要复制JAILED目录中的适当库/对象。默认情况下,可执行文件查看以“/”开头的位置。要查找依赖项,我们使用命令“ldd”

$ ldd $(which bash)
    linux-vdso.so.1 =>  (0x00007ffc75dd4000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6577768000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6577564000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f657719a000)
    /lib64/ld-linux-x86-64.so.2 (0x000055979f3fd000)

运行以下命令以创建适当的目录。

$ cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
$ cp /lib64/ld-linux-x86-64.so.2 lib64/

同样对于 ls,

$ ldd $(which ls)
    linux-vdso.so.1 =>  (0x00007fff4f05d000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f9a2fd07000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a2f93e000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f9a2f6cd000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9a2f4c9000)
    /lib64/ld-linux-x86-64.so.2 (0x000055e836c69000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9a2f2ac000)
$ cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/
$ cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
$ cp /lib64/ld-linux-x86-64.so.2  lib64/
$ cp /lib/x86_64-linux-gnu/libpthread.so.0 lib/x86_64-linux-gnu/

最终的目录结构一定是这样的,



克罗特监狱

5. Sudo chroot:运行此命令将根目录更改为 JAILED 目录,以及 shell 的路径。默认情况下,它会尝试加载 '/bin/sh' shell。

$  cd ..
  $  sudo chroot jailed /bin/bash

您在运行 chroot 命令时可能会遇到此错误,

chroot: failed to run command `/bin/bash': No such file or directory

这可能是由于 2 个原因,文件不存在(很明显),或者加载库失败或不可用。仔细检查库是否位于正确的位置。

6.一个新的shell必须弹出:它是我们被监禁的bash。我们目前只安装了 2 个命令,bash 和 ls。幸运的是 cd 和 pwd 是 bash shell 中的内置命令,因此您也可以使用它们。

在目录中漫游,尝试访问 'cd /../' 或类似的东西。尝试打破监狱,可能你做不到。 🙂

走出监狱,

$ exit

最重要和最有趣的部分是,当你跑步时,

$ ps aux

找到进程,你会发现只有一个进程,

root     24958  …  03:21   0:00 /usr/bin/sudo -E chroot jailed/ /bin/bash

有趣的是,被监禁的 shell 中的进程作为这个 shell 的一个简单的子进程运行。 JAILED 环境中的所有进程,只是主机操作系统中的简单用户级进程,并由内核提供的命名空间隔离,因此开销最小,并且作为额外的好处,我们获得了隔离。

此处解释的 jailed-bash-directory 副本可从此处下载。

同样,您可以向虚拟监狱环境添加更多命令。要添加更复杂的程序,您可能需要创建更多目录,例如“/proc”和“/dev”。这些增加了过程的复杂性。希望我们不需要它来达到我们的目的。

这就是您需要了解的有关 chroot 和目录监禁的全部信息。我们的最终目标是了解什么是容器,以及 AWS(亚马逊网络服务)、谷歌云和 Docker 等服务如何能够按需提供如此多的操作系统虚拟实例。另外,sys-admin 如何在一台物理机器上为多个域运行多个 Web 服务器。这只是了解它的一步🙂

参考:

  • https://help.ubuntu.com/community/DebootstrapChroot
  • https://wiki.archlinux.org/index.html PHP/Install_from_existing_Linux
  • http://serverfault.com/questions/162362/chroot-fails-cannot-run-command-bin-bash-no-such-file-or-directory
  • https://wiki.archlinux.org/index.html PHP/change_root

关于作者:
Pinkesh Badjatiya来自 IIIT 海得拉巴。他是个极客,拥有大量值得寻找的项目。他的项目工作可以在这里看到

如果您还想在这里展示您的博客,请参阅GBlog ,了解GeeksforGeeks 上的客座博客写作。