Ahoi,
für die Fernwartung stellt VirtualBox eine SOAP-Schnittstelle über den vboxwebsrv zur Verfügung. Tools wie RemoteBox oder phpVirtualBox greifen darauf zurück. Im Nachfolgenden möchte ich zeigen, wie man den VirtualBox Web Service auf einem Ubuntu 12.04 Host sicher einrichtet. Prinzipiell sollte das aber genauso auf anderen Linuxsystemen funktionieren. Der sicherste Weg wäre den vboxweb-service lediglich über eine OpenVPN-Verbindung erreichbar zu machen aber das kann aus verschiedenen Gründen nicht erwünscht sein. Im Nachfolgenden wird der Dienst daher öffentlich per SSL erreichbar sein und per Passwort gesichert.
- Wir arbeiten als root
$ sudo su -
- Passwort generieren
$ VBoxManage internalcommands passwordhash "MeinSicheresPasswort" Password hash: 491ad3447d9348dc3da6837892f547a2b9dd7f0a797a079401b8a7d3efb35d95
- Konfiguration anlegen
$ nano /etc/default/virtualbox VBOXWEB_USER="vboxuser" VBOXWEB_LOGFILE="/home/vboxuser/logs/vboxweb-service" VBOXWEB_AUTH_LIBRARY="VBoxAuthSimple" VBOXWEB_AUTH_PWHASH="491ad3447d9348dc3da6837892f547a2b9dd7f0a797a079401b8a7d3efb35d95" $ /etc/init.d/vboxweb-service start
vboxuser muss entsprechend dem User unter welchem die virtuellen Maschinen laufen gesetzt werden. Der Webservice ist nun über 127.0.0.1:18083 erreichbar. Da die Verbindung unverschlüsselt ist, belassen wir dies so.
- Nginx als Reverse Proxy installieren
$ wget -q http://nginx.org/keys/nginx_signing.key -O- | sudo apt-key add - $ echo "#nginx" >> /etc/apt/sources.list $ echo "deb http://nginx.org/packages/ubuntu/ precise nginx" >> /etc/apt/sources.list $ echo "deb-src http://nginx.org/packages/ubuntu/ precise nginx" >> /etc/apt/sources.list $ aptitude update && aptitude install nginx-light
Es sollte auch die Version aus dem Repository tun.
- Den Vhost anlegen
$ nano /etc/nginx/sites-available/meine.domain.tld.conf server { listen _IP_:_PORT_ server_name meine.domain.tld; ssl on; ssl_certificate /etc/ssl/meine.domain.tld.pem; ssl_certificate_key /etc/ssl/meine.domain.tld.key; location / { proxy_pass http://127.0.0.1:18083/; include /etc/nginx/proxy_params; } } $ ln -s /etc/nginx/sites-available/meine.domain.tld.conf /etc/nginx/sites-enabled/ $ /etc/init.d/nginx restart
Es sollten _IP_, _PORT_, meine.domain.tld und die Zertifikatspfade angepasst werden. Der Webservice sollte nun über den Browser zum Testen erreichbar sein und einen SOAP Faultcode zurückgeben. (Das muss so sein. ;))
- Der Service kann nun per RemoteBox o.ä. getestet werden und sollte problemlos funktionieren. Die Zugangsdaten setzen sich aus dem Nutzer unter welchem VirtualBox läuft und dem generierten Passwort zusammen.
- Wer möchte kann die Sache noch ein wenig weiter treiben und einen HTTP Auth davor setzen und per fail2ban überwachen.
- Passwort anlegen
$ mkdir /etc/nginx/htpasswd $ echo "Nutzer:{SSHA}$(echo -n 'PasswortMYSALT' | openssl dgst -binary -sha1 |sed 's/$/MYSALT/' | base64)" >> /etc/nginx/htpasswd/vboxweb-service $ chown -R root:www-data /etc/nginx/htpasswd $ chmod 640 /etc/nginx/htpasswd/*
Es müssen entsprechend Nutzer, Passwort und MYSALT (Vorsicht 2x vorhanden) ausgetauscht werden.
- Vhost erweitern
$ nano /etc/nginx/sites-available/meine.domain.tld.conf server { listen _IP_:_PORT_ server_name meine.domain.tld; ssl on; ssl_certificate /etc/ssl/meine.domain.tld.pem; ssl_certificate_key /etc/ssl/meine.domain.tld.key; location / { auth_basic "vboxweb-service"; auth_basic_user_file htpasswd/vboxweb-service; proxy_pass http://127.0.0.1:18083/; include /etc/nginx/proxy_params; } } $ /etc/init.d/nginx restart
- Jetzt müssen wir nur noch die Zugangsdaten an RemoteBox übergeben in dem wir diese der URL voranstellen.
- Nun kann bspw. noch fail2ban eingerichtet werden. Beachtet den richtigen _PORT_ zu verwenden.
- Passwort anlegen
Viele Grüße
Philipp
Anmerkung
Der vboxweb-service bringt von Haus SSL Unterstützung mit. Allerdings erfordert diese auch auf der Client-Seite ein Zertifikat. Die o. g. Tools unterstützen das leider nicht, weshalb der Umweg über nginx in Kauf genommen wird. Direkt lässt sich SSL über die folgenden Parameter aktivieren:
$ nano /etc/default/virtualbox VBOXWEB_SSL_KEYFILE="/etc/ssl/CRTandKEY.pem" #VBOXWEB_SSL_PASSWORDFILE="" VBOXWEB_SSL_CACERT="/etc/ssl/ca-bundle.pem" #VBOXWEB_SSL_CAPATH="/etc/ssl/certs" #VBOXWEB_SSL_DHFILE #VBOXWEB_SSL_RANDFILE