什么是CHROOT

CHROOT就是Change Root,也就是改变程式执行时所参考的根目录位置。 一般的目录架构:
/
/bin
/sbin
/usr/bin
/home

CHROOT的目录架构:
/hell/
/hell/bin
/hell/usr/bin
/hell/home
* 为何要CHROOT?

1.限制被CHROOT的使用者所能执行的程式,如SetUid的程式,或是会造成Load的Compiler等等。
2.防止使用者存取某些特定档案,如/etc/passwd。
3.防止入侵者/bin/rm -rf /。
4.提供Guest服务以及处罚不乖的使用者。
5.增进系统的安全。

* 要如何建立CHROOT的环境?
1.chroot()这个function:
chroot(PATH)这个function必须具有root的身份才能执行,执行後会将跟目录切换到PATH 所指定的地方。
2.login的过程:
使用者无论是从console或是telnet进入,都必须执行/usr/bin/login来决定是否能进入系统,而login所做的动作大致是:
(1)印出login的提示符号,等待使用者输入密码。
(2)检查密码是否正确,错误的话回到(1)。
(3)正确的话以setuid()来改变身份为login_user。
(4)以exec()执行user的shell。

因此我们必须先修改/usr/bin/login的source code,让login在(2)到(3)的中间执行chroot($CHROOT_PATH)的动作,已达到CHROOT的目的,并以修改过的login替代原先的/usr/bin/login。
(5)稍微好一点的方法必须在做chroot()之前检查login user的group,如果有某个特定的group(如chrootgrp)才执行chroot(),不然所有的人都会被chroot了。

3.建立CHROOT所需的环境:
(1)必须具备的目录:(假设$CHROOT为希望建立的路径)
$CHROOT/etc $CHROOT/lib $CHROOT/bin
$CHROOT/sbin $CHROOT/usr/lib $CHROOT/usr/bin
$CHROOT/usr/bin $CHROOT/usr/local $CHROOT/home
(2)仔细审查/etc中的档案,需具备执行程式时所需的档案,如passwd,groups,hosts,resolv.conf等等。
(3)拿掉不想给的执行档,如su,sudo等SetUid的程式,以及compiler甚至telnet。
(4)测试一下,以root身份执行 chroot $CHROOT /bin/sh即可进入CHROOT环境中。(man chroot for details)
4.在console或是以telnet进入试试。
5.Username/Password Resolve的考量:
在CHROOT时你可能不希望被CHROOT的使用者(以後简称CHROOTer)能拿到/etc/passwd或是/etc/shadow等档案,尤其是有root密码的。以下有三种情形:
(1)/etc/passwd跟 $CHROOT/etc/passwd相同:这是最差的作法,因为一来被CHROOTer有机会得到root的encrypted password,二来要保持/etc/passwd及$CHROOT/etc/passwd的同步性是个大问题。因为/usr/bin/login参考的是/etc/passwd,可是一旦CHROOTer被chroot後执行passwd时,他所执行的passwd所更改的将是$CHROOT/etc/passwd。
(2)/etc/passwd跟$CHROOT/etc/passwd不同:
你可以把$CHROOT/etc/passwd中的重要人物(如root)的密码拿掉,然後以比较复杂的方法修改
/usr/bin/login:
if (has_chroot_group) {
re-load $CHROOT/etc/passwd
if (password is valid) {
chroot($CHROOT)
exec(shell)
} else logout()
}
此法的好处是你可以将/etc/passwd跟$CHROOT/etc/passwd分开来。/etc/passwd只影响CHROOTer在login时所使用的username,其他如
password甚至uid,gid,shell,home等等都是参考$CHROOT/etc/passwd的。
缺点是你其他的daemon如ftpd,httpd都必须做相同的修改才能正确取的CHROOTer的资讯,而且你在把一个user加入或移出chroot_group时都必须更改/etc/passwd跟$CHROOT/etc/passwd。

(3)使用NIS/YP:
此法大概是最简单,且麻烦最少的了。因为一切的user information都经过NIS Bind来取得,不但可以保护住root的密码,也省去/etc/passwd跟
$CHROOT/etc/passwd同步管理上的问题。不只是passwd,连其他如groups,hosts,services,aliases等等都可以一并解决。

* 其他必须考虑的问题:
1.执行档的同步性:
再更新系统或是更新软体时,必须考虑到一并更换$CHROOT目录下的档案,尤其如SunOS或是BSD等会用nlist()来取得Kernel Information的,在更新kernel时必须更新$CHROOT下的kernel。
2./dev的问题:
一般而言你必须用local loopback NFS将/dev read-write mount到$CHROOT/dev以使得一般user跟CHROOTer可以互相write以及解决devices同步性的问题。
3./proc的问题:
在Linux或是SYSV或是4.4BSD的系统上许多程式会去参考/proc的资料,你必须也将/proc mount到$CHROOT/proc。
4./var的问题:
一般而言/var也是用local loopback NFS read-write mount到$CHROOT/var下,以解决spool同步性的问题,否则你可能必须要修改lpd或是sendmail等daemon,不然他们是不知道$CHROOT/var下也有spool的存在。
5.Daemon的问题:
你必须修改一些跟使用者相关的Daemon如ftpd,httpd以使这些daemon能找到正确的user home。

* CHROOT无法解决的安全问题:
1.不小心或是忘记拿掉SetUid的程式:
CHROOTer还是有机会利用SetUid的程式来取得root的权限,不过因为你已经将他CHROOT了,所以所能影响到的只有$CHROOT/目录以下的档案,就算他来个"/bin/rm -rf /" 也不怕了。
不过其他root能做的事还是防不了,如利用tcpdump来窃听该localnet中的通讯并取得在该localnet上其他机器的帐号密码,reboot机器,更改NIS的资料,更改其他没有被CHROOT的帐号的密码藉以取得一般帐号(所以root不可加入NIS中)等等。
(此时就必须藉由securetty或是login.access或是将wheel group拿出NIS来防止其login as root)
2.已载入记忆体中的Daemon:
对於那些一开机就执行的程式如sendmail,httpd,gopherd,inetd等等,如果这些daemon有hole(如sendmail),那hacker只要破解这些daemon还是可以取得root权限。

* 结论:
CHROOT可以增进系统的安全性,限制使用者能做的事,但是CHROOT Is Not Everything,因为还是有其他的漏洞等著hacker来找出来。

时间: 2024-12-03 23:06:39

什么是CHROOT的相关文章

浅析在FreeBSD中建立chroot的FTP服务

1.准备基本的chroot环境 在进入chroot环境之前要先准备好相应的设置,在本例中我们打算将ftpd chroot到/var/chroot目录中. 因为系统自带的ftpd在/usr/libexec/目录,所以我们需要在/var/chroot中执行以下操作: matthew@bsd# mkdir -p /var/chroot/usr/libexec 然后将ftpd复制到该目录中: matthew@bsd# install -C /usr/libexec/ftpd /var/chroot/us

在Ubuntu系统中配置chroot环境的教程

  你可能会有很多理由想要把一个应用.一个用户或者一个环境与你的 linux 系统隔离开来.不同的操作系统有不同的实现方式,而在 linux 中,一个典型的方式就是 chroot 环境. 在这份教程中,我会一步一步指导你怎么使用 chroot 命令去配置一个与真实系统分离出来的独立环境.这个功能主要可以用于测试项目,以下这些步骤都在 Ubuntu 14.04 虚拟专用服务器(VPS)上执行. 学会快速搭建一个简单的 chroot 环境是一项非常实用的技能,绝大多数系统管理员都能从中受益. Chr

Apache服务之Chroot环境设置

现在要安装Chroot环境了,为什么要安装Chroot环境呢?因为它安全,chroot可以把进程的根目录变成不是"/"目录的其他目录.这就意味着该进程被锁定到一个http://www.aliyun.com/zixun/aggregation/18564.html">虚拟文件系统的根中.如果你再适当地配置你的chroot jail,Apache和它的子进程(比如CGI脚本)将除于chroot jail环境之外不能访问其他任何东西.同时,非根进程也不能离开chroot ja

在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器

在 CentOS7.0 上搭建 Chroot 的 Bind DNS 服务器 BIND(Berkeley internet Name Daemon)也叫做NAMED,是现今互联网上使用最为广泛的DNS 服务器程序.这篇文章将要讲述如何在 chroot 监牢中运行 BIND,这样它就无法访问文件系统中除"监牢"以外的其它部分. 例如,在这篇文章中,我会将BIND的运行根目录改为 /var/named/chroot/.当然,对于BIND来说,这个目录就是 /(根目录). "jail

php chroot -改变根目录函数

chroot -改变根目录 描述 布尔的chroot (字符串$目录) 变化的根目录中的当前进程的目录. 此功能只适用于如果您的系统支持,而您使用CLI , CGI或嵌入的SAPI .另外,此功能需要root权限. 参数 目录 新目录 返回值 返回TRUE或FALSE的成功失败. 注 注:此功能是没有执行在Windows平台上.  新增附注拥有笔记 的chroot 没有用户的贡献说明这一页.

容器简史:从20世纪70年代的chroot到2016的Docker

本文讲的是容器简史:从20世纪70年代的chroot到2016的Docker[编者的话]作者主要介绍了从1979年到2013年容器的发展史. 今年三月份,Docker迎来了盛大的三周年庆典.Docker 回忆录展示了Docker是如何在我们眼前快速成长的. 尽管庆典已经结束,我将带你开启另一段旅程:在Docker开启容器大门之前虚拟化容器的历史.请走进我的时光机器,借助Wikipedia以及其他资源,让我们回到1979年,容器的概念被首次提出. 1979:Unix V7 1979年,我(作者)还

Linux / Unix:chroot 命令实例讲解

一个刚接触 Linux 和 Unix 的新手.我该如何改变一个命令的根目录?我要怎样改变一个进程的根目录呢,比如用 chroot 命令将web服务与文件系统隔离?我要如何使用 chroot 恢复密码或修复基于 Linux/Unix的受损坏的环境? 在 Linux和类 Unix 系统下每一个进程/命令的当前工作目录称之为进程/命令的根目录(译注:译者以为此处有误,实际上没有进行过chroot的进程,其根目录是系统的根目录,而不是其工作目录).你可以使用 chroot 命令改变一个命令的根目录,这最

利用jailkit-2.16.tar.gz + ssh 进行 chroot 操作[备忘]

目标  利用  jaikit 环境, 能够把某个目录虚拟成为 / ,  并且把远程用户限制在该目录中活动,与真正的系统 / 环境进行隔离 利用该环境能够避免开发人员过多地访问系统资源,增加系统安全性     1.      编译jailkit-2.16.tar.gz  ./configure && make && make install   2.      定义 /data作为数据存放区间, 笼环境专用分区 利用 sdb1 挂载 /data chown root:root

使用 chroot 监狱限制 SSH 用户访问指定目录

将 SSH 用户会话限制访问到特定的目录内,特别是在 web 服务器上,这样做有多个原因,但最显而易见的是为了系统安全.为了锁定 SSH 用户在某个目录,我们可以使用 chroot 机制. 在诸如 Linux 之类的类 Unix 系统中更改 root(chroot)是将特定用户操作与其他 Linux 系统分离的一种手段:使用称为 chrooted 监狱 的新根目录更改当前运行的用户进程及其子进程的明显根目录. 在本教程中,我们将向你展示如何限制 SSH 用户访问 Linux 中指定的目录.注意,