chroot
此條目翻譯品質不佳。 (2021年1月22日) |
chroot是起源於Unix系統的一個操作,作用於正在運行的進程和它的子進程,改變它外顯的根目錄。一個運行在這個環境下,經由chroot設定根目錄的程序,它不能夠對這個指定根目錄之外的文件進行存取動作,不能讀取,也不能更改它的內容。chroot這一特殊表達可以指chroot(2)系統調用或chroot(8)應用程序。
由chroot創造出的那個根目錄,叫做「chroot監牢」(chroot jail,或chroot prison)。
歷史
[編輯]1979年,在開發Version 7 Unix時,chroot系統調用首次問世。1982年3月18日,在4.2BSD發布前17個月,比爾·喬伊(Bill Joy)將chroot機制移植到BSD系統上,主要用於測試安裝和構建系統。
1991年,威廉·齊斯韋克(William Cheswick)開發出第一個蜜罐程序,來監視入侵駭客的行動。他使用了chroot來進行實作,這是chroot最早被用於開發程序的先例,也因此,chroot創造出的根目錄空間,之後被人稱為軟件監牢(chroot jail)。
2000年,FreeBSD團隊,將原本chroot機制,導入虛擬化技術的概念,開發了新的jail系統命令,伴隨着FreeBSD 4.0版一同發布。
2004年,因為駭客開發出許多可以破解chroot機制的方法,出現了jailbreak這個術語。
2005年,昇陽電腦在Solaris系統上開發出Solaris Containers,稱它是吃了類固醇的chroot(chroot on steroids)。
2006年,Linux內核中開發出cgroups。2007年,被加到Linux 2.6.24版內核中。2008年,基於cgroups,開發出LXC,以及Docker。2013年被加入Linux 3.8版中。
應用
[編輯]應用chroot,可以創建並運行一個隔離的虛擬軟件系統拷貝。這對於以下應用是十分有用的:
- 測試和開發
- 可以經由chroot建立一個測試環境,用來測試軟件。這可以減少將軟件直接布署到整個生產系統中可能造成的風險。
- 依賴控制
- 可以在chroot建立的環境下,進行軟件開發,組建以及測試,只保留這個程序需要的軟件依賴。這可以避免在系統中預先安裝的各種軟件庫,影響到開發,造成軟件開發者在構建軟件時,可能遇到一些鏈接衝突。
- 兼容性
- 早期遺留軟件或使用不同應用二進制接口(ABI)的軟件,因為它們提供的軟件庫和宿主機的庫之間,可能發生名稱或鏈接衝突,可以在chroot環境下運行,以保持系統安全。
- 修復
- 當一個系統不能啟動時,可以使用chroot,先從另一個根文件系統(比如從安裝媒體,或是Live CD)下開機,之後再回到受損的環境中,重新修正系統。
- 特權分離
- 將允許開啟文件描述符(例如文件,管線或是網絡連接)的程序放到chroot下執行,不用特地將工作所需的文件,放到chroot路徑底下,這可以簡化軟件監牢的設計。chroot簡化了安全設計,可以創造出一個沙盒環境,來執行一個有潛在危險的特權程序,以預先防禦可能的安全漏洞。但值得注意的是,chroot沒有足夠能力去防禦一個擁有特權的路徑造成危害。
限制
[編輯]chroot機制的設計中,並不包括抵抗特權用戶(root)的蓄意篡改。在大多數的系統中,chroot環境沒有設計出適當的堆疊,所以一個在chroot下執行的程序,可能會通過第二次chroot來獲得足夠權限,逃出chroot的限制。為了減輕這種安全漏洞所帶來的風險,在使用chroot後,在chroot下執行的程序,應該儘快放棄root權限,或是改用其他機制來替代,例如FreeBSD jail。在某些操作系統中,例如FreeBSD,已經採取預防措施,來防止第二次chroot的攻擊[1]。
- 在支持設備節點的文件系統中,一個在chroot中的root用戶仍然可以創建設備節點和掛載在chroot根目錄的文件系統;儘管,chroot機制不是被打算用來阻止低特權用戶級訪問系統設備。
- 在啟動時,程序都期望能在某些預設位置找到scratch space,配置文件,設備節點和共享庫。為了使chroot能夠正常啟動,在運行chroot的目錄必須包含這些最基本的文件,這使得chroot難以作為一般的沙箱來使用。
- 只有root用戶可以執行chroot。這是為了防止用戶把一個setuid的程序放入一個特製的chroot監牢(例如一個有着假的/etc/passwd和/etc/shadow文件的chroot監牢)由於引起提權攻擊。
- chroot不是為限制資源的使用而設計,如I/O,帶寬,磁盤空間或CPU時間。大多數Unix系統都沒有以完全文件系統為導向,以即給可能通過網絡和過程控制,通過系統調用接口來提供一個破壞chroot的程序。
一些Unix系統提供擴展的chroot機制(一般稱為操作系統層虛擬化)用於解決上述部分限制。包括:
- AIX中的Workload Partitions
- Solaris中的Containers
- Linux下的Linux-VServer, FreeVPS和OpenVZ
- FreeBSD 中的Jails
- NetBSD和OpenBSD中的Sysjails
- DragonFly BSD中的DragonFly BSD jails
在chroot中使用圖形界面
[編輯]在chroot環境中使用圖形界面是可能的,參見以下幾個方案:
- xhost
- 使用內置像Xnest這樣的X服務,或現代一點的Xephyr(或者在監牢中啟動真正的X服務)
- 通過開啟X11轉發(X11 forwarding)的 SSH連接到chroot中(ssh -X)
- 當一個X服務啟動是設置為不監聽tcp端口或沒有可用的SSH服務器時,使用openroot
- 通過一個X11 VNC服務,鏈接到在外環境的VNC客戶端