c't 21/2021
S. 150
Praxis
Desinfec't via PXE starten
Bild: Andreas Martini

Netzwerk-Virenjäger

Desinfec’t 2021 vom Server booten

Nie mehr nach Desinfec’t-USB-Sticks suchen, stattdessen den Virenjäger bequem aus dem Netzwerk starten? Ein Bootserver mit dem Sicherheitstool fürs Heim- oder Büronetz machts möglich. Das funktioniert sogar mit einem Raspberry Pi.

Von Mattias Schlenker

Nicht nur für Admins in Unternehmen, auch im Privathaushalt ist ein eigener Bootserver mit Desinfec’t praktisch: Damit überprüfen Sie etwa Notebooks von Schulkindern bequem auf Viren, ohne nach einem Desinfec’t-Stick kramen zu müssen. Zu scannende Clients müssen lediglich über eine aktive Netzwerkverbindung verfügen und schon können sie das Sicherheitstool direkt über das Netzwerk starten.

Für das Einrichten benötigt man nur einen als Bootserver konfigurierten und dauerhaft eingeschalteten Computer, von dem Clients im Netzwerk, die man scannen will, die 64-Bit-Version von Desinfec’t beziehen. Realisieren lässt sich das Ganze über Preboot Execution Environment (PXE).

Unter PXE versteht man ein Bündel von Verfahren, mit denen ein PC Startdateien statt von einer lokalen Festplatte aus dem Netzwerk lädt. So kann ein Server beispielsweise eine vollständige Betriebssystemumgebung bereitstellen, an der sich ein Client bedient. Heutzutage beherrschen im Grunde alle Onboard-Ethernet-Karten PXE.

Drei Netzwerkserver

Damit Desinfec’t aus dem Netzwerk startet, benötigt man drei Serverdienste: einen DHCP-Server zur Konfiguration von unter anderem IP-Adressen, einen TFTP-Server zum Übertragen der Bootdateien und einen NFS-Server zum Bereitstellen der Systemdateien. Die Dateien für die Einrichtung finden sie im Ordner „casper“ im ISO-Image von Desinfec’t 2021. Doch Vorsicht: Das Einrichten eines DHCP-Servers in einem bestehenden Netzwerk ist nur etwas für Leute, die wissen, was sie tun. Alle drei Server können auf einem Linux-Computer im lokalen Netz laufen. Man kann sie aber auch auf mehrere Geräte verteilen.

In diesem Artikel konzentrieren wir uns auf das Setup mit Debian-basierten Systemen, wie Raspberry Pi OS und Ubuntu. Kommt als Bootserver ein Raspberry Pi zum Einsatz, müssen Sie ein paar Dinge beachten: Im Grunde reicht sogar ein Raspi 1 aus, um Desinfec’t im Netzwerk an Clients zu verteilen. Mit dieser Version des Einplatinencomputers gestaltet sich das Starten des Bootservers jedoch als sehr langwierig und Desinfec’t wird nur zäh an Clients ausgeliefert. Damit beides schneller vonstatten geht, sollte ein Raspi 3 in Kombination mit einer flinken SD-Karte zum Einsatz kommen. Falls Sie einen OpenWrt-Router zum Bootserver machen wollen, müssen Sie die DHCP- und TFTP-Konfigurationseinstellungen für den dort verwendeten Serverdienst dnsmasq konvertieren (siehe ct.de/yr35).

Für ein besseres Verständnis empfehlen wir aber, zunächst unsere Musterkonfiguration auf Computern mit Ubuntu, Debian oder Raspberry Pi OS nachzustellen und erst dann die Server auf beispielsweise NAS und Router zu verteilen. Unter ct.de/yr35 finden Sie einen Link, wie man zum Beispiel auf einem mit OpenWrt laufenden DSL-Router und einem 4-GByte-Speicherstick eine PXE-Bootumgebung aufsetzt, die Desinfec’t serviert.

Am Anfang steht die Einrichtung des DHCP-Servers. Die folgende Konfiguration ist für das in Debian enthaltene isc-dhcp-server-Paket geschrieben. Zunächst müssen Sie in der Datei /etc/default/isc-dhcp-server die Netzwerkinterfaces eintragen, an denen der Server lauschen soll. Das sieht beispielsweise wie folgt aus:

INTERFACES="enp2s0"

Danach bearbeiten Sie die Konfigurationsdatei /etc/dhcp/dhcpd.conf::

ddns-update-style none;
option domain-name "meinnetz.test";
option domain-name-servers 10.76.23.252;
option routers 10.76.23.252;
default-lease-time 600;
max-lease-time 7200;
authoritative;
subnet 10.76.23.0 netmask 255.255.255.0 {
  range 10.76.23.80 10.76.23.220;
  use-host-decl-names on;
  option subnet-mask 255.255.255.0;
  option broadcast-address 10.76.23.255;
  next-server 10.76.23.250;
}
class "pxeclient" {
  match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
  if substring (option vendor-class-identifier, 15, 5) = "00000" {
    # BIOS client 
    filename "pxelinux.0";
  }
  else {
    # default to EFI 64 bit
    filename "bootx64.efi";
  }
}

Damit setzen Sie einen DHCP-Server auf, der das Netz 10.76.23.0/24 bedient; der Bootserver hat die Adresse 10.76.23.250. Gateway und Nameserver sind mit 10.76.23.252 ansprechbar. Der Parameter 0 sorgt dafür, dass dieser DHCP-Server maßgeblich für dieses Netzwerk ist.

Starten Sie jetzt den DHCP-Server neu:

service isc-dhcp-server restart

Nun kann man prüfen, ob der DHCP-Server via PXE-Boot sichtbar ist. Stellen Sie dafür beim PC, auf dem Desinfec’t aus dem Netzwerk starten soll, die Bootreihenfolge auf „Network Boot“. Das gelingt temporär über das BIOS-Bootmenü oder dauerhaft im BIOS – oft heißt der Punkt mit dieser Option „Startup“. Läuft der DHCP-Server korrekt, sollten nun auf dem Client beim Booten die MAC-Adresse, die UUID des BIOS und die vom DHCP-Server erhaltenen Parameter zu sehen sein. Der Computer versucht nun per TFTP die Datei pxelinux.0 vom Server 10.76.23.250 zu laden. Da aber noch kein TFTP-Server läuft, bricht der Bootvorgang nach einigen Minuten ab.

TFTP für den Bootloader

Für den TFTP-Server kommt der „Advanced TFTP-Server“ aus dem zu installierenden Paket atftpd zum Einsatz. Diesen konfigurieren Sie über die Datei /etc/default/atftpd. Passen Sie die IP-Adressen an die in Ihrem Netz verwendeten an und ändern Sie gegebenenfalls den Pfad des Ordners mit den Bootdateien:

USE_INETD=false
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 10.76.23.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /opt/tftpboot"

In diesem Schritt befüllen Sie das Bootverzeichnis /opt/tftpboot. Alle benötigten Dateien sind mit der korrekten Ordnerstruktur im Archiv /cdrom/casper/tftpboot.tgz enthalten. Sie können diese einfach in Ihren Ordner /opt/tftpboot kopieren. Wenn Sie gerade kein Desinfec’t 2021 zur Hand haben, können Sie die Bootdateien auch herunterladen (siehe ct.de/yr35). Wenn Sie mit UEFI-Clients arbeiten, müssen Sie das Paket zwingend herunterladen, da die benötigten Dateien im ISO-Image fehlen.

Zur Erläuterung: Ein BIOS-Client wird am Vendor-String „00000“ erkannt und erhält die Bootdatei „pxelinux.cfg“, bei allen anderen Clients wird angenommen, dass es sich um einen UEFI64-Client handelt, diese bekommen das EFI-Modul „bootx64.efi“. Falls Sie in Ihrem Netzwerk exotische Architekturen wie SPARC, Itanium oder alte UEFI32-Nettops übers Netz booten, ist die Differenzierung der Klasse „pxeclient“ detaillierter vorzunehmen. Der Client holt sich im Falle des BIOS-Clients die COM32-Module und die Konfigurationsdatei pxelinux.cfg/default via TFTP vom Server. Sie können nun erste Tests mit einer minimalen Version fahren:

DEFAULT /menu.c32 
TIMEOUT 300 
MENU TITLE Desinfec't Netboot 
LABEL local
MENU LABEL Von Festplatte starten 
MENU DEFAULT
LOCALBOOT 0I

Im Falle von UEFI-GRUB gilt die Konfigurationsdatei grub/grub.cfg mit der folgenden minimalen Konfiguration:

set default=0
set timeout=10
menuentry "Start von Festplatte" {
  exit
}

In beiden Fällen wird der Computer lediglich angewiesen, die PXE-Boot-Umgebung nach 10 Sekunden zu verlassen und mit dem nächsten Bootmedium der festgelegten Reihenfolge fortzufahren. Sind die Konfigurationsdateien abgelegt, können Sie Ihre Clients bereits testen: Sobald der PXE-fähige Client Antwort vom DHCP-Server erhalten hat, lädt er das Menü.

Im BIOS-Setup können Sie PXE als bevorzugte Bootmethode dauerhaft aktivieren. Ist mal kein Server im Netz aktiv, startet nach einigen Sekunden das auf der Festplatte installierte System.

Desinfec’t-Bootdateien ablegen

Kopieren Sie nun noch Kernel (vmlinuz) und Ramdisk (initrd.lz) aus dem Ordner /casper im Desinfec’t-ISO-Image in den TFTP-Boot-Ordner und passen Sie die IP-Adressen in den Konfigurationsdateien im Archiv tftpboot.tgz an. Mit dieser Änderung können Sie in die initiale Ramdisk booten.

Falls Sie planen, TFTP-Boot langfristig auch fürs Deployment von Images oder zur Installation von Linux-Servern einzusetzen, haben Sie die Möglichkeit, in der DHCP-Konfiguration pro MAC-Adresse zu bestimmen, ob und wenn ja welche Bootdatei verwendet werden soll. Mit der Option, die Bootdatei per MAC-Adresse zu überschreiben, booten Sie auch exotische Hardware wie ARM SBC mit uBoot, alte SPARC-Maschinen oder PowerPC-Macs ohne Konflikte übers Netz. Der Bootloader PXELINUX erlaubt Konfigurationsdateien für MAC- oder IP-Adresse, die vor „default“ gesucht werden, Details zeigt das Syslinux-Wiki (siehe ct.de/yr35). Im Falle von GRUB empfehlen viele Tutorials, während des Bootvorgangs auf HTTP zu wechseln, dann kann ein Skript auf dem Webserver anhand der IP-Adresse bestimmen, welche Konfiguration ausgeliefert wird.

Der NFS-Server

Nun installieren Sie das Paket nfs-kernel-server und setzen damit den NFS-Server auf. Die Konfiguration geschieht in der Datei /etc/exports. An dieser Stelle müssen Sie folgende Zeile hinzufügen:

/opt/nfsboot/desinfect202100 10.76.23.0/24(ro,insecure,no_subtree_check,async,no_root_squash)

Damit stellt der Server den Ordner nur lesbar für das Netz 10.76.23.0/24 zur Verfügung. Die restlichen Optionen dienen der Performance und sind im Read-only-Modus gefahrlos nutzbar. Jetzt müssen Sie noch mit den folgenden Befehlen den Ordner mit dem Inhalt des inneren Desinfec’t-ISOs befüllen:

mkdir -p /opt/nfsboot/desinfect202100 
mkdir /tmp/desinfect202100
mount -o loop desinfect202100-amd64.iso /tmp/desinfect202100 
rsync -avHP /tmp/desinfect202100/ /opt/nfsboot/desinfect202100/
umount /tmp/desinfect202100

Falls Sie auch noch die 32-Bit-Version von Desinfec’t per PXE bereitstellen wollen, müssen Sie analog mit 32-Bit-Kernel und Ramdisk sowie dem Inhalt des 32-Bit-ISOs verfahren. Starten Sie jetzt den NFS-Server neu:

service nfs-kernel-server restart

Anschließend können Sie Ihren PXE-Client resetten und Desinfec’t starten.

Signaturen speichern

Praktischerweise bringt Desinfec‘t 2021 die Möglichkeit mit, aktualisierte Signaturen der Virenscanner auf einem NFS-Share-Server zu speichern. Hierfür legen Sie einen leeren Export-Ordner an, der schreibbar freigegeben ist und eine leere Datei namens „.desinfect202100“ enthält:

mkdir -p /mnt/archiv/desinfect-signatures
touch /mnt/archiv/desinfect-signatures/.desinfect202100

Dieser Ordner enthält den folgenden Eintrag in der Konfigurationsdatei /etc/exports:

/mnt/archiv/desinfect-signatures 10.76.23.0/24(rw,no_subtree_ check,no_root_squash)

Anschließend ergänzen Sie die PXELINUX-Konfiguration um den Parameter nfssigs:

nfssigs=10.76.23.250:/mnt/archiv/desinfect-signatures

Bei der ersten Signaturaktualisierung wird dieser Ordner dann eingebunden und befüllt. Der Systemmonitor von Desinfec’t zeigt dies mit „Signaturen auf NFS“ an. Bitte achten Sie darauf, dass zu keiner Zeit zwei aus dem Netz gebootete Clients gleichzeitig Signaturen aktualisieren dürfen. Wollen Sie mehrere Clients scannen, starten Sie zunächst einen, auf dem Sie das komplette Signaturupdate durchführen. Ist das geschehen, fahren Sie die anderen Clients hoch und starten Sie dort nach und nach den Virenscan mit ein paar Minuten Abstand.

Neben verschiedenen Desinfec’t-Versionen kann man über ein modifiziertes Netboot-Menü auch andere Linux-Distributionen via PXE starten.

Wenn Sie Desinfec’t 2021 auf einem Btrfs-Stick mit Änderungen versehen haben, können Sie das modifizierte Rootverzeichnis der Btrfs-Partition in den Ordner casper/filesystem.dir/ des exportierten Desinfec’t kopieren (rsync -avHP --delete-after quelle/ ziel/) und anschließend das komprimierte Dateisystem casper/filesystem.squashfs einfach löschen. Beim Netzwerkboot wird nun dieser Ordner als Root-Dateisystem genommen, spätere Anpassungen wie der Austausch von Grafiken oder Anpassungen der Starter auf dem Desktop (/etc/skel/Desktop) sind dann mit geringem Aufwand auf dem Server möglich.

Debugging

Falls mal etwas nicht funktioniert, schauen Sie noch einmal ganz genau hin: Mit dieser Schritt-für-Schritt-Anleitung sollten Konfigurationsprobleme schnell auffallen. Zusätzlich können sich erfahrene Linuxer beispielsweise mit einem TFTP-Client auf die Suche nach falsch gesetzten Berechtigungen für Dateien machen, die man per TFTP übertragen will. Problemen beim NFS-Mount kann man in der BusyBox-Shell eines unvollständig gestarteten Desinfec’t auf den Grund gehen, beispielsweise indem man das Share manuell einbindet und dabei auf Fehlerausgaben achtet:

mount -t nfs server://share /cdrom

Klappt der Mount ohne Fehler, prüfen Sie, ob das richtige Verzeichnis exportiert wurde. Der Inhalt von /cdrom muss exakt wie bei einem von DVD gebooteten Desinfec’t aussehen. Läuft alles, kann man die Optik noch etwas schicker machen: Im Syslinux-Wiki finden Sie viele Hinweise, um das PXE-Bootmenü aufzuhübschen (siehe ct.de/yr35). (des@ct.de)

Bootloader, PXE-Bootmenü aufhübschen, PXE-Bootumgebung auf DSL-Router: ct.de/yr35

Kommentieren