⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000000.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -