Chinaunix首页 | 论坛 | 博客
  • 博客访问: 613337
  • 博文数量: 66
  • 博客积分: 4015
  • 博客等级: 上校
  • 技术积分: 1667
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-30 11:18
文章分类

全部博文(66)

文章存档

2010年(1)

2008年(65)

我的朋友

分类: LINUX

2008-05-05 21:09:50

* 什麼是CHROOT? *什么是CHROOT?

CHROOT就是Change Root,也就是改變程式執行時所參考的根目錄位置。 CHROOT就是ChangeRoot,也就是改变程式执行时所参考的根目录位置。

一般的目錄架構: 一般的目录架构:
/
/bin
/sbin
/usr/bin
/home

CHROOT的目錄架構: CHROOT的目录架构:
/hell/
/hell/bin
/hell/usr/bin
/hell/home


* 為何要CHROOT? *为何要CHROOT?

1.限制被CHROOT的使用者所能執行的程式,如SetUid的程式,或是會造成 1.限制被CHROOT的使用者所能执行的程式,如SetUid的程式,或是会造成
Load 的 Compiler等等。 Load的Compiler等等。
2.防止使用者存取某些特定檔案,如/etc/passwd。 2.防止使用者存取某些特定档案,如/etc/passwd。
3.防止入侵者/bin/rm -rf /。 3.防止入侵者/bin/rm-rf/。
4.提供Guest服務以及處罰不乖的使用者。 4.提供Guest服务以及处罚不乖的使用者。
5.增進系統的安全。 5.增进系统的安全。

*  要如何建立CHROOT的環境? *要如何建立CHROOT的环境?
1.chroot()這個function: 1.chroot()这个function:
chroot(PATH)這個function必須具有 root 的身份才能執行,執行後會 chroot(PATH)这个function必须具有root的身份才能执行,执行后会
將跟目錄切換到 PATH 所指定的地方。 将跟目录切换到PATH所指定的地方。
2.login的過程: 2.login的过程:
使用者無論是從console或是telnet進入,都必須執行/usr/bin/login來 使用者无论是从console或是telnet进入,都必须执行/usr/bin/login来
決定是否能進入系統,而login所做的動作大致是: 决定是否能进入系统,而login所做的动作大致是:
(1)印出login的提示符號,等待使用者輸入密碼。 (1)印出login的提示符号,等待使用者输入密码。
(2)檢查密碼是否正確,錯誤的話回到(1)。 (2)检查密码是否正确,错误的话回到(1)。
(3)正確的話以setuid()來改變身份為login_user。 (3)正确的话以setuid()来改变身份为login_user。
(4)以exec()執行user的shell。 (4)以exec()执行user的shell。
因此我們必須先修改/usr/bin/login的source code,讓login在(2)到(3) 因此我们必须先修改/usr/bin/login的sourcecode,让login在(2)到(3)
的中間執行chroot($CHROOT_PATH)的動作,已達到CHROOT的目的,並以修 的中间执行chroot($CHROOT_PATH)的动作,已达到CHROOT的目的,并以修
改過的login替代原先的/usr/bin/login。 改过的login替代原先的/usr/bin/login。
(5)稍微好一點的方法必須在做chroot()之前檢查login (5)稍微好一点的方法必须在做chroot()之前检查login
user的group,如果有某個特定的group(如chrootgrp) user的group,如果有某个特定的group(如chrootgrp)
才執行chroot(),不然所有的人都會被chroot了。 才执行chroot(),不然所有的人都会被chroot了。

3.建立CHROOT所需的環境: 3.建立CHROOT所需的环境:
(1)必須具備的目錄:(假設$CHROOT為希望建立的路徑) (1)必须具备的目录:(假设$CHROOT为希望建立的路径)
$CHROOT/etc  $CHROOT/lib  $CHROOT/bin $CHROOT/etc$CHROOT/lib$CHROOT/bin
$CHROOT/sbin $CHROOT/usr/lib  $CHROOT/usr/bin $CHROOT/sbin$CHROOT/usr/lib$CHROOT/usr/bin
$CHROOT/usr/bin $CHROOT/usr/local  $CHROOT/home $CHROOT/usr/bin$CHROOT/usr/local$CHROOT/home
(2)仔細審查/etc中的檔案,需具備執行程式時所需的檔 (2)仔细审查/etc中的档案,需具备执行程式时所需的档
案,如passwd,groups,hosts,resolv.conf等等。 案,如passwd,groups,hosts,resolv.conf等等。
(3)拿掉不想給的執行檔,如su,sudo等SetUid的程式, (3)拿掉不想给的执行档,如su,sudo等SetUid的程式,
以及compiler甚至telnet。 以及compiler甚至telnet。
(4)測試一下,以root身份執行  chroot $CHROOT /bin/sh (4)测试一下,以root身份执行chroot$CHROOT/bin/sh
即可進入CHROOT環境中。 即可进入CHROOT环境中。 (man chroot for details) (manchrootfordetails)

4.在console或是以telnet進入試試。 4.在console或是以telnet进入试试。

5.Username/Password Resolve的考量: 5.Username/PasswordResolve的考量:
在CHROOT時你可能不希望被CHROOT的使用者(以後簡 在CHROOT时你可能不希望被CHROOT的使用者(以后简
稱CHROOTer)能拿到/etc/passwd或是/etc/shadow等檔 称CHROOTer)能拿到/etc/passwd或是/etc/shadow等档
案,尤其是有root密碼的。 案,尤其是有root密码的。 以下有三種情形: 以下有三种情形:
(1)/etc/passwd跟 $CHROOT/etc/passwd相同: (1)/etc/passwd跟$CHROOT/etc/passwd相同:
這是最差的作法,因為一來被CHROOTer有機會得到root 这是最差的作法,因为一来被CHROOTer有机会得到root
的encrypted password,二來要保持/etc/passwd及 的encryptedpassword,二来要保持/etc/passwd及
$CHROOT/etc/passwd的同步性是個大問題。 $CHROOT/etc/passwd的同步性是个大问题。 因為 因为
/usr/bin/login參考的是/etc/passwd,可是一旦 /usr/bin/login参考的是/etc/passwd,可是一旦
CHROOTer被chroot後執行passwd時,他所執行的 CHROOTer被chroot后执行passwd时,他所执行的
passwd所更改的將是$CHROOT/etc/passwd。 passwd所更改的将是$CHROOT/etc/passwd。
(2)/etc/passwd跟$CHROOT/etc/passwd不同: (2)/etc/passwd跟$CHROOT/etc/passwd不同:
你可以把$CHROOT/etc/passwd中的重要人物(如root) 你可以把$CHROOT/etc/passwd中的重要人物(如root)
的密碼拿掉,然後以比較複雜的方法修改 的密码拿掉,然后以比较复杂的方法修改
/usr/bin/login:
if (has_chroot_group) { if(has_chroot_group){
re-load $CHROOT/etc/passwd re-load$CHROOT/etc/passwd
if (password is valid) { if(passwordisvalid){
chroot($CHROOT)
exec(shell)
} else logout() }elselogout()
}
此法的好處是你可以將/etc/passwd跟 此法的好处是你可以将/etc/passwd跟
$CHROOT/etc/passwd分開來。 $CHROOT/etc/passwd分开来。 /etc/passwd只影響 /etc/passwd只影响
CHROOTer在login時所使用的username,其他如 CHROOTer在login时所使用的username,其他如
password甚至uid,gid,shell,home等等都是參 password甚至uid,gid,shell,home等等都是参
考$CHROOT/etc/passwd的。 考$CHROOT/etc/passwd的。
缺點是你其他的daemon如ftpd,httpd都必須做相同 缺点是你其他的daemon如ftpd,httpd都必须做相同
的修改才能正確取的CHROOTer的資訊,而且你在把一 的修改才能正确取的CHROOTer的资讯,而且你在把一
個user加入或移出chroot_group時都必須更改 个user加入或移出chroot_group时都必须更改
/etc/passwd跟$CHROOT/etc/passwd。 /etc/passwd跟$CHROOT/etc/passwd。

(3)使用NIS/YP: (3)使用NIS/YP:
此法大概是最簡單,且麻煩最少的了。 此法大概是最简单,且麻烦最少的了。 因為一切的user 因为一切的user
information都經過NIS Bind來取得,不但可以保護住 information都经过NISBind来取得,不但可以保护住
root的密碼,也省去/etc/passwd跟 root的密码,也省去/etc/passwd跟
$CHROOT/etc/passwd同步管理上的問題。 $CHROOT/etc/passwd同步管理上的问题。 不只是 不只是
passwd,連其他如groups,hosts,services, passwd,连其他如groups,hosts,services,
aliases等等都可以一併解決。 aliases等等都可以一并解决。

* 其他必須考慮的問題: *其他必须考虑的问题:
1.執行檔的同步性: 1.执行档的同步性:
再更新系統或是更新軟體時,必須考慮到一併更換 再更新系统或是更新软体时,必须考虑到一并更换
$CHROOT目錄下的檔案,尤其如SunOS或是BSD等會用 $CHROOT目录下的档案,尤其如SunOS或是BSD等会用
nlist()來取得Kernel Information的,在更新kernel nlist()来取得KernelInformation的,在更新kernel
時必須更新$CHROOT下的kernel。 时必须更新$CHROOT下的kernel。
2./dev的問題: 2./dev的问题:
一般而言你必須用local loopback NFS將/dev read- 一般而言你必须用localloopbackNFS将/devread-
write mount到$CHROOT/dev以使得一般user跟CHROOTer writemount到$CHROOT/dev以使得一般user跟CHROOTer
可以互相write以及解決devices同步性的問題。 可以互相write以及解决devices同步性的问题。
3./proc的問題: 3./proc的问题:
在Linux或是SYSV或是4.4BSD的系統上許多程式會去 在Linux或是SYSV或是4.4BSD的系统上许多程式会去
參考/proc的資料,你必須也將/proc mount到 参考/proc的资料,你必须也将/procmount到
$CHROOT/proc。
4./var的問題: 4./var的问题:
一般而言/var也是用local loopback NFS read-write 一般而言/var也是用localloopbackNFSread-write
mount到$CHROOT/var下,以解決spool同步性的問題, mount到$CHROOT/var下,以解决spool同步性的问题,
否則你可能必須要修改lpd或是sendmail等daemon, 否则你可能必须要修改lpd或是sendmail等daemon,
不然他們是不知道$CHROOT/var下也有spool的存在。 不然他们是不知道$CHROOT/var下也有spool的存在。
5.Daemon的問題: 5.Daemon的问题:
你必須修改一些跟使用者相關的Daemon如ftpd,httpd 你必须修改一些跟使用者相关的Daemon如ftpd,httpd
以使這些daemon能找到正確的user home。 以使这些daemon能找到正确的userhome。

* CHROOT無法解決的安全問題: *CHROOT无法解决的安全问题:
1.不小心或是忘記拿掉SetUid的程式: 1.不小心或是忘记拿掉SetUid的程式:
CHROOTer還是有機會利用SetUid的程式來取得root的 CHROOTer还是有机会利用SetUid的程式来取得root的
權限,不過因為你已經將他CHROOT了,所以所能影響到 权限,不过因为你已经将他CHROOT了,所以所能影响到
的只有$CHROOT/目錄以下的檔案,就算他來個 的只有$CHROOT/目录以下的档案,就算他来个
"/bin/rm -rf /" 也不怕了。 "/bin/rm-rf/"也不怕了。
不過其他root能做的事還是防不了,如利用tcpdump來 不过其他root能做的事还是防不了,如利用tcpdump来
竊聽該localnet中的通訊並取得在該localnet上其他 窃听该localnet中的通讯并取得在该localnet上其他
機器的帳號密碼,reboot機器,更改NIS的資料,更改 机器的帐号密码,reboot机器,更改NIS的资料,更改
其他沒有被CHROOT的帳號的密碼藉以取得一般帳號(所 其他没有被CHROOT的帐号的密码借以取得一般帐号(所
以root不可加入NIS中)等等。 以root不可加入NIS中)等等。
(此時就必須藉由securetty或是login.access或是將 (此时就必须藉由securetty或是login.access或是将
wheel group拿出NIS來防止其login as root) wheelgroup拿出NIS来防止其loginasroot)
2.已載入記憶體中的Daemon: 2.已载入记忆体中的Daemon:
對於那些一開機就執行的程式如sendmail,httpd, 对于那些一开机就执行的程式如sendmail,httpd,
gopherd,inetd等等,如果這些daemon有hole(如 gopherd,inetd等等,如果这些daemon有hole(如
sendmail),那hacker只要破解這些daemon還是可以取 sendmail),那hacker只要破解这些daemon还是可以取
得root權限。 得root权限。

* 結論: *结论:
CHROOT可以增進系統的安全性,限制使用者能做的事, CHROOT可以增进系统的安全性,限制使用者能做的事,
但是CHROOT Is Not Everything,因為還是有其他的 但是CHROOTIsNotEverything,因为还是有其他的
漏洞等著hacker來找出來。 漏洞等着hacker来找出来。
阅读(1414) | 评论(0) | 转发(0) |
0

上一篇:tar 命令参数详解

下一篇:RSYNC 中文手册

给主人留下些什么吧!~~