在 MacOS 上,如何对守护进程进行沙盒处理?

On MacOS, how to sandbox a daemon process?

我正在寻找在 MacOS 上 "sandbox" "daemon" 进程的方法。

在 Linux 上,我们有各种内核机制来限制某些进程可以做什么(Linux 命名空间,seccomp。在某种程度上也是功能)。在 OpenBSD 上,我们有 chroot 和承诺。在 FreeBSD 上我们有监狱。

我知道最新版本的 MacOSX 上可用的应用程序沙盒机制。但据我所知,它应该包含一个用户可以从 /Applications 启动的经典 GUI 应用程序。

这里我所拥有的只是一个我想要沙箱化的系统守护进程(= 进程)。例如,该守护进程不需要写入文件系统,或者不需要使用网络等。所以我希望 MacOS 系统通过禁止访问某些资源来强制执行此操作。

launchd 也无济于事。使用 launchd,我可以 'daemonize' 正确地处理我的进程,保留一些套接字端口,但我没有看到 "encage" 进程的任何方法。

sandbox_init看起来比较有意思,其实是"DEPRECATED".

在 MacOS 上只剩下 chroot。当然 chroot 只会阻止 一些 文件系统的使用。

还有其他可用的沙盒机制吗?

Chromium 仍然使用 sandbox_init(),因为他们说 Apple 从未提供合适的替代品。参见 seatbelt.cc

但我怀疑未弃用的方法是使用 codesign 将权利的 plist 嵌入到二进制文件中。虽然网上没有太多关于这样做的信息,请参阅 Mac OS app, sandbox with command line tool? and How to sandbox a command line tool?

您还可以使用 Xcode 创建命令行工具项目,在其上启用沙盒,然后查看它的作用。