荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: zzt (我命由我不由天), 信区: Linux
标  题: chroot [转]
发信站: BBS 荔园晨风站 (Wed Jun  7 08:23:37 2000), 转信

【 以下文字转载自 zzt 的信箱 】
【 原文由 zzt.bbs@flanker.uestc.edu.cn 所发表 】
发信人: bclz (准备回家....), 信区: Linux
标  题: chroot [转]
发信站: 一网深情 (Thu Jul 15 23:15:58 1999), 转信


                            作者: jdli@csie.nctu.edu.tw


      =====================================
      这是上某堂网路管理课程要 present 时,
      花了两个小时虎烂出来的结果,
      大概不是很详细,将就看看就好。
      这是从 Word 转过来的,格式懒得排了。
      =====================================

      * 什麽是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来找出来。

--

           执子之手,与子谐老。

※ 来源:.一网深情 bbs.uestc.edu.cn.[FROM: 202.115.16.23]
--
※ 转寄:.一网深情 bbs.uestc.edu.cn.[FROM: 210.39.3.50]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.11]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店