For the complete documentation index, see llms.txt. This page is also available as Markdown.

17.11.从 jail 内部管理

大多数 jail 管理工作是从宿主完成的,但有些任务需在 jail 内部执行,且 jail 内部运行的脚本有时需要知道自己在 jail 中。本节介绍管理员从 jail 内部看到的内容以及可执行的操作。

进程可通过读取 security.jail.jailed sysctl 来检测自己是否运行在 jail 内,该值在 jail 内为 1,在宿主上为 0

# sysctl security.jail.jailed
security.jail.jailed: 1

在 jail 内部,环境被刻意限制:

  • 宿主的系统视图被隐藏。jail 中的进程只能看到自己 jail 的进程、套接字和文件系统,看不到宿主或其他 jail 的。

  • 内核状态在很大程度上是只读的。无法从 jail 内部写入内核可调参数,不允许 kldload(8)kldunload(8),并且 dmesg(8) 和内核消息缓冲区不可用,除非设置了 allow.read_msgbuf

  • 跨越 jail 边界的特权操作会被拒绝,除非宿主明确允许。创建原始套接字——ping(8)traceroute(8) 所需——需要 allow.raw_sockets(参见 jail 配置文件 中的参数说明),挂载文件系统需要 allow.mount 及其按文件系统类型的子参数,而 chflags(1) 默认禁用(参见 升级 jail)。

少数按 jail 设置的 sysctl 变量可在 jail 内部更改而不影响宿主,包括 kern.hostnamekern.domainnamekern.hostidkern.hostuuidkern.securelevelsecurity.bsd.suser_enabled。可用的 jail 参数集合可通过 sysctl(8) 列出:

# sysctl -d security.jail.param

从 jail 内部管理其自身的服务,方式与未 jailed 系统完全相同:service(8)sysrc(8) 作用于 jail 自己的 rc(8) 配置。这是上面所示的宿主侧 service -j 和 sysrc -j 的 jail 内对应方式。

最后更新于