永遠的UNIX 什麼是CHROOT?

2021-04-15 05:42:14 字數 4391 閱讀 6879

* 什麼是chroot?

chroot就是change root,也就是改變程式執行時所參考的根目錄位置。

一般的目錄架構:

/ /bin

/sbin

/usr/bin

/home

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。

因此我們必須先修改/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

的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) 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等等都可以一併解決。

* 其他必須考慮的問題:

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。

* 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許可權。

* 結論:

chroot可以增進系統的安全性,限制使用者能做的事,

但是chroot is not everything,因為還是有其他的

漏洞等著hacker來找出來。

本文**

UNIX 什麼是程序

對於乙個程式來說,他的被程式設計師寫好,通過編譯,就會以可執行檔案存放在磁碟了,他的存放格式elf格式,可能是二進位制檔案,也有可能是文字檔案,當使用者要使用程式時,就會通過系統的shell終端去執行命令,所以說程式時個靜態的特性,他是儲存在磁碟上的許多指令的有序集合,沒有執行的概念。而對於程序來說...

什麼是 Unix 以及它為什麼這麼重要?

大多數作業系統可以被劃分到兩個不同的家族。除了微軟的基於windows nt的作業系統外,幾乎所有其他的都可以追溯到unix。linux,mac os x,android,ios,chrome os,playstaion 4上執行的orbis os,執行在路由器上的各種韌體,所有這些作業系統通常都被...

UNIX 什麼是IPC物件以及共享記憶體

sys v 的ipc 物件 對於核心中建立的檔案物件,就是檔案識別符號 它引用了檔案物件的全部資訊 在程序中檔案描述符一般使用當前最小可用值。對於ipc識別符號返回的是索引的整數值,它是全域性變數的流水號,在系統中唯一分配的,若果在建立的ipc物件沒有關閉,他會全域性存在,只有在系統關閉的時候才關閉...