标题：chroot
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的encryptedpassword，二来要保持/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等等都可以一并解决。 
2.将阿帕奇设定在chroot环境下
建立/chroot目录 #mkdir /chroot 建立一些必需的子目录 #mkdir /chroot/dev #mkdir /chroot/lib #mkdir /chroot/etc #mkdir /chroot/bin #mkdir /chroot/usr #mkdir /chroot/usr/local 在我们的chroot建立/dev/null #mknod -m 666 /chroot/dev/null c 1 3 将阿帕奇拷贝到/chroot目录中 #cp -rp /usr/local/apache/ /chroot/usr/local 拷贝必需的二进制文件 #cp /bin/sh /chroot/bin 确定哪些库是必需的——这取决于你编译时内建了哪些模块 #ldd /usr/local/apache/bin/httpd 将需要的库拷贝到chroot目录 #cp /lib/libm.* /chroot/lib/ #cp /lib/libgdbm.* /chroot/lib #cp /lib/libdb.* /chroot/lib #cp /lib/libdl.* /chroot/lib #cp /lib/libc.* /chroot/lib 拷贝网络连接所需要的函数库 #cp /lib/libnss* /chroot/lib 拷贝必需的/etc下的文件到chroot #cp /etc/passwd /chroot/etc #cp /etc/shadow /chroot/etc #cp /etc/group /chroot/etc #cp /etc/resolv.conf /chroot/etc #cp /etc/hosts /chroot/etc #cp /etc/localtime /chroot/etc #cp /etc/localtime /chroot/etc #cp /etc/ld. so.* /chroot/etc [1]​
其他必须考虑的问题：
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 NFSread-writemount到$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来找出来。