chroot
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沒有足夠能力去防禦一個擁有root特權的行程造成危害。
限制
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客户端
参见
- Unix实用程序列表
- 操作系统级虚拟化
- 沙盒 (计算机安全)
- sudo
参考
- . [2011-01-25]. (原始内容存档于2019-09-24).
外部链接
- : change root directory – FreeBSD系统调用(System Calls)手册页
- : change root directory – FreeBSD系统管理(System Manager's)手册页
- : change root directory – Linux程序员手册页 – 系统调用(System Calls)
- openroot - an extended chroot with X11 access, /dev & /media automounting & more.页面存档备份,存于