chroot jail
注意,原标题是: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):
- 为命令创建一个逻辑根目录并进入里面:
mkdir jailed
cd jailed
- 创建运行命令的所有必需目录:根据你的操作系统,所需的目录可能会更改。 逻辑上,我们创建所有这些目录来保存所需的库的副本。 要查看所需的所有目录,请参阅步骤4(根据步骤4,我的系统需要lib。bin这个是必须的就不用多说了吧?):
mkdir -p bin lib/
- 运行'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.
- 复制适当的库/对象(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的更多相关文章
- chroot 与 jail
所谓“监牢”就是指通过chroot机制来更改某个进程所能看到的根文件夹,即将某进程限制在指定文件夹中,保证该进程仅仅能对该文件夹及其子文件夹的文件有所动作,从而保证整个server的安全. 创建chr ...
- chroot详解
我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...
- ubuntu 14.04 下FTP服务器的搭建--锁定用户目录,解决vsftpd: refusing to run with writable root inside chroot()
FTP服务器的搭建,我要实现的需求是: 不允许匿名访问,因为我的机器不想让谁都能登录上来,随便获取文件, 需要锁定一个目录,因为在家里,我需要给媳妇下载一些电影 韩剧之类的东西,媳妇会来我机器下载,但 ...
- chroot 命令实例讲解
我是一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密 ...
- 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 ...
- centos chroot使用
chroot命令用来在指定的根目录下运行指令.chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以/,即是以根 (r ...
- 使用 chroot 建立沙盒环境
使用 chroot 建立沙盒环境 chroot 提供了更改当前进程及其子进程的可见根目录的操作,运行在此隔离环境中的应用程序无法访问新的目录树之外的文件和命令.这样的隔离环境称作 chroot 监狱( ...
- Stunnel服务端
Stunnel on Debian GNU/Linux 6 (squeeze) 传统的POP3, SMTP, Samba等服务,都是不加密的协议(即在网络上明文传输数据),通过stunnel,可以将访 ...
- linux运维中的命令梳理(四)
----------管理命令---------- ps命令:查看进程 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不 ...
随机推荐
- (iOS)开发中收集的小方法
1.颜色转变成图片 - (UIImage *)createImageWithColor:(UIColor *)color { CGRect rect = CGRectMake(0.0f, 0. ...
- Java设计模式面试题 01 - 六大原则
Java设计模式面试题 01 - 六大原则 1. 单一职责原则 Single Responsibility Principle SRP原则 分清职责,接口一定要做到单一职责,方法也要做到,类尽量做到 ...
- css 实现旋转八卦图
虽然这不算什么亮点,不过也可以供路上的小伙伴学习下 直接上干货: <!doctype html> <html lang="en"> <head> ...
- 爬虫入门系列(二):优雅的HTTP库requests
在系列文章的第一篇中介绍了 HTTP 协议,Python 提供了很多模块来基于 HTTP 协议的网络编程,urllib.urllib2.urllib3.httplib.httplib2,都是和 HTT ...
- Java关于e.printStackTrace()介绍
public void printStackTrace()将此 throwable 及其追踪输出至标准错误流.此方法将此 Throwable 对象的堆栈跟踪输出至错误输出流,作为字段 System.e ...
- nodejs 后台服务启动
最近一个项目微信小程序,需要写个小型的后端程序处理聊天通讯记录保存,主要是功能是组建群聊天室,所以用node写了个websocket服务... 但是终端连接到服务器,运行 node server.js ...
- node.js系列(实例):原生node.js+formidable模块实现简单的文件上传
/** * 原生node.js结合formidable模块实现图片上传改名 * @Author:Ghost * @Date:2016/07/15 * @description: * 1.引入模块htt ...
- Amazon Alexa登录授权(Android)
访问Alexa的API,必须要携带AccessToken,也就是必须要登录授权,本文主要记录Amazon Alexa在Android平台上的登录授权过程. 一.在亚马逊开发者平台注册应用 进入亚马逊开 ...
- 天方夜谈·数据结构·List
在战场上杀不死的敌人,永远也别想打败他,他就像幽灵横亘在你失败的田地上. 大一下学期,接触到Java程序设计语言,时至今日,才越发觉得知识与技术的海洋是多么多么的浩瀚.......如果说编程语言的一个 ...
- [CTSC1999]【网络流24题】星际转移
Description 由于人类对自然资源的消耗,人们意识到大约在2300 年之后,地球就不能再居住了.于是在月球上建立了新的绿地,以便在需要时移民.令人意想不到的是,2177 年冬由于未知的原因,地 ...