chroot

CHROOT就是Change Root,也就是改变程序执行时所参考的根目录位置。CHROOT可以增进系统的安全性,限制使用者能做的事。
基础资料
  • 外文名:Change Root
  • 别名:Change Root
  • 简介

    目录架构

    /bin

    /sbin

    /usr/bin

    /home

    或

    /hell/

    /hell/bin

    /hell/usr/bin

    /hell/home

    作用

    1.限制被CHROOT的使用者所能执行的程式,如SetUid的程式,或是会造成 Load 的Compiler等等。

    2.防止使用者存取某些特定档案,如/etc/passwd。

    3.防止入侵者/bin/rm -rf /。

    4.提供Guest服务以及处罚不乖的使用者。

    5.增进系统的安全。

    建立环境

    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.执行档的同步性:

    再更新系统或是更新软体时,必须考虑到一并更换$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。

    安全问题

    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来找出来。

    首页
    科技
    #贵族
    最新入驻
    贾科莫·普契尼
    Caroline Lufkin
    翁建宇
    相关阅读
    可重入函数
    内容词条·2451人浏览
    prefix
    内容词条·5220人浏览
    DBD
    内容词条·4649人浏览
    text-decoration
    内容词条·1046人浏览
    OSPF路由协议
    内容词条·2442人浏览
    华为U8800
    内容词条·3139人浏览
    • 网站地图
    • |

    Copyright 2023 fuwu029.com赣ICP备2022008914号-4