heise Security

Dieser Artikel erschien ursprünglich in c't 15/2012 , Seite 154

Desinfec’t vom Linux-Server booten

Ralf Schneider, Peter Siering

Nützliche Datenträger wie Desinfec’t tauchen genau dann unter, wenn man sie dringend braucht. Wer ohnehin einen Linux-Server betreibt, kann es dort so hinterlegen, dass sich PC-Patienten die Medizin direkt aus dem Netz holen.

[Update 11.6.2016: Dieser Artikel wurde auf Desinfec't 2015 angepasst]

Die Mehrzahl der in den letzten Jahren verkauften PCs kann ebenso selbstverständlich aus dem Netzwerk booten wie von einem optischen Datenträger. Gegebenenfalls muss man die Option im BIOS-Setup aktivieren. Oft genügt es aber auch, beim BIOS-Selbsttest die richtige Taste für die Boot-Auswahl zu drücken, meist F12. Starten aus dem Netzwerk ist dann eine von mehreren Optionen.

Die Infrastruktur, die man dazu braucht, ist nicht allzu aufwendig. Es muss sich dazu nicht mal um einen echten Server handeln, ein bei Bedarf gestartetes System in einer VM genügt vollends. Für Windows haben wir das bereits erklärt [1]. Bis zu vier Scanner schickt Desinfec't auf die Virenjagd.
Bis zu vier Scanner schickt Desinfec't auf die Virenjagd.
Das Folgende zeigt die nötigen Schritte für ein Linux-System und am Beispiel unseres Desinfec’t-Projekts [2] – einer Boot-DVD, die zuletzt c’t 14/2015 [3] beilag und die diverse Hilfsmittel enthält, um PCs von Schädlingen zu befreien.

Das Starten aus dem Netzwerk ist in vielerlei Hinsicht praktisch: Geräte ohne optisches Laufwerk lassen sich damit erreichen, etwa Netbooks. Das lästige Gejaule des Laufwerks stört nicht. Zudem läuft ein Rettungssystem wie Desinfec’t auf aktueller Hardware flüssiger aus dem Netz. Und: Steht die Infrastruktur für den Netzwerk-Boot, kann man dort auch gleich weitere Helfer, Installationsmedien oder sonstige Projekte ablegen und nutzen.

Noch eine erfreuliche Botschaft vorab: Wer denkt, dass er dafür womöglich lieb gewonnene Dienste umstricken muss, ist auf dem Holzweg. Ein Linux-Maschinchen, das anderen das Booten aus dem Netz erlaubt, integriert sich nahtlos in ein bestehendes Netzwerk. Man muss also weder Dienste auf bestehenden Servern anfassen noch den Router in Rente schicken, weil er die nötigen Protokolle nicht kennt.

Die Zutaten

Booten aus dem Netz heißt heute „PXE“. Das von Intel spezifizierte Preboot Execution Environment [4] fasst die zuvor etablierten Verfahren zusammen und erweitert sie um eine normierte Schnittstelle für Netzwerkzugriffe. Es schafft quasi ein BIOS für Netzwerkkarten, das für jeden Chip und Hersteller gleich funktioniert. Das heißt: Im Rahmen des Bootens braucht man anders als früher keine Treiber, die zur jeweiligen Netzwerkkarte passen, PXE bringt sie mit.

Das Verfahren ist einfach: Der startende PC ruft ins Netz hinaus und erfragt eine IP-Adresse, das Protokoll dazu heißt DHCP [5] (Dynamic Host Configuration Protocol). Der DHCP-Server antwortet mit einer Adresse und weiteren Informationen. Eine solche Antwort enthält in der Regel die Adresse des Nameservers und des Gateways, kann aber zusätzliche Hinweise zum Beispiel auf eine spezielle Startdatei für den Netzwerk-Boot enthalten.

Findet der PC solche Hinweise, dann lädt er die Datei von einem TFTP [6]-Server und führt sie aus; das Trivial File Transfer Protocol ist eine authentifizierungslose Variante von FTP. Diese Dateien enthalten Hinweise, wie weiter zu verfahren ist, zum Beispiel ein Auswahlmenü für mehrere auf dem Boot-Server abgelegte Betriebssysteme. Optional kann auch ein PXE-Bootserver in dem Prozess mitmischen.

Das Verfahren ist so ausgelegt, dass die PXE-spezifischen Teile parallel zu einem bereits vorhandenen DHCP-Server arbeiten können – der ist oft auf einem Router aktiv und lässt sich gar nicht geeignet anpassen. Die parallel zu einem vorhandenen DHCP-Server nötige Komponente heißt DHCP-Proxy und kann sogar gleichzeitig zum DHCP-Server auf dem gleichen System aktiv sein.

Server vorbereiten

Server vorbereiten

Die Anforderungen, die Desinfec’t an einen Start aus dem Netzwerk stellt, fallen moderat aus. Sie entsprechen denen eines Ubuntu-Live-Systems. Außer den beschriebenen obligatorischen Diensten erwartet es zusätzlich einen NFS [7]-Server, der das komprimierte Dateisystem im Netz bereitstellt. Lediglich der Systemstart, also das Laden der zum Booten nötigen Dateien, des Kernels und der Init-RAM-Disk läuft via TFTP. Dann übernimmt NFS.

Um die nötigen Dateien auf Ihrem Server bereitzustellen, legen Sie die Desinfec’t-DVD in das System ein, mounten Sie diese (die Hinweise gehen davon aus, dass Sie das unter /media/cdrom tun) und mounten die Datei desinfect-2015 aus dem Verzeichnis /software als Loop-Device und kopieren Sie die Dateien in das im ersten Schritt neu angelegte Verzeichnis /srv/tftp/ct:

mkdir -p /srv/tftp/ct/desinfect
cd /srv/tftp/ct
mount -o loop /media/cdrom/software/desinfect-2015.iso /mnt
cp -r /mnt/* desinfect/
umount /mnt

Leider enthält die Init-RAM-Disk auf der Desinfec’t-DVD einige Schönheitsfehler, die erst beim Netzwerk-Boot zu Tage treten. Wir stellen deshalb eine aktualisierte initrd.lz-Datei [8] bereit, um damit die kopierten Dateien von der DVD wie folgt zu aktualisieren:

cd /srv/tftp/ct/desinfect/casper
rm -f initrd.lz
wget http://www.heise.de/ct/projekte/desinfect/des15/initrd.lz

Im nächsten Schritt erstellen Sie ein weiteres Verzeichnis

mkdir /srv/tftp/ct/pxelinux.cfg

und legen darin die Datei default wie folgt an:

DEFAULT desinfect2015
LABEL desinfect2015
MENU LABEL Desinfec't
kernel /desinfect/casper/vmlinuz
APPEND root=/dev/nfs boot=casper initrd=/desinfect/casper/initrd.lz file=/desinfect/preseed/ubuntu.seed netboot=nfs nfsroot=192.168.1.2:/srv/tftpboot/desinfect quiet splash memtest=4 debian-installer/language=de console-setup/layoutcode?=de --

Sie weist PXE den Weg zu Kernel und Init-RAM-Disk und gibt einige Optionen für den Systemstart mit. Wichtig dabei ist, dass die Adresse des NFS-Servers passt. Die Beispiele gehen davon aus, dass hinter der Adresse 192.168.1.1 der Router und DNS-Server stecken, und hinter 192.168.1.2 der Boot-Server, den Sie einrichten. Weitere Einträge wie

LABEL easy
MENU LABEL Desinfec't 2015 (schneller, vereinfachter Easy-Scan)
kernel /desinfect/casper/vmlinuz
APPEND root=/dev/nfs boot=casper initrd=/desinfect/casper/initrd.lz file=/desinfect/preseed/ubuntu.seed netboot=nfs nfsroot=192.168.1.2:/srv/tftpboot/desinfect quiet splash memtest=4 easymode debian-installer/language=de console-setup/layoutcode?=de --

LABEL failsafe
MENU LABEL Desinfec't 2015 (Failsafe)
kernel /desinfect/casper/vmlinuz
APPEND root=/dev/nfs boot=casper initrd=/desinfect/casper/initrd.lz file=/desinfect/preseed/ubuntu.seed netboot=nfs nfsroot=192.168.1.2:/srv/tftpboot/desinfect memtest=4 nomodeset debian-installer/language=de console-setup/layoutcode?=de --

bieten den Easy-Scan und den Failsafe-Modus an. Fehlt noch der PXE-Loader selbst. In einem Debian-System können Sie den per:

apt-get install syslinux-common

auf die lokale Platte holen. Da die Datei pxelinux.0 in /usr/lib/syslinux landet, müssen Sie sie für die Remote-Boot-Mechanismen zugänglich machen. Ein symbolischer Link empfiehlt sich dafür, weil Ihr System so von eventuellen Updates an der Datei profitiert:

cd /srv/tftp/ct/
ln -s /usr/lib/syslinux/pxelinux.0 pxelinux.0

Der NFS-Server ist auf einem Debian-System mit wenigen Handgriffen installiert:

apt-get install nfs-kernel-server 

zur Konfiguration tragen Sie in die Datei /etc/exports die Zeile

/srv/tftp 192.168.1.0/24(ro,no_subtree_check)

ein. Die IP-Adresse des Netzwerks müssen Sie gegebenenfalls anpassen. Nach einem Neustart mit /etc/init.d/nfs-kernel-server restart liefert der Server die Image-Datei mit Desinfec’t auf Anfrage aus.

Integrativ

Einfach kann man sich das Leben mit Dnsmasq machen, einem eher schlanken DNS- und DHCP-Server. Ihn kann man ohne Weiteres parallel zu einer bestehenden DNS/DHCP-Infrastruktur betreiben, also auch zu einem vorhandenen DSL-Router. Die Installation in einem Debian-System ist per

apt-get install dnsmasq

erledigt. Als Konfigurationsdatei genügt nach den zuvor geschilderten Schritten eine neu angelegte Datei desinfect im Verzeichnis /etc/dnsmasq.d. Sie enthält:

port=0
log-dhcp
enable-tftp
tftp-root=/srv/tftp
dhcp-range=192.168.1.0,proxy
pxe-prompt="Taste F8 zeigt Auswahl",5
pxe-service=X86PC,"Starten von Festplatte",0
pxe-service=X86PC,"Mit Desinfec't starten",ct/pxelinux

Der Reihenfolge nach deaktivieren die Optionen den integrierten DNS-Server (port=0), lassen Dnsmasq ausführlich Protokoll schreiben, knipsen den internen TFTP-Server an, weisen den Daemon an, als DHCP-Proxy für das Netz 192.168.1.0 aktiv zu werden und lassen den PXE-Code einen Hinweis anzeigen und auf die Betätigung der Taste F8 hin ein minimales Menü präsentieren.

Ein simples Bootmenü, das erst auf Knopfdruck Netzwerk-Boot-Optionen zeigt, ist mit Dnsmasq im Handumdrehen gestrickt.
Ein simples Bootmenü, das erst auf Knopfdruck Netzwerk-Boot-Optionen zeigt, ist mit Dnsmasq im Handumdrehen gestrickt.

Das Menü erlaubt die Wahl zwischen einem Boot von der Festplatte und von Desinfec’t aus dem Netz. Hält der Benutzer fünf Sekunden still, geht es automatisch von der Festplatte weiter. Wie erfrischend einfach Dnsmasq ist, kann man erst im Vergleich mit dem Aufwand ermessen, den man beim Einsatz der „großen“ Dienste treiben müsste. Da liegt es nahe, nur in Ausnahmefällen überhaupt etwas anderes zu benutzen.

Der Reinraumansatz

Der Reinraumansatz

Für all diejenigen, die es genauer wissen wollen, folgt jetzt die klassische Methode, einen PXE-Boot-Server zu bauen: Ein frisch installiertes System auf Debian-Basis motzt man mit einigen Paketen geeignet auf. Wer schon Teile der Dienste in Betrieb hat, pickt sich einfach die entscheidenden Punkte aus der Anleitung heraus:

apt-get install tftpd-hpa isc-dhcp-server openbsd-inetd

Den TFTP-Server konfigurieren Sie in der Datei /etc/default/tftpd-hpa

TFTP_OPTIONS="--secure"
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"

Im Verzeichnis /srv/tftp braucht jedermann Leserechte, damit der Server die Dateien auch ausliefern kann. Anders als viele gängige Dienste bringt der tftp-Server kein Init-Skript mit. Stattdessen spannt man den Inet-Daemon (bei Debian openbsd-inetd) ein, um den Dienst zu starten. In der Datei /etc/inetd.conf sorgt die Zeile

tftp dgram udp wait root /usr/sbin/tcpd /usr/sbin/in.tftpd -s /srv/tftp

dafür, dass der inet-Daemon bei Verbindungsanfragen auf dem tftp-Port den TFTP-Server startet.

Dem DHCP-Server (jetzt kein Proxy mehr) sollten Sie in /etc/default/isc-dhcp-server explizit mitteilen, auf welcher Schnittstelle er Anfragen beantworten soll, etwa eth0:

interfaces="eth0"

Außerdem müssen Sie den DHCP-Dienst grundlegend konfigurieren, eine minimale Konfigurationsdatei sieht so aus:

authoritative;
allow booting;
allow bootp;
option domain-name-servers 192.168.1.1;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.20 192.168.1.40;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.1;
}
host desinfect {
next-server 192.168.1.2;
hardware ethernet 00:01:02:03:04:05;
fixed-address 192.168.1.50;
filename "ct/pxelinux.0";
}

Die Anweisungen erklären den DHCP-Server für aktiv und zuständig (authoritative;), aktivieren die Boot-Dienste (allow booting; allow bootp;) und richten einen Adresspool für das private Netz 192.168.1.0 ein.

Clients erhalten nach dem Start (/etc/init.d/isc-dhcp-server start) Adressen ab 192.168.1.20. Als Nameserver und Gateway gibt der Server die Adresse 192.168.1.1 heraus. Das könnte ein Router im lokalen Netz sein, auf dem dann – sofern vorhanden – der DHCP-Dienst zu deaktivieren wäre.

In der host-Deklaration schließlich ordnen Sie dem System mit der Hardware-Adresse (MAC) 00:01:02:03:04:05 eine feste IP-Adresse zu und verweisen ihn auf den Boot-Server und eine dort abgelegte Boot-Datei. Die IP-Adresse 192.168.1.2 sollte dabei die des Servers selbst sein, also des Systems, auf dem Sie DHCP-Server und TFTP-Server gerade einrichten. Ein Bootmenü analog zu dem per Dnsmasq realisierten macht mit dem ISC-DHCP-Server mehr Arbeit: Hier greift man am besten auf die Möglichkeiten von ISOLINUX/Syslinux zurück.

Fehlersuchhilfen

Klappt die Inbetriebnahme nicht ad hoc oder bleibt das Booten mittendrin stecken, so gilt der erste Blick den Log-Dateien des Systems. Die enthalten oft sinnvolle Hinweise auf nicht gefundene Dateien, falsche Pfade et cetera. Aber nicht jede Fehlermeldung, die dort herumschwirrt, deutet gleich auf ein Problem hin: Ein PXE-Client probiert mehrere Dateinamen aus, die gehen von der MAC-Adresse aus und verallgemeinern immer weiter.

Auch dem startenden Desinfec’t kann man detailliert auf die Finger sehen. Lässt man in /srv/tftp/ct/pxelinux.cfg/default in der APPEND-Zeile die Option splash weg, dann sieht man die Ausgaben des bootenden Systems. Wenn Sie sich im startenden System umsehen wollen, noch bevor das eigentliche Live-System richtig zum Leben erwacht, können Sie die APPEND-Zeile um die Option break=init ergänzen. Bei hartnäckigen Problemen hilft nur ein Paketsniffer.


URL dieses Artikels:
https://www.heise.de/security/artikel/Desinfec-t-vom-Linux-Server-booten-1658049.html

Links in diesem Artikel:
  [1] http://www.heise.de/artikel-archiv/ct/2011/5/176_kiosk
  [2] https://www.heise.de/ct/artikel/Desinfec-t-1213110.html
  [3] http://www.heise-shop.de/heise-zeitschriften-verlag/ct-9-2012_pid_18805037.html
  [4] http://de.wikipedia.org/wiki/Preboot_Execution_Environment
  [5] http://de.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
  [6] http://de.wikipedia.org/wiki/Trivial_File_Transfer_Protocol
  [7] http://de.wikipedia.org/wiki/Network_File_System
  [8] http://www.heise.de/ct/projekte/desinfect/des15/initrd.lz
  [9] http://www.heise.de/ct/projekte/desinfect/des15/initrd.lz
  [10] http://www.heise.de/security/foren/S-Desinfect/forum-196560/list/