我认为您问题的许多细节都可以同样适用于avahi-daemon
,这是我最近查看的。(我可能已经错过了另一个不同的细节)。万一avahi-daemon被破坏,在chroot中运行avahi-daemon有很多优点。这些包括:
- 它无法读取任何用户的主目录并泄露私人信息。
- 它无法通过写入/ tmp来利用其他程序中的错误。至少有一整类此类错误。例如https://www.google.co.uk/search?q=tmp+race+security+bug
- 它无法打开chroot之外的任何unix套接字文件,其他守护程序可能正在监听该文件并读取消息。
当您不使用dbus或类似的东西时,第3点可能会特别好...我认为avahi-daemon使用dbus,因此即使从chroot内部,它也可以确保对系统dbus的访问。如果您不需要在系统dbus上发送消息的功能,则拒绝该功能可能是一个很好的安全功能。
用systemd单位文件管理
请注意,如果avahi-daemon被重写,它可能会选择依赖systemd以获得安全性,并使用例如ProtectHome
。我提议对avahi-daemon进行更改,以将这些保护作为额外的层添加,以及chroot无法保证的一些其他保护。您可以在此处看到我建议的选项的完整列表:
https://github.com/lathiat/avahi/pull/181/commits/67a7b10049c58d6afeebdc64ffd2023c5a93d49a
如果avahi-daemon 不使用chroot本身,则似乎还有更多限制可以使用,其中一些在提交消息中提到。我不确定这多少适用。
注意,我使用的保护措施不会限制守护进程打开unix套接字文件(上面的第3点)。
另一种方法是使用SELinux。但是,您可能会将您的应用程序绑定到该Linux发行版的子集。我在这里积极考虑SELinux的原因是SELinux以一种细粒度的方式限制了dbus上进程的访问。例如,我想您可能经常希望它systemd
不会出现在您需要能够将消息发送到:-)的总线名称列表中。
“我想知道,使用systemd沙箱是否比chroot / setuid / umask / ...更安全。”
简介:为什么不能同时使用?让我们对以上内容进行解码:-)。
如果考虑第3点,则使用chroot可以提供更多的限制。ProtectHome =及其朋友甚至没有尝试像chroot那样严格。(例如,没有一个命名的systemd选项黑名单/run
,我们倾向于将unix套接字文件放置在其中)。
chroot表明,限制文件系统访问可能非常强大,但Linux上并非所有文件都是:-)。有systemd选项可以限制其他内容,而不是文件。如果程序受到威胁,这很有用,您可以减少可用的内核功能,以尝试利用其中的漏洞。例如,avahi-daemon不需要蓝牙套接字,我想您的Web服务器也不需要:-)。因此,请勿授予它访问AF_BLUETOOTH地址族的权限。使用该RestrictAddressFamilies=
选项,只需将AF_INET,AF_INET6甚至AF_UNIX列入白名单。
请阅读您使用的每个选项的文档。某些选项与其他选项结合使用会更有效,而某些选项并非在所有CPU架构上都可用。(不是因为CPU不好,而是因为该CPU的Linux端口的设计不够好。我认为)。
(这里有一个一般性原则。如果您可以编写要允许的列表而不是要拒绝的列表,则更安全。就像定义chroot一样,它还提供了允许访问的文件列表,因此更可靠而不是说您要阻止/home
)。
原则上,您可以在setuid()之前自己应用所有相同的限制。只是可以从systemd复制的代码。但是,系统单位选项应该明显更容易编写,并且由于它们是标准格式,因此应该更易于阅读和查看。
因此,我强烈建议您仅阅读man systemd.exec
目标平台上的沙箱部分。但是,如果你想要最安全的设计成为可能,我不会害怕尝试chroot
(再落root
权限)在你的程序,以及。这里需要权衡。使用chroot
对您的总体设计有一些限制。如果您已经有一个使用chroot的设计,并且它似乎可以满足您的需要,那么听起来很不错。