Jail 基础
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 可视为一种操作系统级虚拟化技术
Jail 的类型
管理员可根据实际需求将 Jail 分为不同类型,尽管它们在底层技术上完全相同。各管理员须根据所要解决的问题来评估应创建哪种类型的 Jail
| 对比维度 | 厚 Jail(Thick Jail) | 瘦 Jail(Thin Jail) | 服务 Jail(Service Jail) |
| 资源效率 | 每个 Jail 独立包含完整基本系统,占用磁盘和内存较高 | 共享宿主或模板系统,占用资源更少 | 更高:不复制完整文件系统,仅隔离服务进程 |
| 部署速度 | 需要复制完整系统,创建和启动较慢 | 依赖共享系统,创建和启动更快 | 更快:仅配置服务即可运行 |
| 维护方式 | 每个 Jail 独立更新和维护 | 宿主系统更新即可影响多个 Jail,维护集中 | 极简:通常仅需 /etc/rc.conf 一行配置 |
| 资源共享 | 基本无共享或共享较少 | 共享库与二进制,磁盘缓存利用率更高 | 完全共享宿主系统资源(库、二进制等) |
| 隔离性 | 隔离较强,各 Jail 环境独立 | 隔离较弱,共享基础系统组件 | 最弱:文件系统隔离度最低,但仍受 Jail 机制网络与进程限制 |
| 安全性 | 单个 Jail 被攻破影响范围较小 | 共享组件带来更大潜在影响范围 | 风险最高:可能影响宿主系统整体 |
| 依赖管理 | 每个 Jail 依赖独立,冲突较少 | 多 Jail 共享环境,可能出现版本冲突 | 无独立依赖管理,完全依赖宿主环境 |
| 兼容性 | 环境完整一致,兼容性更稳定 | 依赖宿主/模板环境,可能存在版本差异问题 | 依赖宿主系统兼容性,灵活性最低 |
厚 Jail
厚 Jail 是 FreeBSD Jail 的传统形式。厚 Jail 在自身环境中复制一整套基本系统
- 即 Jail 拥有一套独立的 FreeBSD 基本系统实例,包括库、可执行文件和配置文件
- 可将厚 Jail 视为完整的独立 FreeBSD 安装实例,运行于宿主系统的控制之下
- 此种隔离确保 Jail 内部的进程与宿主系统及其他 Jail 相互独立
瘦 Jail
瘦 Jail 使用 OpenZFS 快照 或 NullFS 挂载,从模板中共享基本系统:
- 每个瘦 Jail 只复制基本系统的最小子集,因此相比厚 Jail 消耗的资源更少,隔离性和独立性也较弱
- 共享组件的变动可能同时影响多个瘦 Jail
服务 Jail
将 Jail 根路径 直接 指向 宿主系统的某个子目录或根目录 ,即可实现 Jail 与宿主系统共享文件系统:
- 这种配置不复制独立的基本系统,Jail 中的进程可直接访问宿主系统的库、二进制文件和配置文件,并与宿主系统共享相同的用户账户
- Jail 内进程的根目录受 path 参数限制,chroot 的文件系统隔离依然存在,但 Jail 内部可见的文件与宿主机高度重合
- 此外,Jail 中的进程仍受 Jail 机制中网络隔离、进程可见性限制等其他安全机制的约束,但可配置为放开部分限制
此配置适用于无需了解服务或守护进程所需文件即可将其快速限制于 Jail 环境内运行的场景,配置极简 但必须充分认识其文件系统隔离性弱所带来的安全风险
VNET Jail
FreeBSD 的 VNET jail 是一种虚拟化环境,允许隔离和控制 jail 中运行进程的网络资源
- 它通过为 jail 中的进程创建一个独立的网络协议栈,实现了高度的网络分段与安全性,从而确保 jail 中的网络流量不会与宿主系统或其他 jail 混合
本质上,FreeBSD 的 VNET jail 增加了一套网络配置机制。即可作为厚 jail 或瘦 jail 创建 VNET jail
Linux Jail
FreeBSD 的 Linux Jail 是 FreeBSD 操作系统中的一项功能,可在 jail 中运行 Linux 二进制文件和应用程序
Jail 管理工具
常见的 Jail 管理工具包括 Qjail 和 iocage,各有侧重
| 特性 | Qjail | iocage |
| 开发语言 | sh | Python |
| 当前维护状态 | 持续可用 | 原仓库已归档,FreeBSD 项目持续维护 |
| 文件系统要求 | UFS / ZFS 均可 | 必须 ZFS |
| 是否依赖 | ZFS 否 | 是 |
| 是否支持 | UFS 支持 | 不支持 |
| 是否支持 | VNET 支持 | 支持 |
| 网络隔离能力 | 较强 | 较强 |
| 配置方式 | Shell 脚本 | Python CLI |
| 学习成本 | 中 | 较高 |
| 快照/克隆能力 | 有限 | 强(依赖 ZFS) |
| 资源占用 | 很低 | 较高 |
| 适合新部署 | 推荐 | 推荐(仅限 ZFS) |
| 典型适用场景 | 通用 Jail 管理 | 大规模 ZFS Jail 环境 |
| 主要限制 | 功能相对朴素 | 强依赖 ZFS |
ezjail 曾是广泛使用的 Jail 管理工具,但目前已基本停止维护且不支持 VNET,不推荐用于新部署 仅存续于老旧系统的维护场景
| Next: 厚 Jail | Home: Jail 容器管理 |