Назад | Перейти на главную страницу

Запретить setuid сбросить права пользователя setcap (VirtualBox)

Я пытаюсь запустить веб-сервер с безголового гостя 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 для подробностей.