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 上的客座博客写作。