OpenBSD 有哪些 Jail/Chroot/Sandbox-like 机制?

What Jail/Chroot/Sandbox-like mechanisms are available on OpenBSD?

我最近开始使用 OpenBSD。我想创建简单的即发即弃 containers/VM 或其他东西(它应该用作沙盒)。

用户可以上传他的源代码(C++/Java/Perl),它会在服务器(OpenBSD)上编译,如果成功,应该执行这个文件然后return结果到网页。

我如何在 OpenBSD 中提供这个?

此外,我是否应该使用 chroot,因为 'jail' 将在 6.0 中被删除?或者还有其他可能在 OpenBSD 中创建 "sandbox" 吗?

目前 OpenBSD 不支持任何 "chroot on steroid" 机制。过去,相同的监狱功能(名为 sysjail)在端口中,但在 2007 年被删除,因为它不容易维护并且非常不安全。您可以在 stackexchange 和您的搜索引擎上找到有关它的更多信息。

从历史上看,OpenBSD 仅支持 chroot(8) 并且与其他系统完全一样工作:

  1. 创建一个带有 userland 的替代根目录
# create your target chroot
target="/tmp/chroot"
mkdir ${target}

# now build and install your userland
cd /usr
cvs -qz3 -d${repository} co src -r${openbsd_release}
cd /usr/src
make obj && make && make install DESTDIR=${target}
  1. 启动你的守护进程或其中的软件
# in root
chroot /tmp/chroot

# run your daemon here
# note: you need to init also dev directory
#       and, eventually, customize /etc/fstab
#       /tmp is currently not allowed to have dev on it
#       please see fstab(5) man page

base中的很多软件都支持chroot功能,openntpdopensshhttpd等很多软件都默认配置在隔离目录中。

现在,从 OpenBSD 5.9 开始,您可以在基础中使用 vmm(4) 管理程序和 vmctl(8)。您可以像任何其他管理程序(bhyve、xen 或 kvm)一样启动 vmd 守护进程并创建隔离容器。

# from openbsd vmctl man page example
vmctl create disk.img -s 4.5G
vmctl start "myvm" -m 512M -i 1 -d disk.img -k /bsd
vmctl stop 1

您还可以使用另一种基于端口软件的方法,qemu 在 OpenBSD 上工作得很好但性能不佳,这是由于缺乏内核加速支持和部分原因是文件系统结构。

现在,关于你的主要问题(提供一种远程编译源代码的方法),我想更好的办法是真正将你的代码与主系统隔离开来,并使用类似 vmctlqemu 可能是很好的答案。也许 qemu 会更好,因为你可以使用标准用户来执行它,没有内核特性和很多网络特性,但编译会很慢。

查看 pledge and unveil

您可以使用质押来限制系统调用,使用揭露来隐藏目录