我正在尝试从无头、NAT 的 VirtualBox 客户机运行 Web 服务器。VirtualBox 需要绑定到端口 80,但唯一的方法是以 root 身份运行 VirtualBox。为了解决这个问题,我尝试使用setcap
,但 VirtualBox 进程是 SUID root,这意味着它会放弃所有用户权限,包括 setcap 设置。
既然 VirtualBox 以 SUID root 运行,为什么非 root 用户不能使用它绑定到特权端口?
客户机无法桥接,必须使用 NAT。不幸的是,使用 iptables 重新路由流量或以 root 身份运行 VirtualBox 也不是一种选择,但如果没有其他选择,我可能不得不接受。
编辑:我kern.log
也证实了这一点:
warning: /usr/lib/virtualbox/VBoxHeadless' has both setuid-root and effective capabilities. Therefore not raising all capabilities.
编辑:能力manpage 也涉及到这一点:
If the effective user ID is changed from 0 to nonzero, then all capabilities are cleared from the effective set.
有任何想法吗?
答案1
我找到了问题的根源。SUID 根程序实际上可以绑定到特权端口,但 VirtualBox 在运行后不久就会放弃 SUID 特权,因此无法在不进行重大修改的情况下为其提供适当的权限。SUID 实际上与 setcap 兼容,如能力手册页。从源代码重新编译 VirtualBox 是唯一的选择。
编辑:export VBOX_HARD_CAP_NET_BIND_SERVICE=1
构建 VirtualBox 之前的设置可启用此功能。
编辑:我最终通过从 SVN 编译强化的 VirtualBox 版本使其完全正常工作:
# 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
上述某些步骤可能需要创建符号链接。请按照Linux 构建说明了解详情。