Linux虚拟化——Chroot监狱

什么是chroot监狱?

null

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

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

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

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

   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。

为“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命令的位置。运行哪个命令后,将这些二进制文件复制到我们监狱的“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.复制适当的库/对象 :对于我们数据库中的可执行文件 监禁 目录要工作,我们需要在被监禁的目录中复制适当的库/对象。默认情况下,可执行文件会查看以“/”开头的位置。为了找到依赖项,我们使用命令“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/

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

Chroot Jail

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

这可能是由于两个原因,要么文件不存在(这很明显),要么加载库失败或不可用。再次检查库是否位于正确位置。

6.必须弹出一个新外壳: 这是我们的监狱狂欢。我们目前只安装了两个命令,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的一个简单子进程运行。囚禁环境中的所有进程都是主机操作系统中简单的用户级进程,并且由内核提供的名称空间隔离,因此开销最小,并且作为一个额外的好处,我们获得了隔离。

此处解释的监禁bash目录副本可从以下网站下载: 在这里 .

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

关于chroot和目录的监禁,你只需要知道这些。我们的最终目标是了解什么是容器,以及AWS(Amazon Web services)、Google Cloud和Docker等服务如何能够按需提供如此多的虚拟操作系统实例。另外,sys admin如何在一台物理机器上为多个域运行多个web服务器。这只是理解它的一步

参考资料:

关于作者: 平克什·巴贾提亚 来自印度海得拉巴。他本质上是个极客,有很多值得寻找的项目。他的项目工作可见一斑 在这里

如果你也想在这里展示你的博客,请参见 吉微博 在Geeksforgek上写客博。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享