Я пытаюсь запустить веб-сервер с безголового гостя VirtualBox с NAT. VirtualBox необходимо привязать к порту 80, но единственный способ сделать это - запустить VirtualBox от имени пользователя root. Чтобы обойти это, я попытался использовать setcap
, но процесс VirtualBox является SUID root, что означает, что он теряет все права пользователя, включая настройки setcap.
Поскольку VirtualBox работает с SUID root, почему пользователи без полномочий root не могут подключаться к привилегированным портам с его помощью?
Гость не может быть соединен мостом, он должен использовать NAT. Перенаправление трафика с помощью iptables или запуск VirtualBox с правами 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.
Любые идеи?
Я нашел источник проблемы. Корневые программы SUID на самом деле могут связываться с привилегированными портами, но VirtualBox специально отбрасывает привилегии SUID вскоре после запуска, что делает невозможным предоставление ему необходимых разрешений без серьезных изменений. SUID фактически совместим с setcap, как указано на возможности справочная страница. Перекомпиляция VirtualBox из исходников - единственный вариант.
РЕДАКТИРОВАТЬ: Настройка export VBOX_HARD_CAP_NET_BIND_SERVICE=1
перед сборкой VirtualBox включает эту функцию.
РЕДАКТИРОВАТЬ: Наконец-то я полностью заработал, скомпилировав усиленную сборку VirtualBox из SVN:
# 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 для подробностей.