注意,原标题是:Linux Virtualization using Chroot Jail,我实在不知道怎么翻译,所以,自作主张,选了chroot jail作为标题。原文地址


chroot jail是什么?

在unix/类unix操作系统上,默认的根目录都是‘/’,而chroot就是为改变正在运行的进程(程序)以及它的进程(子程序)的根目录而生。假设,某个程序的根目录从原先的默认的系统根目录‘/’,被你修改到/home目录下,这个/home目录就变成这个程序的逻辑根目录,那么,这个被修改了根目录环境的程序,就不能进入这个逻辑根目录以外的路径。本质上,这就是限制某个程序所能进入的目录树,所以,被称为chroot监狱。(即chroot jail)。



因此,这个程序的活动范围就从本来的整个系统"/",到后来的逻辑根“/home”。


建立方法

通过创建一个目录(树),并且将程序运行时所需要的系统文件复制/链接到这个目录树里,就可以为程序设定chroot jail。之后,通过chroot系统调用,将程序默认的系统根目录切换到你刚刚创建的,并且具有程序运行环境的目录树中。因为程序不能访问目录树(即上文提到的逻辑根)以外的路径,所以,这就起到了保护系统,防止别人修改你系统文件的作用。通常,被用在ftp和Nginx等服务器中。简单来说,chroot jail就是将你限制在某个路径中,你所能访问的最大范围就是这个路径,所以,逻辑上,这个路径,就是你的根目录。

那么现在有一个问题:

chroot jail技术与虚拟机制有什么不同?

Chroot Jail是操作系统级别(Operating-system-level)的虚拟化技术,通常被用于在主机系统上创建多个相互独立的实例( instances)。和工作在应用层的虚拟机(Virtual Machines)相比,它是内核级别的虚拟化,几乎不占用的系统开销,所以在相同的硬件上,它比用虚拟机来创建多个独立实例(isolated instances)要好得多。虚拟机(VM)则是机器的软件实现,它们经常利用所谓的硬件虚拟化来呈现正在工作的操作系统的虚拟映像。


使用方法

创建chroot jail最基本的命令是(当然,现在这些命令还不能使用,还得将命令运行所需要的系统文件复制到/path/to/new/root下才行):

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

注意:只有有权限/root用户才能使用这个命令

说了那么就,现在我们就来为bash和ls命令(程序/进程)创建一个小监狱(mini-jail):

  1. 为命令创建一个逻辑根目录并进入里面:
mkdir jailed
cd jailed
  1. 创建运行命令的所有必需目录:根据你的操作系统,所需的目录可能会更改。 逻辑上,我们创建所有这些目录来保存所需的库的副本。 要查看所需的所有目录,请参阅步骤4(根据步骤4,我的系统需要lib。bin这个是必须的就不用多说了吧?):
mkdir -p bin lib/
  1. 运行'which'命令:运行'which'命令查找ls和bash命令的位置。 运行该命令后,将这些二进制文件复制到我们的jailed的'bin'目录中。 确保你这些命令没有任何别名。
unalias ls
unalias bash
cp $(which ls) ./bin/
cp $(which bash) ./bin/

这一步中,如果你的命令有别名,那么恭喜你,会发生下列情况:

cp: unrecognized option `--color=tty''
Try `cp --help' for more information.
  1. 复制适当的库/对象(libraries/objects):为了我们的Jailed目录中的可执行文件工作,我们需要复制相应的库/对象到JAILED目录中。默认情况下,可执行文件从'/'开始查找这些库/对象。 为了找到依赖关系,我们使用命令'ldd'。

    执行ldd $(which ls):
linux-gate.so.1 =>  (0x001f8000)
librt.so.1 => /lib/librt.so.1 (0x004bf000)
libacl.so.1 => /lib/libacl.so.1 (0x00464000)
libselinux.so.1 => /lib/libselinux.so.1 (0x004ca000)
libc.so.6 => /lib/libc.so.6 (0x00302000)
libpthread.so.0 => /lib/libpthread.so.0 (0x0048f000)
/lib/ld-linux.so.2 (0x002de000)
libattr.so.1 => /lib/libattr.so.1 (0x007d4000)
libdl.so.2 => /lib/libdl.so.2 (0x0045d000)
libsepol.so.1 => /lib/libsepol.so.1 (0x004e4000)

执行ldd $(which bash):

linux-gate.so.1 =>  (0x0011a000)
libtermcap.so.2 => /lib/libtermcap.so.2 (0x0748a000)
libdl.so.2 => /lib/libdl.so.2 (0x0045d000)
libc.so.6 => /lib/libc.so.6 (0x00302000)
/lib/ld-linux.so.2 (0x002de000)

运行下面的命令来创建适当的目录(这里我演示bash命令,ls命令操作一样):

cp /lib/libtermcap.so.2 lib/
cp /lib/libdl.so.2 lib/
cp /lib/libc.so.6 lib/
cp /lib/ld-linux.so.2 lib/

此时,应有下列文件结构:

.
|-- bin
| |-- bash
| `-- ls
`-- lib
|-- ld-linux.so.2
|-- libacl.so.1
|-- libattr.so.1
|-- libc.so.6
|-- libdl.so.2
|-- libpthread.so.0
|-- librt.so.1
|-- libselinux.so.1
|-- libsepol.so.1
`-- libtermcap.so.2

运行命令

到了这里,就是测试你前面努力成果的时刻了!!!

先试一下最基础的命令:chroot /path/to/new/root command:

再来,用chroot /root/jailed /bin/bash来弹出一个新的bash,在这了bash中,根目录就是原先的/root/jailed/目录:

chroot jail的更多相关文章

  1. chroot 与 jail

    所谓“监牢”就是指通过chroot机制来更改某个进程所能看到的根文件夹,即将某进程限制在指定文件夹中,保证该进程仅仅能对该文件夹及其子文件夹的文件有所动作,从而保证整个server的安全. 创建chr ...

  2. chroot详解

    我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...

  3. ubuntu 14.04 下FTP服务器的搭建--锁定用户目录,解决vsftpd: refusing to run with writable root inside chroot()

    FTP服务器的搭建,我要实现的需求是: 不允许匿名访问,因为我的机器不想让谁都能登录上来,随便获取文件, 需要锁定一个目录,因为在家里,我需要给媳妇下载一些电影 韩剧之类的东西,媳妇会来我机器下载,但 ...

  4. chroot 命令实例讲解

    我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...

  5. How to Setup Chroot SFTP in Linux (Allow Only SFTP, not SSH)

    1. Create a New Group Create a group called sftpusers. Only users who belong to this group will be a ...

  6. centos chroot使用

    chroot命令用来在指定的根目录下运行指令.chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以/,即是以根 (r ...

  7. 使用 chroot 建立沙盒环境

    使用 chroot 建立沙盒环境 chroot 提供了更改当前进程及其子进程的可见根目录的操作,运行在此隔离环境中的应用程序无法访问新的目录树之外的文件和命令.这样的隔离环境称作 chroot 监狱( ...

  8. Stunnel服务端

    Stunnel on Debian GNU/Linux 6 (squeeze) 传统的POP3, SMTP, Samba等服务,都是不加密的协议(即在网络上明文传输数据),通过stunnel,可以将访 ...

  9. linux运维中的命令梳理(四)

    ----------管理命令---------- ps命令:查看进程 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不 ...

随机推荐

  1. 移动开发必须要弄明白的问题】详解Eclipse转Android Studio

    2015-12-09 13:01:244264浏览3评论 AS出来一年多了,最近才从Eclipse转到AS,但我并不觉得使用Eclipse有多落后,它们都只是一个工具而已,哪个顺手就用哪个,用得好都能 ...

  2. Web性能优化工具WebPageTest(一)——总览与配置

    网站性能优化工具大致分为两类:综合类和RUM类(实时监控用户类),WebPageTest属于综合类. WebPageTest通过布置一些特定的场景进行测试,例如不同的网速.浏览器.位置等. 测试完成后 ...

  3. Felx布局(三)

    flex网格布局 平均分布 最简单的网格布局,就是平均分布.在容器里面平均分配空间,跟上面的骰子布局很像,但是需要设置项目的自动缩放

  4. 现代3D图形编程学习--opengl使用不同的缓存对象(译者添加)

    现代3D图形编程学习系列翻译地址 http://www.cnblogs.com/grass-and-moon/category/920962.html opengl使用不同的缓存对象 在设置颜色一章中 ...

  5. Css清除浮动最优方式之一

    ---恢复内容开始--- .container:before, .container:after { display: table; content: " "; } .contai ...

  6. 自定义TextView跑马灯

    本篇主要介绍TextView的可控制跑马灯效果实现. Android自带的TextView添加几个属性就可以实现跑马灯效果,大概是这样 android:ellipsize="marquee& ...

  7. LinkCode 整数排序II

    http://www.lintcode.com/zh-cn/problem/sort-integers-ii/ 题目 给一组整数,按照升序排序.使用归并排序,快速排序,堆排序或者任何其他 O(n lo ...

  8. C语言学习第六章

    今天开始尝试改变! 今天要学习函数,一个C语言中的重要组成部分. 首先先聊聊为什么要使用函数?随着学习的深入很多人会发现某段的代码重复使用的几率很大,而如果用一次写一次的话很明显的效率就会比较低,如果 ...

  9. 2017/4/27-Gradle的配置与Spring的下载

    Gradle的配置与Spring的下载 1.Gradle 1) 介绍 Gradle是一个基于Groovy的构建工具,类似Maven,但是比其更加简单轻便.它可以自动化地进行软件构建.测试.发布.部署. ...

  10. css 设置 checkbox复选框控件的对勾√样式

      效果 最终的样式,想要的效果:   我们要创建方框中的对勾,对于这一点,我们可以使用:after伪类创建一个新的元素,为了实现这个样式,我们可以创建一个5px * 15px的长方形并给他加上边框. ...