[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 系統管理 > 其它 > 正文
什是CHROOT?
jdli@csie.nctu.edu.tw (2001-04-16 13:51:59)
* 什是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 jdli@csie.nctu.edu.tw

(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章

======
 

★  樊強制作 歡迎分享  ★