qemu, kvm, xen & libvirtHauptseite | Über | Hilfe | FAQ | Spezialseiten | Anmelden

Druckversion | Impressum | Datenschutz

dhcp, dns, VNC, SASL, x509, TLS, TFTP Server, PXE boot, gPXE, NBD, BKO, certtool

(Link zu dieser Seite als [[QEMU-KVM-Buch/ Netzwerkoptionen/ Netzwerkdienste]])

<<<|###| >>> | English


Eine Samba-Freigabe für ein Gast-System.
Eine Samba-Freigabe für ein Gast-System.
Der integrierte TFTP-Server erlaubt dem Gast-System (hier Linux) das Herunterladen von Dateien vom Host-System.
Der integrierte TFTP-Server erlaubt dem Gast-System (hier Linux) das Herunterladen von Dateien vom Host-System.
Der TFTP-Client von Microsoft Windows.
Der TFTP-Client von Microsoft Windows.
QEMU versucht über das Netzwerk zu booten.
QEMU versucht über das Netzwerk zu booten.
Installation von Ubuntu per PXE über das Netzwerk.
Installation von Ubuntu per PXE über das Netzwerk.
Der Terminal Server Client von Ubuntu.
Der Terminal Server Client von Ubuntu.
Der VNC-Viewer TightVNC.
Der VNC-Viewer TightVNC.
Der SPICE-Client.
Der SPICE-Client.

Inhaltsverzeichnis

[bearbeiten] Netzwerkdienste

[bearbeiten] DHCP und DNS

Der in QEMU integrierte DHCP-Server (Dynamic Host Configuration Protocol) unterstützt eine automatische Netzwerkkonfiguration der Gast-Systeme im Usermode Network Stack. Damit ist mit fast allen netzwerkfähigen Gast-Betriebssystemen eine sofortige Netzwerkverbindung nach außen möglich. Sind die Optionen -net nic -net user angegeben, wird für das virtuelle Netzwerk (10.0.2.0) ein interner DHCP-Server (10.0.2.2) und DNS-Server (10.0.2.3) aktiviert. Den Gast-Systemen werden IP-Adressen ab 10.0.2.15 zugewiesen.

Host ~$ qemu-system-x86_64 Platte.img -net nic -net user

Da die Optionen -net nic -net user per Default aktiviert sind, können diese weggelassen werden.

Host ~$ qemu-system-x86_64 Platte.img

Mit -net user,hostname=host wird ein vom integrierten DHCP-Server zugewiesener DNS-Namen für das Gast-System definiert. In diesem Beispiel erhält die IP-Adresse des Gast-Systems den DNS-Eintrag knut.

Host ~$ qemu-system-x86_64 Platte.img -net nic -net user,hostname=knut

Die Option dhcpstart=addr definiert die erste Adresse des IP-Bereiches, die der DHCP-Server zuweisen kann. Dieser Bereich umfasst 16 IP-Adressen. Per Default liegt dieser Bereich zwischen x.x.x.16 und x.x.x.31. Zum Beispiel wird mit dhcpstart=10.0.2.50 per DHCP dem Gast-System eine IP-Adresse ab 10.0.2.50 vorgegeben.

Host ~$ qemu-system-x86_64 Platte.img -net nic -net user,dhcpstart=10.0.2.50

Die Option dns=addr definiert die für das Gast-System sichtbare IP-Adresse des integrierten DNS-Servers. Per Default ist dies die dritte IP-Adresse in dem Gast-Netzwerk, zum Beispiel x.x.x.3. In diesem Beispiel wird dem DNS-Server die IP-Adresse 10.0.2.7 zugewiesen. Diese Adresse wird dem Gast-System per DHCP mitgeteilt.

Host ~$ qemu-system-x86_64 Platte.img -net nic -net user,dns=10.0.2.7

Neben der automatischen Konfigurierung per DHCP kann im Gast-System die Netzwerkkonfiguration auch manuell erfolgen. Als Gateway muss die IP-Adresse 10.0.2.2 eingestellt werden. Die IP-Adresse der virtuellen Netzwerkkarte kann im Netzsegment 10.0.2.0 ab 10.0.2.15 konfiguriert werden. Auch können andere oder zusätzliche DNS-Server eingetragen werden. Konfiguriert man zum Beispiel einen DNS-Server entsprechend der Anleitung unter http://www.opennicproject.org im Gast-System, können die Top-Level-Domains .glue, .indy, .geek, .null, .oss und .parody des OpenNIC-Projektes aufgelöst werden.

[bearbeiten] Samba

Samba ist eine freie Software-Suite, die das Server Message Block Protocol (SMB) für Unix-Systeme verfügbar macht. Das heißt, mit Samba werden Windows-Freigaben unter Unix/Linux erzeugt. QEMU ermöglicht mit Samba einen Datenaustausch zwischen dem Host und den Gast-Systemen. Wurde auf dem Host-System bereits ein Samba-Server installiert und konfiguriert, wird im Gast-System auf dessen Freigaben über die URL \\10.0.2.4\ zugegriffen. Da QEMU kein eigenen Samba-Server enthält, ist auf dem Host-System ein Samba-Server zu installieren. Unter Debian oder Ubuntu ist die Installation mit einer Befehlszeile erledigt.

Host ~$ sudo apt-get install samba

Weiterhin wird ein Verzeichnis auf dem Host-System als Freigabe benötigt. Der Samba-Server muss Lese- und Schreibrechte für dieses Verzeichnis haben. Mit der Option -net user,smb=directory wird der Samba-Server (/usr/sbin/smbd) mit einer eigenen Konfiguration gestartet. Damit der Samba-Server aufgerufen werden kann, muss der Benutzer, unter dem QEMU laufen soll, die Berechtigung zum Starten des Samba-Servers haben. Eine Variante ist es QEMU mit sudo aufzurufen.

Host ~$ sudo qemu Platte.img -net nic -net user,smb=/tmp/
Password: *****

Der Samba-Server hat die IP-Adresse 10.0.2.4. Im Microsoft Windows-Gast-System greift man im Dateimanager auf diese Freigabe zu (Menü Extras, Netzwerklaufwerk verbinden: \\10.0.2.4\qemu). Wer lieber einen Host-Namen für den Samba-Server nutzen möchte, kann der IP-Adresse einen Namen zuweisen. Dazu ist im Gast-System je nach Windows-Version in einer der Dateien C:\WINNT\SYSTEM32\DRIVERS\ETC\LMHOSTS, C:\WINDOWS\LMHOSTS oder C:\WINNT\SYSTEM32\DRIVERS\ETC\HOSTS die folgende Zeile hinzuzufügen.

10.0.2.4 smbserver

Optional kann die IP-Adresse des Samba-Servers mit der Option smbserver geändert werden. In diesem Beispiel wird dem Samba-Server die Adresse 10.0.2.7 zugewiesen.

Host ~$ sudo qemu Platte.img \
-net nic -net user,smb=/tmp/,smbserver=10.0.2.7

[bearbeiten] TFTP

Das Trivial File Transfer Protocol (TFTP) ist ein einfaches Dateiübertragungsprotokoll. Es unterstützt lediglich das Lesen und Schreiben von Dateien. Nicht vorhanden sind viele Funktionen des mächtigeren FTP wie etwa Rechtevergabe, Anzeigen der vorhandenen Dateien oder Benutzerauthentifizierung. Motivation für die Entwicklung von TFTP war das Laden von Betriebssystemen oder Konfigurationen über das Netzwerk. Hierfür ist das verbindungsorientierte TCP und das darauf aufsetzende FTP viel zu überladen. TFTP ist dagegen bewusst einfach gehalten. Der in QEMU integrierte TFTP-Server (IP-Adresse 10.0.2.2) erlaubt es auf einfache Weise, einzelne Dateien des Host-Systems dem Gast-System zum Herunterladen zur Verfügung zu stellen. Auf dem Gast-System muss dazu ein TFTP-Client installiert und im Binär-Modus konfiguriert sein. Aktiviert wird der TFTP-Server mit der Option -net user,tftp gefolgt vom Pfad zum Download-Verzeichnis. Dazu ist die Unix-Schreibweise anzuwenden. Ist der Host ein Microsoft-Windows-System, ist anstelle von C:\Users\User01 die Schreibweise /Users/Users01 anzuwenden. Ein Wechsel von Laufwerken ist nicht möglich. Das folgende Beispiel ermöglicht das Herunterladen von Dateien im Verzeichnis /tmp des Host-Systems.

Host ~$ qemu-system-x86_64 Platte.img -net nic -net user,tftp=/tmp/

Falls nicht vorhanden, muss im Gast-System noch ein TFTP-Client installiert werden. Ist das Gast-System ein Debian-Derivat, ist das Paket tftp zu verwenden.

Gast ~$ sudo apt-get install tftp

Das Herunterladen einer Datei vom Host per TFTP erfolgt mit diesen Befehlen:

Gast ~$ tftp 10.0.2.2
tftp> binary
tftp> get bla.txt
tftp> quit

Unter Microsoft Windows NT, -2000 und -XP ist bereits ein TFTP-Client über die DOS-Eingabeaufforderung verfügbar.

Gast C:\> tftp -i 10.0.2.2 GET bla.txt

[bearbeiten] PXE

Das Preboot Execution Environment (PXE) ermöglicht einen netzwerkbasierten Boot-Vorgang. PXE verwendet die Protokolle TCP/IP, UDP, DHCP, TFTP sowie die Konzepte GUID/UUID, UNDI (Universal Network Device Interface) und eine client-seitige Firmware-Erweiterung mit festgelegten APIs. Mit einem PXE-fähigen Rechner ist es möglich, über das Netzwerk von einem Boot-Server booten. Dies ist notwendig, wenn auf einem Rechner ohne Zufügen von Speichermedien ein Betriebssystem installiert oder ein Thinclient-System aufgebaut werden soll. Der Netzwerk-Bootvorgang wird durch ein auf der Netzwerkkarte installiertes BIOS initiiert. Der Boot-Vorgang läuft dabei folgendermaßen ab: Die Firmware stellt per DHCP eine Anfrage, um den PXE-Boot-Server zu ermitteln. Nach Empfang einer Antwort kontaktiert sie den passenden Boot-Server, um von ihm den Pfad zum Herunterladen des NBP (Network Bootstrap Program) übermittelt zu bekommen. Dieser Bootloader wird anschließend in den Arbeitsspeicher geladen und ausgeführt. In QEMU wurde ab Version 0.12.0 der Netzwerk-Booloader gPXE (http://etherboot.org) integriert. gPXE ergänzt PXE mit zusätzlichen Funktionen. Zum Beispiel wird neben FTP auch HTTP und iSCSI unterstützt.

Mit der Option -boot n|o|p wird das Booten über Netzwerk ermöglicht. Wobei mit n die 1. Netzwerkkarte, o die 2. Netzwerkkarte und p die 3. Netzwerkkarte adressiert wird. Für das Booten über das Netzwerk werden die entsprechenden PXE-ROM-Images der Netzwerkkarten benötigt.

Host ~$ qemu-system-x86_64 -boot n
No valid PXE rom found for network device

In diesem Fall findet QEMU kein PXE-ROM-Image. Man lädt PXE-ROM-Images von den URLs http://etherboot.org und http://rom-o-matic.net herunter. Unter Linux sind diese in die Verzeichnisse /usr/share/kvm/ oder /usr/share/qemu/ zu kopieren. Eleganter ist die Installation des entsprechenden Paketes.

Host ~$ sudo apt-get install kvm-pxe

Es werden dabei die PXE-ROM-Images nur in das Verzeichnis /usr/share/kvm/ kopiert.

Host ~$ dpkg -L kvm-pxe | grep ".bin" 
/usr/share/kvm/pxe-e1000.bin
/usr/share/kvm/pxe-ne2k_pci.bin
/usr/share/kvm/pxe-pcnet.bin
/usr/share/kvm/pxe-rtl8139.bin
/usr/share/kvm/pxe-virtio.bin

QEMU sucht die PXE-ROM-Images unter /usr/share/qemu/. Man muss den Pfad mit der Option -option-rom angeben.

Host ~$ qemu-system-x86_64 -boot n -option-rom /usr/share/kvm/pxe-ne2k_pci.bin

Besser ist es, mit Symlinks im Verzeichnis /usr/share/qemu/ auf die entsprechenden PXE-ROM-Images im Verzeichnis /usr/share/kvm/ zu verweisen.

Host ~$ cd /usr/share/kvm
Host ~$ sudo for i in `ls pxe*` ; do \
        ln -s /usr/share/kvm/$i /usr/share/qemu/ ; done
Host ~$ qemu-system-x86_64 -boot n

Mit PXE ist es möglich, Betriebssysteme über das Netzwerk zu installieren. In diesem Beispiel ist es Ubuntu. Zuerst ist ein Verzeichnis anzulegen. Dann ist das Netboot-Archiv herunterzuladen und zu entpacken.

Host ~$ sudo mkdir /netboot
Host ~$ cd /netboot
Host ~$ sudo wget \
http://archive.ubuntu.com/ubuntu/dists/karmic/main/installer-i386/current/images/netboot/netboot.tar.gz
Host ~$ sudo tar xzvf netboot.tar.gz

In einem beliebigen Verzeichnis wird die virtuelle Festplatte für die Installation generiert und danach QEMU mit den entsprechenden Optionen gestartet. Der Parameter bootfile definiert die BOOTP-Datei. Die Installation von Ubuntu wird in dem Abschnitt Gast-Systeme (http://qemu-buch.de/d/Gast-Systeme/_x86-Architektur/_Linux) beschrieben.

Host ~$ qemu-img create -f qcow2 ubuntu.img 10G
Host ~$ qemu-system-x86_64 -hda ubuntu.img -boot n \
-net nic -net user,tftp=/netboot/,bootfile=pxelinux.0

Mit den Optionen zum Booten über das Netzwerk ist es weiterhin möglich Diskless Clients für das Linux Terminal Server Project (http://www.ltsp.org) zu emulieren. Zum Beispiel verwendet die Linux-Distribution Eubuntu einen LTSP-Server, um Clients ohne Festplatte zu unterstützen. Benötigt wird das Paket ltsp-server.

Host ~$ sudo apt-get -s install ltsp-server

Dieses Paket enthält Werkzeuge, um eine LTSP-Umgebung (http://wiki.ubuntuusers.de/LTSP) zu installieren. Der folgende Befehl installiert eine LTSP-Umgebung unter /opt/ltsp/i386/.

Host ~$ sudo ltsp-build-client

Per Network Block Device (NBD) wird das LTSP-Images bereitgestellt. Der Befehl sudo ltsp-update-image generiert diese im Verzeichnis /opt/ltsp/images. Danach müssen die entsprechenden Dienste neu gestartet werden.

Host ~$ sudo ltsp-update-image --arch i386
Host ~$ sudo /etc/init.d/dhcdbd restart
Host ~$ sudo /etc/init.d/tftpd-hpa restart
Host ~$ sudo /etc/init.d/openbsd-inetd restart

QEMU wird mit folgenden Optionen gestartet.

Host ~$ sudo qemu -net nic -net tap -boot n -vga std -monitor stdio

[bearbeiten] VNC

Virtual Network Computing (VNC) ermöglicht es den Bildschirminhalt eines Rechners (auf dem der VNC-Server läuft) auf einem anderen Rechner (auf dem der VNC-Viewer läuft) anzuzeigen und im Gegenzug Tastatur- und Maus-Bewegungen zurück zu senden. Damit ist ein Remote-Zugriff auf den Desktop eines anderen Rechners möglich. Da es VNC-Server und -Viewer für fast alle gängigen Betriebssysteme gibt, sind Remote-Zugriffe auf Rechner mit anderen Betriebssystemen möglich. Ein weiterer Vorteil von VNC ist, dass gestartete Programme unabhängig von der VNC-Session weiterlaufen. Beim erneuten Einloggen per VNC findet man den Desktop wieder so vor, wie man ihn verlassen hat. QEMU enthält einen internen VNC-Server der einen Remote-Zugriff auf das Gast-System ermöglicht. Im Gast-System muss dazu kein VNC-Server installiert sein. Für eine Verbindung zum VNC-Server wird ein VNC-Viewer benötigt. Bei der Linux-Distribution Ubuntu Desktop zum Beispiel ist bereits ein solcher installiert. Aufgerufen wird er über das Menü Anwendungen, Internet, Terminal Server Client. Falls noch kein VNC-Viewer auf dem System vorhanden ist, wird vinagre oder ein anderer VNC-Client installiert. Hier als Beispiel die Installation unter einem Linux-Debian-Derivat.

Host ~$ sudo apt-get install vinagre

Den VNC-Server aktiviert die Option -display vnc= gefolgt von dem Host-Namen und einer Ziffer. Die Ziffer kennzeichnet den VNC-Server auf dem Host-Rechner, da mehrere VNC-Server gleichzeitig aufgerufen werden können. Zu empfehlen ist dazu die Option -k de. Diese aktiviert die deutsche Tastatur.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=localhost:1 

Bei alten QEMU-Versionen ist die Option -vnc anzuwenden.

Host ~$ qemu-system-x86_64 Platte.img -k de -vnc localhost:1

Bei der Option -display vnc= erscheint keine Bildschirmausgabe. Man startet einen VNC-Viewer. Laufen VNC-Server und VNC-Viewer auf dem gleichen Rechner, gibt man als Option für den VNC-Viewer localhost:1 ein. Läuft der VNC-Server auf einem anderen Rechner, ist dessen Rechnername beziehungsweise IP-Adresse anzugeben.

Host ~$ vinagre localhost:1

Man kann eine zweite Instanz mit einem aktivierten VNC-Server starten. Dazu muss dieser die Ziffer 2 erhalten.

Host ~$ qemu-system-x86_64 Platte.img -k de display vnc=localhost:2 

Wird auch ein SDL-Fenster gewünscht, ist zusätzlich die Option -display sdl anzugeben.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=localhost:1 -display sdl 

Nützlich ist in Verbindung mit der Option -display vnc auch die Option -usbdevice tablet. Diese stellt eine spezielle Maus-Emulation bereit, die den Maus-Zeiger nicht mehr im Fenster der Instanz festhält. Wird das Fenster mit dem Maus-Zeiger verlassen, wird die Kontrolle über den Maus-Zeiger wieder vom Host-System übernommen.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=:1 -usbdevice tablet 

Die Option lossy ermöglicht eine verlustbehaftete Kompressionsmethode (gradient, JPEG, ...). Wird diese Option aktiviert, kann es zu verlustbehafteten Aktualisierungen des Bildschirmaufbaus kommen. Es wird dabei eine wesentlich geringere Bandbreite benötigt. Die Option -monitor stdio leitet den QEMU-Monitor auf die Konsole um.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=:1,lossy -monitor stdio

Im QEMU-Monitor gibt der Befehl info vnc Status-Informationen aus.

(qemu) info vnc
Server:
     address: 0.0.0.0:5901
        auth: none
Client:
     address: 127.0.0.1:57434
  x509_dname: none
    username: none

Die Aktivierung des VNC-Servers kann mit der Option -display vnc=none unterbunden werden. Die Konfiguration des VNC-Servers erfolgt dann im QEMU-Manager mit dem Befehl change vnc. Die Parameter entsprechen denen der Option -vnc.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=none -monitor stdio 
(qemu) info vnc
VNC server disabled
(qemu) change vnc localhost:1

Auch eine VNC-Reverse-Verbindung ist möglich. Dazu ist ein VNC-Viewer im Listen-Modus zu starten. Eine Instanz kann sich danach mit der Option reverse zu diesem VNC-Viewer verbinden. In diesem Beispiel wird vinagre im Listen-Modus betrieben.

Host ~$ vinagre

Im Menü Rechner, Umgekehrte Verbindungen aktiviert man den Listen-Modus. Danach wird eine Instanz mit der Option reverse gestartet. Dazu ist der Host-Name, hier localhost, und das Port anzugeben. Der Default-Wert für das Port ist 5500. Ist alles richtig konfiguriert, erscheint die VNC-Ausgabe auf dem Ziel-Rechner.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=localhost:5500,reverse


Eine VNC-Verbindung sollte gesichert sein. Eine einfache Möglichkeit ist die Zugangseinschränkung mit einem Passwort. Das VNC-Protokoll beschränkt die Länge der Passwörter auf acht Zeichen und bietet nur geringen Schutz. Der Passwort-Schutz wird mit dem Parameter password aktiviert.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=:1,password -monitor stdio

Das Passwort wird im QEMU-Monitor mit dem Befehl change vnc password gesetzt.

(qemu) change vnc password
Password: ********

Dies ist auch mit dem Befehl set_password vnc mögllich. Dabei wird das Passwort im Klartext übergeben.

(qemu) set_password vnc geheim

Einen weiteren Schutz bietet die Authentifizierung mit x509-Zertifikaten und die Verschlüsselung der Session mit TLS (Transport Layer Security). Zur Erzeugung der Zertifikate dient das Programm certtool. Die Installation unter Ubuntu ist mit einer Befehlszeile erledigt.

Host ~$ sudo apt-get install gnutls-bin

Alternativ lädt man certtool von der Website http://www.gnu.org/software/gnutls/ herunter und installiert es. Die Windows-Version ist von der URL http://josefsson.org/gnutls4win/ zu beziehen. Diese Anleitung bezieht sich auf die Linux-Version. Es ist zu empfehlen für die Zertifikate ein eigenes Verzeichnis anzulegen. Diese können entweder vom Benutzer root in /etc/pki/qemu oder für andere Benutzer in $HOME/.pki/qemu abgelegt werden.

Host ~$ sudo -i
Host ~# mkdir -p /etc/pki/qemu
Host ~# cd /etc/pki/qemu

Zur Signierung der Keys ist eine Certificate Authority (CA) notwendig. Diese kann eine offizielle CA oder eine selbst signierte CA sein. In diesem Beispiel wird eine selbst signierte CA erzeugt. Dazu ist einmalig ein privater Key für die CA anzulegen. Dieser Key muss sicher aufbewahrt werden. Keineswegs darf er in falsche Hände geraten.

Host ~# certtool --generate-privkey > ca-key.pem

Dieser Key wird nur für den Eigentümer lesbar gesetzt.

Host ~# chmod 0600 ca-key.pem

Basierend auf dem privaten Key und Angaben zur Organisation und Konfiguration wird ein öffentlicher Key erstellt. Die Angaben werden dazu in eine Textdatei geschrieben. Der Name der Datei ist ca.info. Hier ein Beispiel für deren Inhalt.

cn = Name ihrer Organisation
ca
cert_signing_key

Es wird mit certtool der öffentliche Key angelegt.

Host ~# certtool --generate-self-signed     \
                 --load-privkey ca-key.pem  \
                 --template ca.info         \
                 --outfile ca-cert.pem

Der öffentliche Key (ca-cert.pem) muss auf allen Servern und VNC-Clients kopiert werden. Die Hosts mit installiertem QEMU werden hier als Server bezeichnet. Weiterhin benötigt jeder Server einen privaten Key und ein Zertifikat. Der private Key wird mit folgendem Befehl erzeugt.

Host ~# certtool --generate-privkey > server-key.pem

Dieser private Key wird nur auf dem vorgesehenen Server anlegt. Dort wird er nur für den Eigentümer lesbar gesetzt.

Host ~# chmod 0600 server-key.pem

Auch jeder Server benötigt ein Zertifikat. Die notwendigen Angaben werden in eine Textdatei geschrieben. Der Name der Datei ist server.info. Hier ein Beispiel für deren Inhalt.

organization = Name ihrer Organisation
cn = server.foo.example.com
tls_www_server
encryption_key
signing_key

Es wird mit certtool das Zertifikat generiert.

Host ~# certtool --generate-certificate            \
                 --load-ca-certificate ca-cert.pem \
                 --load-ca-privkey ca-key.pem      \
                 --load-privkey server-key.pem     \
                 --template server.info            \
                 --outfile server-cert.pem

Das Zertifikat server-cert.pem wird nur auf dem vorgesehenen Server angelegt. Es müssen noch die VNC-Clients ihre Keys und Zertifikate erhalten. Der private Key wird mit diesem Befehl erzeugt.

Host ~# certtool --generate-privkey > client-key.pem

Dieser Key wird nur auf dem vorgesehenen Client angelegt. Dort wird er nur für den Eigentümer lesbar gesetzt.

Host ~# chmod 0600 client-key.pem

Wenn bei dem Server die Option x509verify verwendet wird, benötigt der Client ein Zertifikat. Die notwendigen Angaben werden in eine Textdatei geschrieben. Der Name der Datei ist client.info. Hier ein Beispiel für deren Inhalt.

country = DE
state = Berlin
locality = Berlin
organization = Name ihrer Organisation
cn = client.foo.example.com
tls_www_client
encryption_key
signing_key

Es wird mit certtool das Zertifikat angelegt und nur auf dem vorgesehenen VNC-Client kopiert.

Host ~# certtool --generate-certificate            \
                 --load-ca-certificate ca-cert.pem \
                 --load-ca-privkey ca-key.pem      \
                 --load-privkey client-key.pem     \
                 --template client.info            \
                 --outfile client-cert.pem
Host ~# exit

Mit den Parametern x509 und tls der Option -display vnc werden die generierten Zertifikate verwendet.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=:1,tls,x509=/etc/pki/qemu -monitor stdio

Im QEMU-Monitor gibt der Befehl info vnc Status-Informationen aus.

(qemu) info vnc
Server:
    address: 0.0.0.0:5901
       auth: vencrypt+x509+none
Client: none

Mit dem Parameter x509verify fordert der Server vom Client dessen gültiges Zertifikat an.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=:1,tls,x509verify=/etc/pki/qemu

Die höchste Sicherheit wird durch die zusätzliche Definition eines Passwortes erreicht.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=:1,tls,x509verify=/etc/pki/qemu,password

QEMU unterstützt die Authentifizierung des VNC-Zugriffs mit dem Simple Authentication and Security Layer (SASL). SASL bietet dem Applikationsprotokoll eine standardisierte Möglichkeit der Aushandlung von Kommunikationsparametern zwischen Server und Client. Es können unter anderem die Authentifizierungsmethoden PAM, GSSAPI/Kerberos, LDAP, SQL-Datenbank und Einmal-Keys angewendet werden. Durch die Konfiguration der jeweiligen SASL-Implementierungen wird ein Verfahren festgelegt. Wurde QEMU mit der Unterstützung für SASL kompiliert erfolgt dies durch die SASL-Konfigurationsdatei /etc/sasl2/qemu.conf. Alternativ kann auf eine andere Konfigurationsdatei mit der Variable SASL_CONF_PATH verwiesen werden. Für eine einfache Verschlüsselung mit Passwörtern hat die Datei /etc/sasl2/qemu.conf folgenden Inhalt.

# /etc/sasl2/qemu.conf
mech_list: digest-md5
sasldb_path: /etc/sasl2/qemu.db

Zur Definition von SASL-Passwörtern ist das Paket sasl2-bin zu installieren (Beispiel Ubuntu).

Host ~$ sudo -i
Host ~# apt-get install sasl2-bin

Mit dem Programm saslpasswd2 werden die jeweiligen Zugangsdaten in die SASL-Datenbank geschrieben. Hier wird der Benutzer ich mit dem Passwort geheim angelegt.

Host ~# saslpasswd2 -f /etc/sasl2/qemu.db ich
Password:                 geheim
Again (for verification): geheim

Übrigens löscht man einen Benutzer in der SASL-Datenbank mit der Option -d.

Host ~# saslpasswd2 -f /etc/sasl2/qemu.db -d ich

Die angelegten Accounts listen man mit folgenden Befehl auf.

Host ~# sasldblistusers2 -f /etc/sasl2/qemu.db
ich@localhost.localdomain: userPassword
Host ~# exit

QEMU wird mit der Option -display vnc=:1,sasl gestartet.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=:1,sasl 

Leider beherrschen nicht alle VNC-Clients das SASL-Protokoll. Neben dem virt-viewer und dem virt-manager (siehe Abschnitt libvirt) beherrscht vinagre Version 2.26.1 das SASL-Protokoll. Nach dem Start wird nach dem mit saslpasswd2 angelegten Benutzer gefragt.

Host ~$ vinagre localhost:1

Zusätzliche Sicherheit bringt die Verwendung von Zugriffssteuerungslisten (Access Control Lists - ACL). Dazu muss QEMU mit der Unterstützung für ACL kompiliert worden sein. Bei x509-Client-Zertifikaten wird der Distinguished Name getestet. Dieser hat zum Beispiel die Form C=DE,O=BLA,L=Berlin,CN=ich. Bei SASL wird der Benutzername überprüft. Je nach verwendeten SASL-Plugin kann der Benutzername beispielsweise in den Formen ich oder ich@beispiel.de angegeben werden. Wenn der acl-Flag gesetzt wird ist die Zugriffssteuerungsliste leer und verfügt nur über die Deny-Policy. Dadurch wird verhindert, dass jemand unerlaubten Zugriff erhält solange der VNC-Server noch keine ACL geladen hat. Aktiviert wird die Verwendung von ACL mit der Option acl.

Host ~$ qemu-system-x86_64 Platte.img -k de -display vnc=:1,sasl,acl -monitor stdio 

Zum Anzeigen der Zugriffssteuerungsliste dient der Befehle acl_show im QEMU-Monitor. Dieser listet alle Regeln der Zugriffssteuerungsliste und der Default-Policy auf. Es gibt zwei benannte Zugriffssteuerungslisten: Während vnc.x509dname auf den Distinguished Name testet überprüft vnc.username auf den SASL-Benutzernamen.

(qemu) acl_show vnc.username
policy: deny

Mit folgenden Befehl wird der Liste vnc.username der Zugang gewährt.

(qemu) acl_policy vnc.username allow
acl: policy set to 'allow'
(qemu) acl_show vnc.username
policy: allow

Der Benutzer ich erhält Zugangsberechtigung.

(qemu) acl_add vnc.username ich allow
acl: added rule at position 1
(qemu) acl_show vnc.username
policy: allow
1: allow ich

Der Benutzer ich kann sich mit einem VNC-Client mit SASL-Unterstützung mit der Instanz verbinden. Der Zugang wir mit dem folgenden Befehl wieder gesperrt.

(qemu) acl_remove vnc.username ich
acl: removed rule at position 1

Mit folgenden Befehl wird der Liste vnc.username die Zugangsberechtigung entzogen.

(qemu) acl_reset vnc.username
acl: removed all rules
(qemu) acl_show vnc.username
policy: deny

[bearbeiten] SPICE

Website: http://www.spice-space.org

Das Simple Protocol for Independent Computing Environments (SPICE) ist eine Lösung zur Unterstützung von Zugriffen auf Remote-Maschinen. Gegenüber VNC bietet es eine optimierte Kommunikation und bessere Multimedia-Unterstützung. Mehrere Kompressionsalgorithmen stehen für die Bild- und Video-Übertragung zur Verfügung. SPICE besteht aus den Komponenten SPICE-Protokoll, SPICE-Server, SPICE-Client. Optional optimieren ein QXL-Device und ein QXL-Treiber im Gast-System die Darstellung und Kommunikation. Ein optionaler SPICE-Agent im Gast-System unterstützt unter anderem Copy und Paste zwischen Client- und Gast-System.

Der SPICE-Client ist die Schnittstelle zum Benutzer und wird auf seinem Arbeitsplatzrechner (Linux, Windows) installiert. Der Client kommuniziert mit dem SPICE-Server über mehrere Channels (Kanäle), die jeweils verschlüsselt oder unverschlüsselt übertragen werden können. Ab Version 0.14.0 beginnt man einen SPICE-Server in QEMU zu integrieren. Dieser wird mit der Option -spice aktiviert. Der SPICE-Server in QEMU kommuniziert mit dem Gast-System. Mit der Option -vga qxl wird für die QEMU-Instanz ein QXL-Device aktiviert. QXL-Treiber und -Agent stehen auf der SPICE-Website zum Download zur Verfügung und werden im Gast-System (Linux, Windows) installiert. 2D-vektorisierte Primitive werden mit Cairo realisiert. 3D-Beschleunigung erfolgt unter Microsoft Windows mit GDI (Microsoft Windows Graphic Device Interface) und unter Linux mit Open GL. Entwickelt wird SPICE von der Firma Red Hat, Inc. als Open Source.

Zur Installation des SPICE-Clients unter Microsoft Windows wird von der SPICE-Website das Archiv spice-client-win32-*.zip heruntergeladen und in ein Verzeichnis entpackt. Weiterhin wird das Archiv spice_libs_win32_*.zip benötigt. Es enthält die notwendigen DLL-Dateien. Diese werden auch in das neue Verzeichnis kopiert. Anschließend wird der Client mit spice.exe aufgerufen.

Da SPICE von der Firma Red Hat, Inc. entwickelt wird, ist die Installation unter den verwandten Distributionen (Red Hat, CentOS, Fedora) einfach.

Host ~$ su -c "yum install spice-client" 

Unter aktuellen Ubuntu-Version ist das Paket spice-client vorhanden.

Host ~$ sudo apt-get install spice-client 

Unter Ubuntu 10.* ist der SPICE-Client zu kompilieren. Dies ist aber nur unter der 64-Bit-Version erfolgreich. Zum Kompilieren sind diese Pakete notwendig:

Host ~$ sudo apt-get install libtool liblog4cpp5-dev libavcodec-dev libssl-dev 
Host ~$ sudo apt-get install xlibmesa-glu-dev libasound-dev libpng12-dev 
Host ~$ sudo apt-get install libfreetype6-dev libfontconfig1-dev libogg-dev 
Host ~$ sudo apt-get install libxrandr-dev libgcrypt-dev libsdl-dev
Host ~$ sudo apt-get install libpixman-1-dev
Host ~$ sudo apt-get install autogen autoconf2.13
Host ~$ sudo apt-get install git

Die Quellen der SPICE-Protocol-Headers werden von der SPICE-Website heruntergeladen und kompiliert.

Host ~$ mkdir -p ~/source
Host ~$ cd ~/source
Host ~$ wget \ 
   http://www.spice-space.org/download/releases/spice-protocol-0.8.1.tar.gz
Host ~$ tar xzvf spice-protocol-0.8.1.tar.gz
Host ~$ cd spice-protocol-0.8.1
Host ~$ ./configure && make
Host ~$ sudo checkinstall --fstrans=no --pkgname=spice-protocol-self-compiled

pixman ist eine Bibliothek zur Manipulation von Pixel-Regionen und wird von Cairo verwendet. qpixman ist eine leicht angepasste Version von pixman.

Host ~$ cd ~/source
Host ~$ wget \ 
   http://spice-space.org/download/stable/qpixman-0.13.3-git20090127.tar.bz2
Host ~$ tar xvf qpixman-0.13.3-git20090127.tar.bz2
Host ~$ cd qpixman-0.13.3-git20090127/
Host ~$ ./autogen.sh --includedir=/usr/include --libdir=/usr/lib64
Host ~$ make
Host ~$ sudo checkinstall --fstrans=no --pkgname=qpixman-self-compiled \
        --pkgversion=20090127
Host ~$ cd ~/source
Host ~$ git clone git://anongit.freedesktop.org/pixman
Host ~$ cd pixman/
Host ~$ ./autogen.sh --includedir=/usr/include --libdir=/usr/lib64
Host ~$ make
Host ~$ sudo make install

Der CELT-Codec ist ein Kompressionsalgorithmus für Audio.

Host ~$ cd ~/source
Host ~$ wget \
   http://downloads.us.xiph.org/releases/celt/celt-0.5.1.3.tar.gz
Host ~$ tar xvf celt-0.5.1.3.tar.gz
Host ~$ cd celt-0.5.1.3
Host ~$ ./configure --includedir=/usr/include --libdir=/usr/lib64
Host ~$ make
Host ~$ sudo checkinstall --fstrans=no --pkgname=celt-self-compiled

Cairo ist eine Bibliothek zum Generieren von 2D-Vektoren. qcairo ist eine leicht angepasste Version von Cairo.

Host ~$ cd ~/source
Host ~$ wget \
   http://spice-space.org/download/stable/qcairo-1.8.7.1-git74d6b5.tar.bz2
Host ~$ tar xvf qcairo-1.8.7.1-git74d6b5.tar.bz2
Host ~$ cd qcairo-1.8.7.1-git74d6b5/
Host ~$ ./autogen.sh --disable-xlib --disable-ps --disable-pdf \
   --disable-svg --includedir=/usr/include --libdir=/usr/lib64
Host ~$ make
Host ~$ sudo checkinstall --fstrans=no --pkgname=qcairo-self-compiled

Das Kompilieren der Bibliothek libspice und des SPICE-Clients erfolgt mit folgenden Schritten.

Host ~$ mkdir -p ~/source
Host ~$ cd ~/source
Host ~$ wget \
   http://www.spice-space.org/download/releases/spice-0.8.2.tar.gz
Host ~$ tar xzvf spice-0.8.2.tar.gz
Host ~$ cd spice-0.8.2
Host ~$ ./configure --includedir=/usr/include --libdir=/usr/lib64
Host ~$ make
Host ~$ sudo checkinstall --fstrans=no --pkgname=spice-self-compiled

Ab QEMU 0.14.0 steht die Option -spice zur Verfügung. Damit wird der SPICE-Server aktiviert. Dazu ist das Port anzugeben, auf dem der SPICE-Server auf die Verbindung des SPICE-Clients wartet. Im ersten Beispiel wird mit der Option disable-ticketing auf eine Authentifizierung mittels Passwort verzichtet. Mit der Option -vga qxl wird das QXL-Device aktiviert. Dies ist eine Emulation einer PCI-Grafikkarte mit dem Namen Red Hat QXL GPU.

Host ~$ qemu-system-x86_64 -hda Platte.img -spice port=12345,disable-ticketing -vga qxl

Bei der Option -spice erscheint keine Bildschirmausgabe des Gast-Systems. Man startet einen SPICE-Client. Laufen QEMU mit SPICE-Server und SPICE-Client auf dem gleichen Rechner, gibt man als Option für den SPICE-Client localhost ein. Läuft der SPICE-Server auf einem anderen Rechner, ist dessen Rechnername beziehungsweise IP-Adresse anzugeben. Weiterhin ist die gleiche Port-Nummer wie bei der QEMU-Instanz vorzugeben.

Host ~$ spicec -h localhost -p 12345

Informationen über die SPICE-Session erhält man im QEMU-Monitor. Bei QEMU 0.14.0 führt aber der Befehl info spice zu einem Absturz der QEMU-Instanz.

Host ~$ qemu-system-x86_64 -hda Platte.img -monitor stdio -spice port=12345,disable-ticketing -vga qxl
(qemu) info spice

Zur Optimierung ist im Gast-System der QXL-Treiber zu installieren. Die QXL-Treiber für Linux werden mit dem Start von X aktiviert. Das heißt, bevor X verfügbar ist, wird eine Standard-VGA-Karte emuliert, damit für den Boot-Vorgang eine Bildschirmausgabe erfolgt. In Fedora 14 (64-Bit) ist der QXL-Treiber normalerweise integriert und wird bei der Option -vga qxl aktiviert. Ansonsten installiert man ihn wie bei Red Hat und verwandten Distributionen mit diesem Befehl:

Gast ~$ su -c "yum install xorg-x11-drv-qxl" 

Unter Ubuntu 10.10 (64-Bit) ist zur Installation dieser Befehl anzuwenden:

Gast ~$ sudo apt-get install xserver-xorg-video-qxl

Für Microsoft Windows stehen die QXL-Treiber auf der SPICE-Website zum Download zur Verfügung. In diesem Beispiel wird im Host-System der Treiber heruntergeladen und dem Gast-System in einer virtuelle FAT-Festplatte zur Verfügung gestellt. Weiterhin wird auf diese Weise auch der SPICE-Agent für Microsoft Windows XP angeboten.

Host ~$ mkdir qxl-driver
Host ~$ cd qxl-driver
Host ~$ wget \
 http://www.spice-space.org/download/binaries/qxl-win32-0.6.1.zip
Host ~$ unzip qxl-win32-0.6.1.zip
Host ~$ wget \
 http://www.spice-space.org/download/binaries/vdagent-win32-0.6.3.zip
Host ~$ unzip vdagent-win32-0.6.3.zip
Host ~$ cd -

Die QEMU-Instanz mit dem Windows-Gast-System wird gestartet.

Host ~$ qemu-system-x86_64 -hda Platte.img -hdb fat:qxl-driver \
        -m 512 -spice port=12345,disable-ticketing -vga qxl 

Mit dem SPICE-Client verbindet man sich zur QEMU-Instanz.

Host ~$ spicec -h localhost -p 12345

Microsoft Windows erkennt die neue Hardware und will sich gleich mit der Microsoft-Website verbinden. Dies ist zu unterbinden. Stattdessen wählt man als Installationsquelle den lokalen Pfad mit den Installationsdateien auf dem Laufwerk QEMU VVFAT. Unter Microsoft Windows XP kann anschlließend der SPICE-Agent installiert werden. Dazu sind die Dateien vdservice.exe und vdagent.exe vom Laufwerk QEMU VVFAT in ein Verzeichnis auf C: zu kopieren. In der DOS-Eingabeaufforderung sind in dem Verzeichnis folgende Befehle abzusetzen.

C:\> vdservice.exe
C:\> net start vdservice

Ist Copy and Paste zwischen SPICE-Client und dem Gast-System unerwünscht, wendet man den Parameter disable-copy-paste an.

Host ~$ qemu-system-x86_64 -hda Platte.img -hdb fat:qxl-driver \
        -m 512 -spice port=12345,disable-ticketing,disable-copy-paste -vga qxl 

Eine SPICE-Verbindung sollte gesichert sein. Eine einfache Möglichkeit ist die Sicherung mit einem Passwort. Der Passwort-Schutz wird mit dem Parameter password aktiviert. Im QEMU-Monitor wird das Passwort mit dem Befehl set_password spice geändert. Mit dem Befehl expire_password spice lässt sich die Gültigkeistdauer für das Passwort definieren. In diesem Beispiel sind es 300 Sekunden.

Host ~$ qemu-system-x86_64 -hda Platte.img -monitor stdio -spice port=12345,password=geheim -vga qxl
(qemu) set_password spice strenggeheim
(qemu) expire_password spice +300

Im SPICE-Client wird das Passwort mit der Option -w vorgegeben.

Host ~$ spicec -h localhost -p 12345 -w strenggeheim

Einen weiteren Schutz bietet die Authentifizierung mit x509-Zertifikaten und die Verschlüsselung der Session mit TLS (Transport Layer Security). Zum Generieren der Zertifikate dient das Programm openssl (http://www.openssl.org/docs/apps/openssl.html). Die Installation unter Ubuntu ist mit einer Befehlszeile erledigt.

Host ~$ sudo apt-get install openssl

Verwendet man die Default-Namen ca-cert, server-cert und server-key, benötigt man nur den Verweis auf das Verzeichnis mit diesen Schlüssel-Dateien (Parameter x509-dir). Zuerst wird ein privater Schlüssel generiert.

Host ~$ openssl genrsa -des3 -out ca-key.pem 1024
Enter pass phrase for ca-key.pem: *****

Mit diesem privaten Schlüssel legt man ein selbst signierte CA (Certificate Authority) an.

Host ~$ openssl req -new -x509 -days 1095 -key ca-key.pem -out ca-cert.pem \
  -utf8 -subj "/C=DE/L=meinLand/O=meineOrganisation/CN=meineCA" 
Enter pass phrase for ca-key.pem: *****

Mit folgenden Schritten wird ein Server-Schlüssel generiert und signiert.

Host ~$ openssl genrsa -out server-key.pem 1024
Host ~$ openssl req -new -key server-key.pem -out server-key.csr \
  -utf8 -subj "/C=DE/L=meinLand/O=meineOrganisation/CN=meinServer" 
Host ~$ openssl x509 -req -days 1095 -in server-key.csr -CA ca-cert.pem \ 
  -CAkey ca-key.pem -set_serial 01 -out server-cert.pem 
Enter pass phrase for ca-key.pem: *****

Die Passphrase wird aus dem Schlüssel entfernt.

Host ~$ openssl rsa -in server-key.pem -out server-key.pem.insecure 
Host ~$ mv server-key.pem server-key.pem.secure
Host ~$ mv server-key.pem.insecure server-key.pem

Man überprüft die generierten Schlüssel.

Host ~$ openssl rsa -noout -text -in server-key.pem
Host ~$ openssl rsa -noout -text -in ca-key.pem
Host ~$ openssl req -noout -text -in server-key.csr
Host ~$ openssl x509 -noout -text -in server-cert.pem
Host ~$ openssl x509 -noout -text -in ca-cert.pem
Host ~$ openssl verify -CApath ca ca-cert.pem
ca-cert.pem: /C=DE/L=meinLand/O=meineOrganisation/CN=meineCA
error 18 at 0 depth lookup:self signed certificate
OK

Die Datei ca-cert.pem ist auf dem Rechner zu kopieren, auf dem der SPICE-Client gestartet wird. Per Default sucht dieser die Datei unter $HOME/.spice/spice_truststore.pem (Linux) beziehungsweise %APPDATA%\Roaming\spicec\spice_truststore.pem (Windows). Alternativ verweist man mit dem Parameter --ca-file auf diese Datei. In diesem Beispiel wird der SPICE-Client auf dem gleichen Rechner gestartet.

Host ~$ mkdir -p $HOME/.spice/
Host ~$ cp ca-cert.pem $HOME/.spice/spice_truststore.pem

Man startet die QEMU-Instanz mit diesen Optionen.

Host ~$ qemu-system-x86_64 -hda Platte.img -vga qxl              \
-spice tls-port=23456,disable-ticketing,x509-dir=. 

Der SPICE-Client wird gestartet.

Host ~$ spicec -h localhost -s 23456 --secure-channels all           \
  --host-subject "C=DE,L=meinLand,O=meineOrganisation,CN=meinServer" \
  --ca-file $HOME/.spice/spice_truststore.pem 

Bei Problemen hilft der folgende Befehl bei der Fehlersuche:

Host ~$ openssl s_client -host localhost -port 23456

QEMU unterstützt die Authentifizierung des SPICE-Zugriffs mit dem Simple Authentication and Security Layer (siehe Abschnitt VNC).

Host ~$ qemu-system-x86_64 Platte -vga qxl                                          \
-spice tls-port=23456,disable-ticketing,x509-key-file=server-key.pem, \
x509-key-password=redhat,x509-cert-file=server-cert.pem,              \
x509-cacert-file=ca-cert.pem,sasl


<<<|###| >>> http://www.qemu-buch.de

Von „http://qemu-buch.de/de/index.php/QEMU-KVM-Buch/_Netzwerkoptionen/_Netzwerkdienste

Diese Seite wurde bisher 44.183 mal abgerufen. Diese Seite wurde zuletzt am 31. Mai 2012 um 16:41 Uhr geändert. Inhalt ist verfügbar unter der GNU Free Documentation License 1.2.


Finden

Blättern

News

Deutsch
Weitersagen
Bestellen
Tipps für Autoren
Autoren
Impressum


English
Order
Recommendation
The Authors
Contact



Letzte Änderungen


Ändern
Seite bearbeiten
Bearbeitungshilfe
Seitenoptionen
Diskussion
Kommentar hinzufügen
Druckversion
Seitendaten
Versionen
Links auf diese Seite
Änderungen an verlinkten Seiten
Meine Seiten
Anmelden
Spezialseiten
Neue Seiten
Dateiliste
Statistik
Kontakt
Mehr …