防止setuid丢弃setcap用户权限(VirtualBox)

我试图从一个无头的,NAT的VirtualBox客户端运行一个Web服务器。 VirtualBox需要绑定到端口80,但唯一的方法是以root身份运行VirtualBox。 为了解决这个问题,我尝试使用setcap ,但是VirtualBox进程是SUID根,这意味着它会删除所有用户权限,包括setcap设置。

由于VirtualBox以SUID根目录运行,为什么非root用户无法绑定到特权端口呢?

客人不能被桥接,它必须使用NAT。 使用iptables重新路由stream量或者以root身份运行VirtualBox也不是一种select,但是如果没有其他选项,我可能必须解决。

展示此function的VirtualBox线程。

编辑:我的kern.log也证实了这一点:

 warning: /usr/lib/virtualbox/VBoxHeadless' has both setuid-root and effective capabilities. Therefore not raising all capabilities. 

编辑: function手册页也涉及到这一点:

If the effective user ID is changed from 0 to nonzero, then all capabilities are cleared from the effective set.

有任何想法吗?

我find了问题的根源。 SUID root程序实际上可以绑定到特权端口,但是VirtualBox在运行后不久就会丢弃SUID权限,因此无法在不进行严重修改的情况下给予适当的权限。 SUID实际上与setcap兼容,正如function手册页所述。 从源重新编译VirtualBox是唯一的select。

编辑:build立之前设置export VBOX_HARD_CAP_NET_BIND_SERVICE=1 VirtualBox启用此function。

编辑:我终于通过编译从SVN强化的VirtualBox构build完全工作:

 # Prerequisites: # - Satisfy all dependencies listed in the VirtualBox build instructions # - You may need to install additional packages: # texlive-latex-extra # yasm export VBOX_HARD_CAP_NET_BIND_SERVICE=1 cd ~ # Download VirtualBox source code from SVN svn co http://www.virtualbox.org/svn/vbox/trunk vbox cd vbox # Configure build. I encountered Java errors so I disabled Java support ./configure --disable-java source ./env.sh kmk all # Build kernel module. The below path may vary! cd ~/vbox/out/linux.amd64/release/bin/src make sudo make install # Build hardened executable cd ~/vbox/src/VBox kmk packing # Install VirtualBox cd ~/vbox/out/linux.amd64/release/bin sudo ./VirtualBox-4.2.51_OSE-r44262.run install 

上述某些步骤可能需要创build符号链接。 详细信息请参阅Linux构build指示信息。