什麼是chroot

CHROOT就是Change Root,也就是改變程式執行時所參考的根目錄位置。 通常的目錄架構: 

/bin 
/sbin 
/usr/bin 
/homeshell

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。tcp

所以咱們必須先修改/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了。ide

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。oop

(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。ui

* 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權限。spa

* 結論: code

CHROOT能夠增進系統的安全性,限制使用者能作的事,可是CHROOT Is Not Everything,由於仍是有其餘的漏洞等著hacker來找出來。 
相關文章
相關標籤/搜索