发信人: zhcharles(小传) 
整理人: zhcharles(2002-01-30 15:13:22), 站内信件
 | 
 
 
 信人: raner (就要离开清华了...), 信区: Linux  
 标  题: Change Root 是什么?(转载)  
 发信站: BBS 水木清华站 (Mon Jun 29 11:15:01 1998)  
   
   
 来  源: freebsd.csie.nctu.edu.tw  
 档  名: 0/System/network/chroot(使用 70 埠)  
 标  题: Change Root 是什麽? (CHROOT)     - What is 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  
    的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来找出来。  
   
 --  
   
 By [email protected]  
 
 
 
 
 
  ---- ★ FreeBSD 版版斧 ★
  
 █████████  
 █┌─────┐█  
 █│zhcharles │█  
 █│FreeBSD 版│█  
 █│ 版 ★ 斧 │█   
 █│ 专 用 章 │█   
 █└─────┘█   
 █████████ 
  
     
 答之意,乃解问者之困也! 
    
 我无意将答案写得如何如何动听,只求能真正地解决您的问题! 
    
 小传 ( Charles Feng ) [email protected]   OICQ:17866295 
               | 
 
 
 |