17.11.从 jail 内部管理
# sysctl security.jail.jailed
security.jail.jailed: 1# sysctl -d security.jail.param最后更新于
大多数 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.hostname、kern.domainname、kern.hostid、kern.hostuuid、kern.securelevel 和 security.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 内对应方式。
最后更新于