Skip to content

34.1 Jail 基础

34.1.1 Jail 简史

Jail 原意为“监狱、监禁”,在 FreeBSD 术语中指一种基于 chroot 改进的容器隔离技术。Jail 的发音为 [dʒeɪl](英/美),发音接近汉语“杰尔”;“炸儿”为非标准发音。

容器技术的概念出现在 2000 年:Jail 技术于 1999 年提交到 FreeBSD 源代码树,随 2000 年 3 月发布的 FreeBSD 4.0 首次正式引入,实现了文件系统、进程空间和网络绑定的三重隔离。该技术可将 FreeBSD 系统分区为多个子系统(也称 Jail)。

2001 年,通过 Jacques Gélinas 的 VServer 项目,隔离环境的实施进入了 Linux 领域。此后,Linux 社区相继出现了 OpenVZ(2005 年)和 Google 工程师主导开发的 cgroups 资源控制机制(2006 年启动,2008 年合入 Linux 内核 2.6.24),以及首个通用的 Linux 容器项目 LXC(2008 年首次发布)。

2013 年 3 月,原名 dotCloud(2008 年成立于巴黎)的公司发布了 Docker 容器技术,同年 10 月将公司更名为 Docker Inc.。Docker 最初在 LXC 之上提供了更简洁的封装,后来发展出独立的容器运行时,极大地推动了现代容器技术的普及。

Jail 建立在 chroot(2) 的概念之上,chroot 用于更改一组进程的根目录。这种方式创建了一个与系统其余部分隔离的环境。在 chroot 环境中创建的进程无法直接访问其外部的文件或资源。因此,运行于 chroot 环境中的服务若遭攻破,攻击者通常难以借此攻破整个系统。

chroot 存在多种限制。它只适合简单任务,无法满足需较强灵活性或高级特性的复杂场景。人们发现了多种从 chroot 环境中逃逸的方法,它已不是保护服务安全的理想方案。

Jail 在多个方面改进了传统 chroot 环境的概念。

在传统 chroot 环境中,进程只在文件系统的可访问范围内受到限制。而系统的其他资源、系统用户、运行进程及网络子系统,则由 chroot 进程与宿主系统进程共享。Jail 扩展了这一模型,虚拟化了对文件系统、用户集合和网络子系统的访问。它提供了更细粒度的控制,用于调整 Jail 环境的访问权限。Jail 可视为一种操作系统级虚拟化技术。

34.1.1.1 参考文献

34.1.2 Jail 的类型

管理员可根据实际需求将 Jail 分为不同类型,尽管它们在底层技术上完全相同。各管理员须根据所要解决的问题来评估应创建哪种类型的 Jail。

以下列出了不同类型的 Jail、各自的特征,以及使用时须考量的事项。

对比维度厚 Jail(Thick Jail)瘦 Jail(Thin Jail)服务 Jail(Service Jail)
资源效率每个 Jail 独立包含完整基本系统,占用磁盘和内存较高共享宿主或模板系统,占用资源更少更高:不复制完整文件系统,仅隔离服务进程
部署速度需要复制完整系统,创建和启动较慢依赖共享系统,创建和启动更快更快:仅配置服务即可运行
维护方式每个 Jail 独立更新和维护宿主系统更新即可影响多个 Jail,维护集中极简:通常仅需 /etc/rc.conf 一行配置
资源共享基本无共享或共享较少共享库与二进制,磁盘缓存利用率更高完全共享宿主系统资源(库、二进制等)
隔离性隔离较强,各 Jail 环境独立隔离较弱,共享基础系统组件最弱:文件系统隔离度最低,但仍受 Jail 机制网络与进程限制
安全性单个 Jail 被攻破影响范围较小共享组件带来更大潜在影响范围风险最高:可能影响宿主系统整体
依赖管理每个 Jail 依赖独立,冲突较少多 Jail 共享环境,可能出现版本冲突无独立依赖管理,完全依赖宿主环境
兼容性环境完整一致,兼容性更稳定依赖宿主/模板环境,可能存在版本差异问题依赖宿主系统兼容性,灵活性最低

34.1.2.1 厚 Jail

厚 Jail 是 FreeBSD Jail 的传统形式。厚 Jail 在自身环境中复制一整套基本系统。即 Jail 拥有一套独立的 FreeBSD 基本系统实例,包括库、可执行文件和配置文件。可将厚 Jail 视为完整的独立 FreeBSD 安装实例,运行于宿主系统的控制之下。此种隔离确保 Jail 内部的进程与宿主系统及其他 Jail 相互独立。

34.1.2.2 瘦 Jail

瘦 Jail 使用 OpenZFS 快照或 NullFS 挂载,从模板中共享基本系统。每个瘦 Jail 只复制基本系统的最小子集,因此相比厚 Jail 消耗的资源更少,隔离性和独立性也较弱。共享组件的变动可能同时影响多个瘦 Jail。

34.1.2.3 服务 Jail

将 Jail 根路径直接指向宿主系统的某个子目录或根目录,即可实现 Jail 与宿主系统共享文件系统。这种配置不复制独立的基本系统,Jail 中的进程可直接访问宿主系统的库、二进制文件和配置文件,并与宿主系统共享相同的用户账户。Jail 内进程的根目录受 path 参数限制,chroot 的文件系统隔离依然存在,但 Jail 内部可见的文件与宿主机高度重合。此外,Jail 中的进程仍受 Jail 机制中网络隔离、进程可见性限制等其他安全机制的约束,但可配置为放开部分限制。此配置适用于无需了解服务或守护进程所需文件即可将其快速限制于 Jail 环境内运行的场景,配置极简,但必须充分认识其文件系统隔离性弱所带来的安全风险。

34.1.2.4 VNET Jail

FreeBSD 的 VNET jail 是一种虚拟化环境,允许隔离和控制 jail 中运行进程的网络资源。它通过为 jail 中的进程创建一个独立的网络协议栈,实现了高度的网络分段与安全性,从而确保 jail 中的网络流量不会与宿主系统或其他 jail 混合。

本质上,FreeBSD 的 VNET jail 增加了一套网络配置机制。即可作为厚 jail 或瘦 jail 创建 VNET jail。

34.1.2.5 Linux Jail

FreeBSD 的 Linux Jail 是 FreeBSD 操作系统中的一项功能,可在 jail 中运行 Linux 二进制文件和应用程序,参见其他相关章节。

34.1.3 Jail 管理工具概述

常见的 Jail 管理工具包括 Qjail 和 iocage,各有侧重。ezjail 曾是广泛使用的 Jail 管理工具,但目前已基本停止维护且不支持 VNET,不推荐用于新部署,仅存续于老旧系统的维护场景。

特性Qjailiocage
开发语言shPython
当前维护状态持续可用原仓库已归档,FreeBSD 项目持续维护
文件系统要求UFS / ZFS 均可必须 ZFS
是否依赖 ZFS
是否支持 UFS支持不支持
是否支持 VNET支持支持
网络隔离能力较强较强
配置方式Shell 脚本Python CLI
学习成本较高
快照/克隆能力有限强(依赖 ZFS)
资源占用很低较高
适合新部署推荐推荐(仅限 ZFS)
典型适用场景通用 Jail 管理大规模 ZFS Jail 环境
主要限制功能相对朴素强依赖 ZFS