15.4. 微调和管理

可以为任何 jail 设置多个选项,以及将主机 FreeBSD 系统与 jail 组合的各种方法,以生成更高级别的应用程序。本节介绍:

  • 一些可用于调整 jail 安装实现的行为和安全限制的选项。
  • 一些用于 jail 管理的高级应用程序, 它们可以通过 FreeBSD Ports 获得, 并可用于实现基于 jail 的整体解决方案。

15.4.1. FreeBSD 中用于 Jail 调谐的系统工具

Jail配置的微调主要通过设置 sysctl(8) 变量来完成。sysctl 的一个特殊子树作为组织所有相关选项的基础而存在 security.jail.* FreeBSD 内核选项的层次结构。以下是与 jail 相关的主要系统列表,并附有其默认值。名称应该是不言自明的, 但有关它们的更多信息, 请参阅 jail(8)sysctl(8) 手册页。

  • security.jail.set_hostname_allowed: 1
  • security.jail.socket_unixiproute_only: 1
  • security.jail.sysvipc_allowed: 0
  • security.jail.enforce_statfs: 2
  • security.jail.allow_raw_sockets: 0
  • security.jail.chflags_allowed: 0
  • security.jail.jailed: 0

这些变量可以被主机系统的系统管理员用来添加或删除默认施加在 root 用户身上的一些限制。注意,有一些限制是不能被移除的。 root 用户不允许在 jail(8) 内挂载或卸载文件系统。在 jail 中的 root 用户不能加载或卸载 devfs(8) 规则集,不能设置防火墙规则,也不能做许多其他需要修改内核内数据的管理工作,比如设置内核的 securelevel

FreeBSD 的基本系统包含一组基本的工具,用于查看有关活动 jail 的信息,并附加到 jail 以运行管理命令。jls(8)jexec(8) 命令是基本 FreeBSD 系统的一部分, 可以用来执行以下简单的任务:

  • 打印活动 jail 及其相应的 jail 标识符 (JID)、IP 地址、主机名和路径的列表。

  • 从其主机系统连接到正在运行的 jail,并在 jail 内运行命令或在 jail 本身内执行管理任务。当 root 用户想要干净利落地关闭 jail 时,这尤其有用。jexec(8) 实用程序也可用于在 Jail 中启动一个 shell,以便在其中进行管理;例如:

    1. # jexec 1 tcsh

15.4.2. FreeBSD Ports 中的高级管理工具

在用于 Jail 管理的众多第三方实用程序中,最完整和最有用的实用程序之一是 sysutils/ezjail。它是一组有助于 jail(8) 管理的脚本。有关详细信息,请参阅 手册中有关 ezjail 的部分。

15.4.3. 保持 Jail 修补和更新

Jail 应该从主机操作系统中保持最新,因为尝试从 jail 内部修补用户空间可能会失败,因为 FreeBSD 中的默认行为是不允许在 jail 中使用 chflags(1) ,这会阻止某些文件的替换。可以改变这种行为,但建议使用 freebsd-update(8) 来维护 jail。用 -b 指定要更新的 jail 的路径。

要将 jail 更新到它已经运行的 FreeBSD 版本的最新补丁版本, 然后在主机上执行以下命令:

  1. # freebsd-update -b /here/is/the/jail fetch
  2. # freebsd-update -b /here/is/the/jail install

要将 jail 升级到新的主要或次要版本,请首先按照 “执行主要和次要版本升级” 中所述升级主机系统。升级并重新引导主机后,即可升级 jail。例如,要从 12.0-RELEASE 升级到 12.1-RELEASE,请在主机上运行:

  1. # freebsd-update -b /here/is/the/jail --currently-running 12.0-RELEASE -r 12.1-RELEASE upgrade
  2. # freebsd-update -b /here/is/the/jail install
  3. # service jail restart myjail
  4. # freebsd-update -b /here/is/the/jail install

然后,如果是主要版本升级,请重新安装所有已安装的软件包并再次重新启动 jail。这是必需的,因为 ABI 版本在 FreeBSD 的主要版本之间升级时会发生变化。从主机:

  1. # pkg -j myjail upgrade -f
  2. # service jail restart myjail