FreeBSD 下的 ZFS 允许将文件系统分配给监狱,这样监狱中具有适当权限的帐户可以访问文件系统,创建新的从属文件系统,等等。至少在 8-STABLE 中,这些功能没有集成到现有/etc/rc.d/jail
脚本中。基本流程类似于:
sysctl -w security.jail.enforce_statfs=0
sysctl -w security.jail.mount_allowed=1
zfs set jailed=on <filesystem>
zfs jail <jid> <filesystem>
Run Code Online (Sandbox Code Playgroud)
并且还需要暴露zfs
监狱内的设备节点。
与此同时,似乎有大量工具(ezjail、jailer、warden 和一般/usr/ports/sysutils/*jail*
)声称更容易/更好/更强大/等等,但其中大多数似乎只是轻微维护而不是与标准监狱脚本相比,这确实是一场胜利。
我想避免重新发明轮子。是否有与 ZFS 集成良好的监狱管理工具?我正在寻找一些可以在启动 jail 时设置必要的 devfs 规则、sysctl 设置和 zfs 属性的东西……并且理想情况下允许对 jails 进行基于名称的引用,尽管许多第三方都支持这种引用 -可悲的是,库存监狱脚本中缺少派对工具。
经过一番研究,发现最新版本的ezjail已经有了这个支持。关键部分是以下配置选项/usr/local/etc/ezjail.conf
:
ezjail_use_zfs="YES"
ezjail_jailzfs="tank/jails"
Run Code Online (Sandbox Code Playgroud)
并-c zfs
在创建监狱时使用,如下所示:
ezjail-admin create -c zfs myjail 192.168.1.10
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令将 ZFS 数据集与监狱关联起来ezjail-admin config
(您不能将其作为create
命令的一部分执行此操作):
ezjail-admin config -z tank/data/myjail myjail
Run Code Online (Sandbox Code Playgroud)
这假设您已经设置了 ZFS 数据集并配置了适当的 sysctl 设置和 devfs 规则来完成此工作。
您的 ZFS 数据集需要设置选项jailed
:
zfs set jailed=on tank/data/myjail
Run Code Online (Sandbox Code Playgroud)
您想要以下内容/etc/sysctl.conf
:
# support zfs in jails
security.jail.mount_allowed=1
security.jail.enforce_statfs=0
Run Code Online (Sandbox Code Playgroud)
我对使用 ezjail 配置的监狱使用以下 devfs 规则集:
[devfsrules_zfsjail=100]
add include $devfsrules_jail
add path zfs unhide
Run Code Online (Sandbox Code Playgroud)