15.3.建立和控制 Jail

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

15.3.1. 安装 Jail

15.3.1.1. 从互联网安装 Jail

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

# bsdinstall jail /here/is/the/jail

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

15.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

15.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 物理位置的目录子树。

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 手册页中描述的规则集进行管理。

15.3.2. 配置主机

安装了 jail 后,就可以使用 jail(8)open in new window 实用程序启动它。jail(8)open in new window 实用程序采用四个强制参数,这些参数在 jail 概要open in new window中进行了描述。也可以指定其他参数,例如,使用特定用户的凭据运行 jail 进程。*command*争论取决于 Jail 的类型;对于 虚拟系统,/etc/rc` 是一个不错的选择,因为它将复制一个真正的 FreeBSD 系统的启动顺序。对于 服务 jail,它取决于将在 jail 内运行的服务或应用程序。

Jail 通常在启动时启动,FreeBSD rc 机制提供了一个简单的方法来做到这一点。

  • 在 jail.conf 中配置 jail 参数:
www {
   host.hostname = www.example.org;           # Hostname
   ip4.addr = 192.168.0.10;                   # IP address of the jail
   path = "/usr/jail/www";                    # Path to the jail
   devfs_ruleset = "www_ruleset";             # devfs ruleset
   mount.devfs;                               # Mount devfs inside the jail
   exec.start = "/bin/sh /etc/rc";            # Start command
   exec.stop = "/bin/sh /etc/rc.shutdown";    # Stop command
}

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

jail_enable="YES" #设置为 NO,会禁止启动任何 Jail。

jail.conf(5)open in new window 中配置的 jail 的默认启动将运行 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 手册页。