VirtualBox Web Service sicher einrichten

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.

  1. Wir arbeiten als root
    $ sudo su -
  2. Passwort generieren
    $ VBoxManage internalcommands passwordhash "MeinSicheresPasswort"
    Password hash: 491ad3447d9348dc3da6837892f547a2b9dd7f0a797a079401b8a7d3efb35d95
  3. 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.

  4. 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.

  5. 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. ;))

  6. 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.
    RemoteBox Login per https
  7. Wer möchte kann die Sache noch ein wenig weiter treiben und einen HTTP Auth davor setzen und per fail2ban überwachen.
    1. 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.

    2. 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
    3. Jetzt müssen wir nur noch die Zugangsdaten an RemoteBox übergeben in dem wir diese der URL voranstellen.
      RemoteBox Login per HTTPS und Basic Auth
    4. Nun kann bspw. noch fail2ban eingerichtet werden. Beachtet den richtigen _PORT_ zu verwenden.

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

Schreibe einen Kommentar