注意,原标题是: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. 多云时代,海外微软Azure云与国内阿里云专线打通性能测试

    本文地址:http://www.cnblogs.com/taosha/p/6528730.html 在云计算的大时代,大型客户都有业务全球拓展的需求,考虑到成本,时间因素,一般都是选择云计算,现在云计 ...

  2. Xamarin.Forms+Prism(1)—— 开发准备

    本次随笔连载,主要用于记录本人在项目中,用Xamarin.Forms开发APP中所使用的第三方技术或一些技巧. 准备: 1.VS2017(推荐)或VS2015: 2.JDK 1.8以上: 3.Xama ...

  3. PHP7中我们应该学习会用的新特性

    PHP7于2015年11月正式发布,本次更新可谓是PHP的重要里程碑,它将带来显著的性能改进和新特性,并对之前版本的一些特性进行改进.本文小编将和大家一起来了解探讨PHP7中的新特性. 1. 标量类型 ...

  4. JS和CSS中引号的使用

        font-family属性值如果是英文可以不加引号,如果是中文按照CSS标准则应该加引号,但不加引号也没关系.比如:font-family:Arial,"宋体"," ...

  5. Weex的环境搭建以及集成到Android项目

    最近由于公司的需要,初步研究了Weex,Weex是阿里开发的一个web的框架,官方的介绍如下: Weex 是一套简单易用的跨平台开发方案,能以 web 的开发体验构建高性能.可扩展的 native 应 ...

  6. css系列:input的placeholder在safari下设置行高失效

    在项目中遇到input的placeholder在safari下设置行高失效的问题,问度娘后未得治原因,倒是有解决办法: 方法一:使用padding使提示文字居中,如果font-size:14px,UI ...

  7. JS - A*寻路

    算法核心 A*估值算法 寻路估值算法有非常多:常用的有广度优先算法,深度优先算法,哈夫曼树等等,游戏中用的比较多的如:A*估值 算法描述 对起点与终点进行横纵坐标的运算 代码实现 start: 起点坐 ...

  8. extj6.0写增删查改(1)-------查询

    本文主要实现的效果是:点击查询按钮,根据form中的条件,在Grid中显示对应的数据(如果form为空,显示全部数据) 一.静态页面 1.查询按钮 { text:'查询', handler: 'onS ...

  9. 简谈-如何使用Python和R组合完成任务

    概述 和那些数据科学比赛不同,在真实的数据科学中,我们可能更多的时间不是在做算法的开发,而是对需求的定义和数据的治理.所以,如何更好的结合现实业务,让数据真正产生价值成了一个更有意义的话题. 数据科学 ...

  10. 使用validator-api来验证spring-boot的参数

    作为服务端开发,验证前端传入的参数的合法性是一个必不可少的步骤,但是验证参数是一个基本上是一个体力活,而且冗余代码繁多,也影响代码的可阅读性,所以有没有一个比较优雅的方式来解决这个问题? 这么简单的问 ...