Предотвращение сброса setuid пользовательских привилегий setcap (VirtualBox)
Я пытаюсь запустить веб-сервер от безголового гостя в VirtualBox. VirtualBox необходимо привязать к порту 80, но единственный способ сделать это - запустить VirtualBox от имени пользователя root. Чтобы обойти это, я попытался использовать setcap
, но процесс VirtualBox является корневым SUID, то есть он отбрасывает все пользовательские привилегии, включая настройки setcap.
Поскольку VirtualBox работает с рутом SUID, почему пользователи без полномочий root не могут с ним связываться с привилегированными портами?
Гость не может быть соединен мостом, он должен использовать NAT. Перенаправление трафика с iptables или запуск VirtualBox от имени root также, к сожалению, не вариант, но мне, возможно, придется согласиться, если других вариантов нет.
Виртуальный поток, демонстрирующий эту функцию.
РЕДАКТИРОВАТЬ: мой kern.log
также подтверждает это:
warning: /usr/lib/virtualbox/VBoxHeadless' has both setuid-root and effective capabilities. Therefore not raising all capabilities.
РЕДАКТИРОВАТЬ: man-страницу возможностей также касается этого:
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 включает эту функцию.
РЕДАКТИРОВАТЬ: я наконец получил полностью работать путем компиляции усиленной сборки 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 для деталей.