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年,Sun微系统在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客户端