phpVirtualbox en Debian
phpVirtualbox es una aplicación en PHP que permite administrar VirtualBox gráficamente de forma remota (y local) mediante una interfaz muy similar a la GUI original.
Contenido
Instalación y configuración
Instalamos los paquetes libapache2-mod-php5
y apache2
, los nombres lo dicen todo uno es el servidor web y el otro para dar soporte a php.
# aptitude install unzip libapache2-mod-php5 apache2
Bajamos phpVirtualBox desde la página oficial. Lo descomprimimos y movemos al directorio raíz de la página por defecto, en un subdirectorio o creamos un nuevo virtualhost.
# unzip phpvirtualbox-X.X-X.zip
# mv phpvirtualbox-X.X-X/* /var/www/html
El paquete viene con un fichero de configuración genérico que debemos utilizar de plantilla para el nuestro.
# cd /var/www/html
# cp config.php-example config.php
Se edita el nuevo fichero y se cambia el valor de las variables $username
y password
por el nombre de usuario que ejecuta VirtualBox.
# nano config.php
var $username = 'dummyuser';
var $password = 'dummypass';
Por último cambiamos los permisos del directorio raíz de forma recursiva.
# chown -R www-data:www-data /var/www/html
Instalar VirtualBox
Si aun no tenemos instalado VirtualBox debemos instalarlo antes de continuar. Podemos descargar el paquete específico para nuestro sistema desde la página oficial o añadir el repositorio e instalarlo con apt. Si estamos instalando phpVirtualBox en un servidor distinto al que corre las máquinas virtuales no es necesario.
/etc/apt/sources.list
deb http://download.virtualbox.org/virtualbox/debian codename contrib
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | apt-key add -
# aptitude update
# aptitude install virtualbox-5.0
vboxwebsrv
phpVirtualbox funciona con la API Web vboxwebsrv
, podemos comprobar si funciona iniciando vboxwebsrv
con el usuario definido anteriormente y entrando en 127.0.0.1
o de forma remota con la IP local.
# su vboxuser # Usuario especificado en config.php
$ vboxwebsrv -H 127.0.0.1
El usuario y contraseña de phpVirtualbox por defecto es admin:admin.


Iniciar vboxwebsrv en el arranque
apache2 se añade automáticamente al inicio pero vboxwebsrv
no, es convniente añadirlo al sobretodo si se trata de un servidor que siempre tendrá máquinas corriendo.
systemd
Añadimos el servicio vboxweb-service.service
al inicio con systemctl
.
# systemctl enable vboxweb-service.service
# ls -l /etc/systemd/system/multi-user.target.wants/
lrwxrwxrwx 1 root root 13 Mar 5 22:43 vboxweb-service.service -> /lib/systemd/system/vboxweb-service.service
Debemos crear el fichero /etc/default/virtualbox
, una configuración mínima puede ser la siguiente:
# nano /etc/default/virtualbox
VBOXWEB_USER=dummyuser
VBOXWEB_HOST=localhost
init
Por defecto al instalar VirtualBox se crea el servicio vboxweb-service, lo añadimos al inicio.
# update-rc.d vboxweb-service defaults
Debemos crear el fichero /etc/default/virtualbox
, una configuración mínima puede ser la siguiente:
# nano /etc/default/virtualbox
VBOXWEB_USER=dummyuser
VBOXWEB_HOST=localhost
Autenticación externa
phpVirtualBox viene con una serie de configuraciones de las que podemos hacer uso, podemos autenticarnos contra un dominio, servidor LDAP, o en este caso la autenticación básica de apache.
Creamos un nuevo usuario desde la interfaz web como en la siguiente imagen.

Utilizando htpasswd
se crea el fichero .htpasswd
que contiene los usuarios y contraseñas autorizados. Si el fichero no existe como es mi caso, al añadir el primer usuario se ha de especificar la opción -c
.
# htpasswd -c /etc/apache2/.htpasswd user
# htpasswd /etc/apache2/.htpasswd user1
Se edita el virtualhost correspondiente y se añade lo siguiente:
# /etc/apache2/sites-enabled/000-default.conf
<Directory "/var/www/html">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
Por último modificamos el fichero de configuración de phpVirtualBox y le indicamos que esta será la forma de autenticación.
# config.php
var $authLib = 'WebAuth';
De forma remota
Es posible tener el servidor web y phpVirtualBox en un servidor distinto al que corre vboxwebsrv y las máquinas virtuales, incluso es posible hacer que la aplicación interactue con múltiples servidores a la vez.
Un solo servidor
Debemos seguir los mismos pasos anteriores añadiendo algunas modificaciones. Editamos el fichero de configuración e indicamos la IP y el nombre de usuario y contraseña de la máquina remota.
var $username = 'usuarioremoto';
var $password = 'usuariospass';
var $location = 'http://192.168.1.240:18083';
En el servidor que corre VirtualBox y vboxwebsrv
editamos el fichero creado anteriormente y cambiamos localhost por su IP local. Esta directiva le indica en que dirección y puerto debe estar escuchando.
# nano /etc/default/virtualbox
VBOXWEB_USER=dummyuser
VBOXWEB_HOST=192.168.1.240
Si reiniciamos el servicio veremos los cambios.
# service vboxweb-service restart
# service vboxweb-service status
CGroup: /system.slice/vboxweb-service.service
├─ 762 /usr/lib/virtualbox/VBoxXPCOMIPCD
├─ 770 /usr/lib/virtualbox/VBoxSVC --auto-shutdown
├─ 3877 /usr/lib/virtualbox/VBoxHeadless --comment W7sp1 --start...
├─23663 /usr/lib/virtualbox/VirtualBox --comment Debian --startvm ...
└─27807 /usr/lib/virtualbox/vboxwebsrv --background -H 192.168.1.240...
Y esto es todo, ya podemos controlar las máquinas virtuales desde un servidor distinto.
Múltiples servidores
Editamos el fichero de configuración config.php
, descomentamos y adaptamos el array $servers
.
var $servers = array(
array(
'name' => 'swx',
'username' => 'usuarioremoto',
'password' => 'usuariospass',
'location' => 'http://192.168.1.5:18083/'
),
array(
'name' => 'sxc',
'username' => 'usuarioremoto1',
'password' => 'usuariospass1',
'location' => 'http://192.168.1.240:18083/'
),
);

Notas finales
Podemos utilizar fail2ban para evitar ataques de fuerza bruta. En la página oficial podemos encontrar mas información y otras configuraciones mas complejas.