17.3.建立和控制 Jail

一些管理员将 jail 分为以下两种类型:“完整”jail,类似于真正的 FreeBSD 系统; 和“服务”jail,专用于一个程序或服务,可能以特权运行。这只是一个概念上的划分,不影响建立 jail 的过程。在建立“完整”jail 时,用户空间的源代码有两个选项:使用预构建的可执行文件(例如在安装镜像上提供的可执行文件)或从源代码建立。

17.3.1.安装 Jail

17.3.1.1.从网络安装 Jail

bsdinstall(8)open in new window 工具可用于获取和安装 jail 所需的可执行文件。这演示了如何选择镜像,将哪个发行版安装到目标目录中,以及 jail 的一些基本配置:

# bsdinstall jail /here/is/the/jail

命令完成后,下一步是配置主机以运行 jail。

17.3.1.2.从 ISO 安装 Jail

要从安装镜像安装用户空间,请先为 jail 创建根目录。可以通过将变量 DESTDIR 设置到正确的位置来完成。

启动 shell 并定义 DESTDIR

# sh
# export DESTDIR=/here/is/the/jail

使用 ISO 安装时,按照 mdconfig(8)open in new window 中所述安装镜像:

# mount -t cd9660 /dev/`mdconfig -f cdimage.iso` /mnt
# cd /mnt/usr/freebsd-dist/

将可执行文件从安装镜像上的压缩包中提取到指定的目标中。最简单的是只需要提取基本系统,但也可执行完整安装。

要仅安装基本系统:

# tar -xf base.txz -C $DESTDIR

要安装除内核之外的所有内容:

# for set in base ports; do tar -xf $set.txz -C $DESTDIR ; done

17.3.1.3.从源代码构建和安装 Jail

jail(8)open in new window 手册页说明了建立 jail 的过程:

# setenv D /here/is/the/jail
# mkdir -p $D
# cd /usr/src
# make buildworld   ②
# make installworld DESTDIR=$D
# make distribution DESTDIR=$D
# mount -t devfs devfs $D/dev   ⑤

① 第一步是为 jail 选择一个位置。这是 jail 在 jail 主机的文件系统中的物理位置。一个常用选择是 /usr/jail/jailname,此处 jailname 是 jail 的主机名。/usr/ 在通常情况下有足够的空间容纳 jail 文件系统,对于“完整”jail 来说,它基本上是 FreeBSD 基本系统默认安装的每个文件的副本。

② 如果你已经使用 make worldmake buildworld 重新编译了你的用户空间,你可以跳过这一步并将现有的用户空间安装到新的 jail 中。

③ 这条命令将在文件系统中的 jail 物理位置的目录子树上安装必要的可执行文件、库、手册页等。

distribution 这个 make 目标会安装所有需要的配置文件。简单地说,它把 /usr/src/etc/ 的每个可安装文件都安装到 jail 环境的 /etc 目录:$D/etc/ 下。

⑤ 在 jail 中挂载文件系统 devfs(8)open in new window 不是必须的。另一方面,所有或几乎所有软件都需要访问至少一个设备,这主要取决于给定应用程序的用途。控制对 jail 内部的设备访问是非常重要的,因为不恰当的设置可能允许攻击者在 jail 中做一些令人讨厌的事情。对 devfs(8)open in new window 的控制是通过 devfs(8)open in new windowdevfs.conf(5)open in new window 手册页中描述的规则集进行管理的。

17.3.2.配置主机

安装了 jail 后,就可以使用 jail(8)open in new window 工具启动它。jail(8)open in new window 工具采用四个必要参数,这些参数在 jail 概述open in new window中进行了说明。也可以指定其他参数,例如,使用特定用户的身份运行 jail 进程。命令 参数取决于 jail 的类型:对于 虚拟系统 来说,/etc/rc 是一个不错的选择,因为它将复制真正的 FreeBSD 系统的启动顺序;对于 服务 jail 来说,它取决于将在 jail 内运行的服务或应用程序。

jail 通常在系统引导时启动,FreeBSD 的 rc 机制提供了用简单的方法来做到这一点。

  • jail.conf 中配置 jail 参数:
www {
   host.hostname = www.example.org;           # 主机名
   ip4.addr = 192.168.0.10;                   # jail 的 IP 地址
   path = "/usr/jail/www";                    # jail 所在路径
   mount.devfs;                               # 在 jail 内部挂载 devfs
   exec.start = "/bin/sh /etc/rc";            # 启动命令
   exec.stop = "/bin/sh /etc/rc.shutdown";    # 停止命令
}

rc.conf 中将 jail 配置为在系统引导时启动:

jail_enable="YES" # 如设置为 NO,会禁止启动所有的 jail。

jail.conf(5)open in new window 中配置的 jail 在默认启动时将运行其中的 /etc/rc 脚本,该脚本默认 jail 是一个完整的虚拟系统。对于服务 jail,应通过对 exec.start 这个选项的适当设置来更改 jail 的默认启动命令。

注意

有关可用选项的完整列表,请参阅 jail.conf(5)open in new window 手册页。

service(8)open in new window 可用于手动启动或停止 jail,如果它的条目存在于 jail.conf 中:

# service jail start www
# service jail stop www

还可以用 jexec(8)open in new window 停止 jail。先使用 jls(8)open in new window 来获得 jail 的 JID,然后使用 jexec(8)open in new window 在该 jail 中运行关机脚本。

# jls
   JID  IP Address      Hostname                      Path
     3  192.168.0.10    www                           /usr/jail/www
# jexec 3 /etc/rc.shutdown

有关这方面的更多信息,请参阅 jail(8)open in new window 手册页。