chroot用法详解

CHROOT就是Change Root,也就是改变程序执行时所参考的根目录位置。 

一般的目录架构: 

/bin 
/sbin 
/usr/bin 
/home 

CHROOT的目录架构: 
/hell/ 
/hell/bin 
/hell/usr/bin 
/hell/home 

* 为何要CHROOT/span> 

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

*  要如何建立CHROOT的环境/span> 
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来找出来。
 
 

通过Chroot机制让服务器安全到底

http://www.jmcresearch.com/projects/jail/
juanm.casillas@jmcresearch.comhttp://www.jmcresearch.com/projects/jail/
juanm.casillas@jmcresearch.com

CS入门技能树Linux入门初识Linux24975 人正在系统学习中

来源:suchy_sz

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年11月1日
下一篇 2016年11月1日

相关推荐