VirtualBox: Verschiedene Gast-OS (Linux/*NIX oder Windows) im "Headless" Modus
In diesem Tutorial möchte ich die Einrichtung und Verwaltung sowie einige kleine, praktische Scripte vorstellen, die den Betrieb verschiedener, virtueller Maschinen mittels VirtualBox im so genannten "Headless Modus" verbunden mit der Möglichkeit des entfernten Zugriffs mittels SSH und/oder RDP auf selbige zum Ziel haben.
Die Netzwerkeinrichtung der virtuellen Maschinen wird dabei mit NAT (Standardeinstellung) vorgenommen, im Prinzip geht das auch mit einer der anderen Methoden, was mir persönlich an der NAT-Methode gefällt, man hat praktisch automatisch eine "Firewall", da der Host wie ein NAT-Router für den Gast agiert.
Die Einrichtung wird dadurch vielleicht etwas "komplizierter", aber dafür hat man mehr Kontrolle über den Gast, was z.B. auch bei Betriebssystemen aus dem Hause Microsoft von Vorteil sein kann, wenn das OS in der Standardinstallation alles an Ports öffnet, was bei drei nicht auf dem Baum ist und wovon die meisten Benutzer so gut wie gar nichts benötigen, aber als "Lösung" für diese IMHO eindeutige Fehlkonfiguration dann eine "Personal Firewall" davor schalten, die Dienste vor dem Zugriff schützt, die man eh nicht laufen lassen will.
Warum diese Dienste per default nicht einfach _ausgeschaltet_ sind, entzieht sich zwar meiner Logik, aber wahrscheinlich ist meine Logik in der Minderheit, denn >90% Marktanteil müssen schließlich logischer sein als etwas gesunder Menschenverstand.
Des weiteren wird auf eine sichere Möglichkeit des Zugriffs auf die "kopflosen" VMs Wert gelegt indem SSH bzw. RDP mit externer Authentifizierung eingerichtet und verwendet werden.
Als Host wurde openSUSE 11.1 (sowohl i586 als auch x86_64) verwendet, prinzipiell sollte sich dieses Tutorial aber auf alle Linuxdistributionen übertragen lassen.
0. Was ist dieser "Headless Modus" überhaupt?
Im so genannten Headless Modus läuft die virtuelle Maschine "im Hintergrund" ohne daß ein GUI-Fenster vorhanden ist, des Weiteren kann solch eine VM logischerweise auch dann gestartet und "remote" benutzt werden, wenn auf dem Host _kein_ X-Server läuft.
1. Und was bringt mir das?
Eines der Szenarien ist z.B., daß man einen kleinen Testserver in einer VM statt auf "echtem Eisen" laufen lassen möchte und dieser aber "von außen" wie ein Server auf einer "richtigen" Maschine erreichbar sein soll, ohne die Sicherheit des Hosts zu gefährden.
Eine weitere Möglichkeit ist auch, daß man ein anderes OS ab und zu für Testzwecke braucht, dieses aber nicht immer in einem Fenster auf dem Desktop/in der Taskleiste herumliegen haben sondern bei Bedarf darauf zugreifen möchte.
2. Aber wenn kein Fenster offen ist, wie kann ich dann auf die VM zugreifen?
Je nach Gast-OS gibt es mehrere Möglichkeiten, *NIX-artige Systeme bieten natürlich mit SSH eine einfache und sichere Methode, bei Windows greift man am einfachsten über RDP (Remote Desktop Protocol) zu (was auch für *NIX-artige Gast-OS zur Verfügung steht).
Da VirtualBox seine eigene RDP-Implementierung mitbringt, ist dies eine sehr einfache Möglichkeit (und für Windows-Gäste die einzige ohne Nachinstallieren irgendwelcher, weiterer Software auf dem Gast) um auf jegliche Art von VM via GUI zugreifen zu können. Zur Absicherung des Zugriffs über RDP wird Authentifizierung über das PAM-System des Hosts verwendet, für die Absicherung des SSH-Zugangs für *NIX-artige Gäste konsultiere man eines der zahlreichen Tutorials (Stichwort Pubkey statt Passwort).
3. Einrichten des Zugriffs über RDP mit externer Authentifizierung
1) Davon ausgehend, daß man schon eine (oder mehrere) virtuelle Maschinen hat, hier die Einrichtung von VRDP über das Standard-Interface von VirtualBox, die entsprechende VM darf dabei _NICHT_ laufen!
(oder über einen entsprechenden Eintrag im Startmenü aufrufen)
=> Maschine auswählen => Anzeige => Fernsteuerung => Server aktivieren [x] ankreuzen => Einen Port > 1024 wählen (wichtig!) => "Authentisierungsmethode" von "Null" auf "Extern" umstellen => Server aktivieren [ ] Kreuz entfernen (das Regeln wir später über unsere Startscripte) => OK
Wer das Ganze von Hand machen will, der schaue im Handbuch nach und lese die Ausgaben von "VBoxManage --help"
2) Einrichtung von PAM für externe Authentifizierung
Die default-Einstellung für VRDP Authentifizierung lautet "Null" und das ist auch in etwa das, was sie aus Sicherheitsaspekten wert ist, denn so könnte _jeder_ lokale Nutzer auf die laufende VM zugreifen (sollte man den entsprechenden Port nach außen freigegeben haben/freigeben wollen, dann könnte das auch jeder Hansel aus dem Internet), das ist natürlich indiskutabel.
Nun müssen wir aber PAM beibringen, daß es für diese externe Authentifizierung auch zu Rate gezogen wird.
Hierzu werden zwei Dateien benötigt, die wir als root an den entsprechenden Platz legen müssen.
Diese Datei als /etc/profile.d/vbox_vrdpauth.sh ablegen, sie muss _nicht_ ausführbar aber lesbar für alle Nutzer sein (0644).
Diese Datei als /etc/pam.d/vbox_auth ablegen, auch hier sollten die Dateirechte 0644 sein.
Nun entweder einmal abmelden/anmelden oder als normaler User einmalig
aufrufen.
4. Test des Zugriffs über RDP mit externer Authentifizierung
Nun starten wir eine virtuelle Maschine im "Headless Modus" für die wir unter 3. RDP-Zugriff eingerichtet haben, hierzu muss ihr Name bekannt sein.
Dieser entspricht dem Namen, den wir auch im VirtualBox-GUI sehen bzw. dem Namen des entsprechenden Ordners unter ~/.VirtualBox/Machines/.
Eine meiner Maschinen heißt "WindowsXP", also starte ich diese mit:
und erhalte folgende Ausgabe:
Der RDP-Server für diese Maschine läuft also auf Port 3389, der Parameter "-s NameDerMaschine" ist eigentlich selbsterklärend und "-vrdp on" sollte auch klar sein. Wer mehr wissen will, liest das Handbuch und/oder die Ausgabe von "VBoxHeadless --help".
Nun kann man sich mit dieser Maschine (lokal) verbinden, VirtualBox liefert einen RDP-Client mit, wer möchte, kann aber auch "rdesktop" statt "rdesktop-vrdp" verwenden (im Paket "rdesktop" enthalten).
Die Optionen "-p -" sorgen dafür, daß man nach dem Passwort per STDIN (also Eingabe über Tastatur) gefragt wird, Zugriff erfolgt über localhost auf Port 3389.
Dies kann man prüfen mit,
es sollte eine Zeile wie diese angezeigt werden.
Das dabei abgefragte Passwort ist _mein_ Nutzerpasswort auf dem _Host_, also das Passwort mit welchem ich mich an meiner Kiste anmelde (deshalb auch "externe" Authentifizierung), es scheint aber so, daß sich nur der Nutzer anmelden kann, der diese VM auch gestartet hat und natürlich kann auch immer nur ein Zugriff zur gleichen Zeit erfolgen.
Wer also mehreren Nutzern Zugriff ermöglichen möchte, der sollte einen extra Nutzer anlegen, welcher die entsprechenden VMs startet z.B. mit su:
und dessen Zugangsdaten den potentiellen Nutzern zur Verfügung stellen.
Wenn der Zugriff funktioniert, dann ist Teil 1 dieses HowTos abgeschlossen; sollte die "Headless"-Maschine mit ACPI installiert worden sein, so kann man sie nicht nur durch Anmelden über rdesktop und dann entsprechendes Herunterfahren ausschalten, sondern auch (meistens, nicht immer, sollte auf der Windowskiste gerade jemand angemeldet sein, dann fragt Windows erst nach, ob man wirklich herunterfahren möchte) mit
was dem Drücken des (wie der Parameter acpipowerbutton schon andeutet) "Power"-Schalters an einem "echten" PC entspricht, also in meinem Beispiel ein
und das virtuelle XP fährt herunter.
Dieser Teil des Tutorials ist von der Einrichtungsmethode des Netzwerks für den Gast unabhängig, wer nun auch Zugriff von außen auf die Maschine per RDP erlauben möchte, der muss nur noch den/die entsprechende(n) Port(s) in seiner Firewall/Router freischalten/weiterleiten.
Eine weitere Möglichkeit besteht darin, den entsprechenden Port _nicht_ frei zu schalten und Zugriff über einen SSH-Tunnel auf den Host zu ermöglichen, dann kann auch die Umstellung der Authentifizierung auf "Extern" weggelassen werden. Hierzu konsultiere man entsprechende HowTos/Literatur zum Thema SSH-Tunnel.
Im zweiten Teil des Howtos werden wir uns mit Zugriff über SSH, den entsprechenden "Port Forwarding"-Regeln für die NAT-Implementierung von VirtualBox und einigen Scripten beschäftigen, die das Ganze etwas erleichtern.
Greetz,
RM
In diesem Tutorial möchte ich die Einrichtung und Verwaltung sowie einige kleine, praktische Scripte vorstellen, die den Betrieb verschiedener, virtueller Maschinen mittels VirtualBox im so genannten "Headless Modus" verbunden mit der Möglichkeit des entfernten Zugriffs mittels SSH und/oder RDP auf selbige zum Ziel haben.
Die Netzwerkeinrichtung der virtuellen Maschinen wird dabei mit NAT (Standardeinstellung) vorgenommen, im Prinzip geht das auch mit einer der anderen Methoden, was mir persönlich an der NAT-Methode gefällt, man hat praktisch automatisch eine "Firewall", da der Host wie ein NAT-Router für den Gast agiert.
Die Einrichtung wird dadurch vielleicht etwas "komplizierter", aber dafür hat man mehr Kontrolle über den Gast, was z.B. auch bei Betriebssystemen aus dem Hause Microsoft von Vorteil sein kann, wenn das OS in der Standardinstallation alles an Ports öffnet, was bei drei nicht auf dem Baum ist und wovon die meisten Benutzer so gut wie gar nichts benötigen, aber als "Lösung" für diese IMHO eindeutige Fehlkonfiguration dann eine "Personal Firewall" davor schalten, die Dienste vor dem Zugriff schützt, die man eh nicht laufen lassen will.
Warum diese Dienste per default nicht einfach _ausgeschaltet_ sind, entzieht sich zwar meiner Logik, aber wahrscheinlich ist meine Logik in der Minderheit, denn >90% Marktanteil müssen schließlich logischer sein als etwas gesunder Menschenverstand.
Des weiteren wird auf eine sichere Möglichkeit des Zugriffs auf die "kopflosen" VMs Wert gelegt indem SSH bzw. RDP mit externer Authentifizierung eingerichtet und verwendet werden.
Als Host wurde openSUSE 11.1 (sowohl i586 als auch x86_64) verwendet, prinzipiell sollte sich dieses Tutorial aber auf alle Linuxdistributionen übertragen lassen.
0. Was ist dieser "Headless Modus" überhaupt?
Im so genannten Headless Modus läuft die virtuelle Maschine "im Hintergrund" ohne daß ein GUI-Fenster vorhanden ist, des Weiteren kann solch eine VM logischerweise auch dann gestartet und "remote" benutzt werden, wenn auf dem Host _kein_ X-Server läuft.
1. Und was bringt mir das?
Eines der Szenarien ist z.B., daß man einen kleinen Testserver in einer VM statt auf "echtem Eisen" laufen lassen möchte und dieser aber "von außen" wie ein Server auf einer "richtigen" Maschine erreichbar sein soll, ohne die Sicherheit des Hosts zu gefährden.
Eine weitere Möglichkeit ist auch, daß man ein anderes OS ab und zu für Testzwecke braucht, dieses aber nicht immer in einem Fenster auf dem Desktop/in der Taskleiste herumliegen haben sondern bei Bedarf darauf zugreifen möchte.
2. Aber wenn kein Fenster offen ist, wie kann ich dann auf die VM zugreifen?
Je nach Gast-OS gibt es mehrere Möglichkeiten, *NIX-artige Systeme bieten natürlich mit SSH eine einfache und sichere Methode, bei Windows greift man am einfachsten über RDP (Remote Desktop Protocol) zu (was auch für *NIX-artige Gast-OS zur Verfügung steht).
Da VirtualBox seine eigene RDP-Implementierung mitbringt, ist dies eine sehr einfache Möglichkeit (und für Windows-Gäste die einzige ohne Nachinstallieren irgendwelcher, weiterer Software auf dem Gast) um auf jegliche Art von VM via GUI zugreifen zu können. Zur Absicherung des Zugriffs über RDP wird Authentifizierung über das PAM-System des Hosts verwendet, für die Absicherung des SSH-Zugangs für *NIX-artige Gäste konsultiere man eines der zahlreichen Tutorials (Stichwort Pubkey statt Passwort).
3. Einrichten des Zugriffs über RDP mit externer Authentifizierung
1) Davon ausgehend, daß man schon eine (oder mehrere) virtuelle Maschinen hat, hier die Einrichtung von VRDP über das Standard-Interface von VirtualBox, die entsprechende VM darf dabei _NICHT_ laufen!
Code:
VirtualBox
=> Maschine auswählen => Anzeige => Fernsteuerung => Server aktivieren [x] ankreuzen => Einen Port > 1024 wählen (wichtig!) => "Authentisierungsmethode" von "Null" auf "Extern" umstellen => Server aktivieren [ ] Kreuz entfernen (das Regeln wir später über unsere Startscripte) => OK
Wer das Ganze von Hand machen will, der schaue im Handbuch nach und lese die Ausgaben von "VBoxManage --help"
2) Einrichtung von PAM für externe Authentifizierung
Die default-Einstellung für VRDP Authentifizierung lautet "Null" und das ist auch in etwa das, was sie aus Sicherheitsaspekten wert ist, denn so könnte _jeder_ lokale Nutzer auf die laufende VM zugreifen (sollte man den entsprechenden Port nach außen freigegeben haben/freigeben wollen, dann könnte das auch jeder Hansel aus dem Internet), das ist natürlich indiskutabel.
Nun müssen wir aber PAM beibringen, daß es für diese externe Authentifizierung auch zu Rate gezogen wird.
Hierzu werden zwei Dateien benötigt, die wir als root an den entsprechenden Platz legen müssen.
Code:
# enable PAM-Authentification for VBOX-RDP
export VRDP_AUTH_PAM_SERVICE="vbox_vrdpauth"
#######################################################################################
## Don't forget to create a file /etc/pam.d/vbox_vrdpauth with the following content ##
## ##
## auth required pam_unix.so ##
## account required pam_unix.so ##
#######################################################################################
Code:
auth required pam_unix.so
account required pam_unix.so
Nun entweder einmal abmelden/anmelden oder als normaler User einmalig
Code:
source /etc/profile.d/vbox_vrdpauth.sh
4. Test des Zugriffs über RDP mit externer Authentifizierung
Nun starten wir eine virtuelle Maschine im "Headless Modus" für die wir unter 3. RDP-Zugriff eingerichtet haben, hierzu muss ihr Name bekannt sein.
Dieser entspricht dem Namen, den wir auch im VirtualBox-GUI sehen bzw. dem Namen des entsprechenden Ordners unter ~/.VirtualBox/Machines/.
Eine meiner Maschinen heißt "WindowsXP", also starte ich diese mit:
Code:
VBoxHeadless -s WindowsXP -vrdp on&
Code:
VirtualBox Headless Interface 3.0.10
(C) 2008-2009 Sun Microsystems, Inc.
All rights reserved.
Listening on port [B]3389[/B]
Nun kann man sich mit dieser Maschine (lokal) verbinden, VirtualBox liefert einen RDP-Client mit, wer möchte, kann aber auch "rdesktop" statt "rdesktop-vrdp" verwenden (im Paket "rdesktop" enthalten).
Code:
rdesktop-vrdp -p - localhost:3389
Autoselected keyboard map de
Password:
Dies kann man prüfen mit,
Code:
netstat -tulpen
Code:
tcp 0 0 0.0.0.0:[B]3389 [/B] 0.0.0.0:* [B]LISTEN [/B] 1000 945121 -
Wer also mehreren Nutzern Zugriff ermöglichen möchte, der sollte einen extra Nutzer anlegen, welcher die entsprechenden VMs startet z.B. mit su:
Code:
su - NamedesSpezialnutzers -c "VBoxHeadless -s NamederMaschine -vrdp on&"
Wenn der Zugriff funktioniert, dann ist Teil 1 dieses HowTos abgeschlossen; sollte die "Headless"-Maschine mit ACPI installiert worden sein, so kann man sie nicht nur durch Anmelden über rdesktop und dann entsprechendes Herunterfahren ausschalten, sondern auch (meistens, nicht immer, sollte auf der Windowskiste gerade jemand angemeldet sein, dann fragt Windows erst nach, ob man wirklich herunterfahren möchte) mit
Code:
VBoxManage controlvm NamederMaschine acpipowerbutton
Code:
VBoxManage controlvm WindowsXP acpipowerbutton
Dieser Teil des Tutorials ist von der Einrichtungsmethode des Netzwerks für den Gast unabhängig, wer nun auch Zugriff von außen auf die Maschine per RDP erlauben möchte, der muss nur noch den/die entsprechende(n) Port(s) in seiner Firewall/Router freischalten/weiterleiten.
Eine weitere Möglichkeit besteht darin, den entsprechenden Port _nicht_ frei zu schalten und Zugriff über einen SSH-Tunnel auf den Host zu ermöglichen, dann kann auch die Umstellung der Authentifizierung auf "Extern" weggelassen werden. Hierzu konsultiere man entsprechende HowTos/Literatur zum Thema SSH-Tunnel.
Im zweiten Teil des Howtos werden wir uns mit Zugriff über SSH, den entsprechenden "Port Forwarding"-Regeln für die NAT-Implementierung von VirtualBox und einigen Scripten beschäftigen, die das Ganze etwas erleichtern.
Greetz,
RM