Linux虚拟化– Chroot jail详细介绍和实现过程

2021年3月15日09:21:41 发表评论 1,248 次浏览

什么是chroot jail

Unix操作系统上的chroot是更改当前正在运行的进程及其子进程的表观根目录的操作。在此修改后的环境中运行的程序无法访问指定目录树之外的文件。这从本质上限制了他们对目录树的访问, 因此他们被称为" chroot jail"。

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

为什么需要它, 它与虚拟机有何不同?

这是操作系统级别的虚拟化, 通常用于代替虚拟机来创建主机OS的多个隔离实例。与作为应用程序层虚拟化的虚拟机相比, 这是内核级虚拟化, 几乎没有开销, 因此, 它为在同一硬件上创建多个隔离实例提供了非常好的方法。虚拟机(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"命令创建迷你jail的步骤

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

$ mkdir jailed
  $ cd jailed

2.创建所有基本目录以运行命令:根据你的操作系统, 所需的目录可能会更改。从逻辑上讲, 我们创建所有这些目录以保留所需库的副本。要查看所有目录都需要什么, 请参阅步骤4。

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

3.运行"哪个"命令:运行"哪个"命令以找到ls和bash命令的位置。 运行哪个命令后,  将这些二进制文件复制到我们jail的" bin"目录中。确保你没有任何这些别名的命令。从现在开始, 我们将目录称为"入狱"目录, 以方便使用。

$ 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目录中复制适当的库/对象。默认情况下, 可执行文件查看以" /"开头的位置。要找到依赖项, 我们使用命令" 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-liux-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/

最终目录结构必须与此类似,

Chroot jail

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

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

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

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

这可能是由于两个原因造成的, 要么文件不存在(显而易见), 要么加载库失败或不可用。仔细检查这些库是否位于正确的位置。

6.必须弹出一个新的shell:它是我们的jail猛击。当前, 我们仅安装了2个命令bash和ls。幸运的是, cd和pwd是bash shell中的内置命令, 因此你也可以使用它们。

在目录中漫游, 尝试访问" cd /../"或类似名称。尝试打破jail, 可能你将无法做到。 🙂

要退出jail,

$ exit

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

$ ps aux

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

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

有趣的是, 被监禁的shell中的进程作为该shell的简单子进程运行。 JAILED环境内部的所有进程都是主机OS中的简单用户级进程, 并由内核提供的名称空间隔离, 因此开销最小, 并且获得了额外的好处, 即可以隔离。

可以从以下位置下载此处解释的jailed-bash目录的副本:这里.

同样, 你可以向虚拟监禁环境中添加更多命令。要添加更复杂的程序, 你可能需要创建更多目录, 例如" / proc"和" / dev"。这些增加了过程的复杂性。希望我们不需要出于我们的目的。

这就是你需要了解的有关chroot和目录管理的全部信息。我们的最终目标是了解什么是容器, 以及AWS(Amazon Web Services), Google Cloud和Docker等服务如何能够按需提供如此多的操作系统虚拟实例。此外, sys-admin如何在一台物理计算机上为多个域运行多个Web服务器。这只是了解它的一步one

参考文献:

  • https://help.ubuntu.com/community/DebootstrapChroot
  • https://wiki.archlinux.org/index.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.php/change_root

如果你还希望在此处展示你的博客, 请参阅日志用于在lsbin上撰写访客博客。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: