📄 00000000.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: raner (就要离开清华了...), 信区: Linux <BR>标 题: Change Root 是什么?(转载) <BR>发信站: BBS 水木清华站 (Mon Jun 29 11:15:01 1998) <BR> <BR> <BR>来 源: freebsd.csie.nctu.edu.tw <BR>档 名: 0/System/network/chroot(使用 70 埠) <BR>标 题: Change Root 是什麽? (CHROOT) - What is CHROOT? <BR> <BR>* 什麽是CHROOT? <BR> <BR>CHROOT就是Change Root,也就是改变程式执行时所参考的根目录位置。 <BR> <BR>一般的目录架构: <BR>/ <BR>/bin <BR>/sbin <BR>/usr/bin <BR>/home <BR> <BR>CHROOT的目录架构: <BR>/hell/ <BR>/hell/bin <BR>/hell/usr/bin <BR>/hell/home <BR> <BR> <BR>* 为何要CHROOT? <BR> <BR>1.限制被CHROOT的使用者所能执行的程式,如SetUid的程式,或是会造成 <BR> Load 的 Compiler等等。 <BR>2.防止使用者存取某些特定档案,如/etc/passwd。 <BR>3.防止入侵者/bin/rm -rf /。 <BR>4.提供Guest服务以及处罚不乖的使用者。 <BR>5.增进系统的安全。 <BR> <BR>* 要如何建立CHROOT的环境? <BR>1.chroot()这个function: <BR> chroot(PATH)这个function必须具有 root 的身份才能执行,执行後会 <BR> 将跟目录切换到 PATH 所指定的地方。 <BR>2.login的过程: <BR> 使用者无论是从console或是telnet进入,都必须执行/usr/bin/login来 <BR> 决定是否能进入系统,而login所做的动作大致是: <BR> (1)印出login的提示符号,等待使用者输入密码。 <BR> (2)检查密码是否正确,错误的话回到(1)。 <BR> (3)正确的话以setuid()来改变身份为login_user。 <BR> (4)以exec()执行user的shell。 <BR> 因此我们必须先修改/usr/bin/login的source code,让login在(2)到(3) <BR> 的中间执行chroot($CHROOT_PATH)的动作,已达到CHROOT的目的,并以修 <BR> 改过的login替代原先的/usr/bin/login。 <BR> (5)稍微好一点的方法必须在做chroot()之前检查login <BR> user的group,如果有某个特定的group(如chrootgrp) <BR> 才执行chroot(),不然所有的人都会被chroot了。 <BR> <BR>3.建立CHROOT所需的环境: <BR> (1)必须具备的目录:(假设$CHROOT为希望建立的路径) <BR> $CHROOT/etc $CHROOT/lib $CHROOT/bin <BR> $CHROOT/sbin $CHROOT/usr/lib $CHROOT/usr/bin <BR> $CHROOT/usr/bin $CHROOT/usr/local $CHROOT/home <BR> (2)仔细审查/etc中的档案,需具备执行程式时所需的档 <BR> 案,如passwd,groups,hosts,resolv.conf等等。 <BR> (3)拿掉不想给的执行档,如su,sudo等SetUid的程式, <BR> 以及compiler甚至telnet。 <BR> (4)测试一下,以root身份执行 chroot $CHROOT /bin/sh <BR> 即可进入CHROOT环境中。(man chroot for details) <BR> <BR>4.在console或是以telnet进入试试。 <BR> <BR>5.Username/Password Resolve的考量: <BR> 在CHROOT时你可能不希望被CHROOT的使用者(以後简 <BR> 称CHROOTer)能拿到/etc/passwd或是/etc/shadow等档 <BR> 案,尤其是有root密码的。以下有三种情形: <BR>(1)/etc/passwd跟 $CHROOT/etc/passwd相同: <BR> 这是最差的作法,因为一来被CHROOTer有机会得到root <BR> 的encrypted password,二来要保持/etc/passwd及 <BR> $CHROOT/etc/passwd的同步性是个大问题。因为 <BR> /usr/bin/login参考的是/etc/passwd,可是一旦 <BR> CHROOTer被chroot後执行passwd时,他所执行的 <BR> passwd所更改的将是$CHROOT/etc/passwd。 <BR>(2)/etc/passwd跟$CHROOT/etc/passwd不同: <BR> 你可以把$CHROOT/etc/passwd中的重要人物(如root) <BR> 的密码拿掉,然後以比较复杂的方法修改 <BR> /usr/bin/login: <BR> if (has_chroot_group) { <BR> re-load $CHROOT/etc/passwd <BR> if (password is valid) { <BR> chroot($CHROOT) <BR> exec(shell) <BR> } else logout() <BR> } <BR> 此法的好处是你可以将/etc/passwd跟 <BR> $CHROOT/etc/passwd分开来。/etc/passwd只影响 <BR> CHROOTer在login时所使用的username,其他如 <BR> password甚至uid,gid,shell,home等等都是参 <BR> 考$CHROOT/etc/passwd的。 <BR> 缺点是你其他的daemon如ftpd,httpd都必须做相同 <BR> 的修改才能正确取的CHROOTer的资讯,而且你在把一 <BR> 个user加入或移出chroot_group时都必须更改 <BR> /etc/passwd跟$CHROOT/etc/passwd。 <BR> <BR>(3)使用NIS/YP: <BR> 此法大概是最简单,且麻烦最少的了。因为一切的user <BR> information都经过NIS Bind来取得,不但可以保护住 <BR> root的密码,也省去/etc/passwd跟 <BR> $CHROOT/etc/passwd同步管理上的问题。不只是 <BR> passwd,连其他如groups,hosts,services, <BR> aliases等等都可以一并解决。 <BR> <BR>* 其他必须考虑的问题: <BR>1.执行档的同步性: <BR> 再更新系统或是更新软体时,必须考虑到一并更换 <BR> $CHROOT目录下的档案,尤其如SunOS或是BSD等会用 <BR> nlist()来取得Kernel Information的,在更新kernel <BR> 时必须更新$CHROOT下的kernel。 <BR>2./dev的问题: <BR> 一般而言你必须用local loopback NFS将/dev read- <BR> write mount到$CHROOT/dev以使得一般user跟CHROOTer <BR> 可以互相write以及解决devices同步性的问题。 <BR>3./proc的问题: <BR> 在Linux或是SYSV或是4.4BSD的系统上许多程式会去 <BR> 参考/proc的资料,你必须也将/proc mount到 <BR> $CHROOT/proc。 <BR>4./var的问题: <BR> 一般而言/var也是用local loopback NFS read-write <BR> mount到$CHROOT/var下,以解决spool同步性的问题, <BR> 否则你可能必须要修改lpd或是sendmail等daemon, <BR> 不然他们是不知道$CHROOT/var下也有spool的存在。 <BR>5.Daemon的问题: <BR> 你必须修改一些跟使用者相关的Daemon如ftpd,httpd <BR> 以使这些daemon能找到正确的user home。 <BR> <BR>* CHROOT无法解决的安全问题: <BR>1.不小心或是忘记拿掉SetUid的程式: <BR> CHROOTer还是有机会利用SetUid的程式来取得root的 <BR> 权限,不过因为你已经将他CHROOT了,所以所能影响到 <BR> 的只有$CHROOT/目录以下的档案,就算他来个 <BR> "/bin/rm -rf /" 也不怕了。 <BR> 不过其他root能做的事还是防不了,如利用tcpdump来 <BR> 窃听该localnet中的通讯并取得在该localnet上其他 <BR> 机器的帐号密码,reboot机器,更改NIS的资料,更改 <BR> 其他没有被CHROOT的帐号的密码藉以取得一般帐号(所 <BR> 以root不可加入NIS中)等等。 <BR> (此时就必须藉由securetty或是login.access或是将 <BR> wheel group拿出NIS来防止其login as root) <BR>2.已载入记忆体中的Daemon: <BR> 对於那些一开机就执行的程式如sendmail,httpd, <BR> gopherd,inetd等等,如果这些daemon有hole(如 <BR> sendmail),那hacker只要破解这些daemon还是可以取 <BR> 得root权限。 <BR> <BR>* 结论: <BR> CHROOT可以增进系统的安全性,限制使用者能做的事, <BR> 但是CHROOT Is Not Everything,因为还是有其他的 <BR> 漏洞等著hacker来找出来。 <BR> <BR>-- <BR> <BR>By <A HREF="mailto:jdli@csie.nctu.edu.tw">jdli@csie.nctu.edu.tw</A> <BR> <BR> <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.68.98] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -