Custom Discovery Images for SecureBoot

Custom Discovery Images f├╝r SecureBoot

Im letzten Artikel „orcharhino und SecureBoot“ habe ich erkl├Ąrt, was SecureBoot ist, wie es funktioniert und welche M├Âglichkeiten es gibt, es in orcharhino zu implementieren. Dazu wurden am Ende verschiedene M├Âglichkeiten und L├Âsungen aufgezeigt, wobei hier auf Option 2 n├Ąher eingegangen werden soll. Ich empfehle diesen Blog Post vorab zu lesen f├╝r ein besseres Verst├Ąndnis des Folgenden.

Das Foreman Discovery Image

Das Foreman Discovery Image (FDI) ist ein „kleines RedHat-basiertes Image welches via PXE in den Arbeitsspeicher geladen wird, alle Netzwerkinterfaces initialisiert und via systemd ein Skript namens „discovery-register“ ausf├╝hrt.“ (vgl. [1]). Dieses Skript kontaktiert den orcharhino Server mittels einer mitgegebenen URL und l├Ądt dort die Host-Facts hoch um den Host im orcharhino Server als Discovered-Host einzutragen. Ist der Host dann dem orcharhino Server bekannt, kann bspw. eine Installation der Ziel-Distribution mittels kexec [2] gestartet werden. Diese Art des Installation ben├Âtigt keinen Reboot.

Fertige FDIs k├Ânnen von bezogen werden.

Diese FDIs unterst├╝tzen bereits die Erweiterung um zus├Ątzliche Skripte/Funktionalit├Ąt zur Laufzeit, in dem ZIP-Archive bspw. von einem TFTP- oder HTTP-Server nachgeladen werden k├Ânnen.

Alternativ kann ein FDI auch lokal gebaut werden.
Gr├╝nde daf├╝r sind bspw. aktuellere Paketversionen oder ein aktuellerer Kernel f├╝r die Unterst├╝tzung neuerer Hardware.

Mit dem Upstream-Repository [3] kann jeder ein FDI lokal selber bauen, allerdings mit den folgenden zwei Einschr├Ąnkungen:

  • die Build-Umgebung muss ein Enterprise Linux 8 (EL) System sein, bspw. RedHat Enterprise Linux 8, Rocky Linux 8 oder AlmaLinux 8

  • das resultierende FDI ist ein entsprechendes EL-basiertes System

Im Kontext von SecureBoot bedeutet Letzteres vereinfacht gesagt, dass mittels kexec nur eine Installation der selben Distribution gestartet werden kann da der Kernel sich im Lockdown befindet (vgl. [4]).

Somit k├Ânnen andere Distributionen wie bspw. Ubuntu, Debian oder SUSE mit aktiviertem SecureBoot in Kombination mit einem EL-basierten FDI nicht installiert werden.

Aufgrund meiner Erfahrungen mit fr├╝heren Projekten kam mir ein Tool in den Sinn, mit dem man diese Einschr├Ąnkungen ├╝berwinden kann: KIWI NG.

KIWI NG

KIWI Next Generation (KIWI NG) ist ein Open-Source-Tool zur Erstellung von benutzerdefinierte Images. Es stellt ein Kommandozeilenprogramm bereit und nutzt Konfigurationsdateien, die es Benutzern erm├Âglichen, die Komponenten und Einstellungen eines gew├╝nschten Images zu definieren. KIWI NG unterst├╝tzt verschiedene Image-Formate, darunter ISO und virtuelle Festplatten-Images. Es vereinfacht den Prozess der Erstellung reproduzierbarer und ma├čgeschneiderter Images f├╝r verschiedene Einsatzzwecke, wie Installationsmedien oder Bereitstellung in virtualisierten Umgebungen. KIWI NG wird u.a. im openSUSE Build Service (OBS) [5] eingesetzt.

KIWI NG kann auf verschiedensten Linux-Distributionen entweder ├╝ber den jeweiligen Paketmanager installiert werden [6] oder via PyPI [7].

Um KIWI NG in einem Container laufen zu lassen sind erweiterte Privilegien n├Âtig, bspw. f├╝r die ben├Âtigten mount-Syscalls.

Ein KIWI-Image wird durch folgende Dateien/Verzeichnisse konfiguriert:

  1. Eine XML-basierte Konfigurationsdateien, die verschiedene Aspekte des Images festlegen, wie das Basisbetriebssystem, zu installierende Pakete, das Ausgabeformat (z.B. ein ISO-Image), die Dateisystemstruktur, etc.

  2. Ein Bash-Skript welches im Ziel-Image ausgef├╝hrt wird und Anpassungen vornehmen kann wie bspw. die Konfiguration von Diensten.

  3. Ein root-Verzeichnis mit allen zus├Ątzlichen Dateien, die sp├Ąter im Wurzelverzeichnis des Images existieren sollen.

Es wird empfohlen ausgehend von Beispiel-Konfigurationen (vgl. [8]), den sogenannten Image-Beschreibungen, sein benutzerdefiniertes Image zu konfigurieren.

Um eine Ubuntu-Installation, bspw. Ubuntu 22.04, via kexec aus einem FDI heraus starten zu k├Ânnen bei aktiviertem SecureBoot, ben├Âtigen wir ein Ubuntu-basiertes FDI.

Foreman Discovery Image selber bauen mit KIWI NG

Nach einer Analyse der fertigen FDIs von Upstream und der EL-basierten Build-Skripte fiel auf, dass ein FDI grunds├Ątzlich aus einem Foreman Proxy und zus├Ątzlichen Skripten und Services besteht. Eine Suche ergab, dass der Foreman Proxy als Paket(e) f├╝r Ubuntu 20.04 (Focal) unter verf├╝gbar ist. Damit fiel die Wahl des Basisbetriebsystems ebenfalls auf Ubuntu 20.04 (Focal), das gew├╝nschte Image-Format ist ein ISO. Die XML-basierte Konfigurationsdateien wurde um die Repository-URL, das foreman-proxy Paket und andere Pakete erweitert (vgl. [9]).

Die Konfiguration des Images (vgl. [10]) kann gr├Â├čtenteils in das Bash-Skript ├╝bernommen werden.
Dort werden u.a. alle ben├Âtigten Services konfiguriert und eingeschalten damit diese beim Booten des FDI aktiv sind.

In das root-Verzeichnis werden alle zus├Ątzlichen Skripte kopiert, die nicht ├╝ber Pakete installiert werden k├Ânnen. Das betrifft u.a. das Discovery-Menu, welches beim Systemstart angezeigt wird und eine manuelle Bedienung des FDI zur Laufzeit erlaubt.

Hat man alles beisammen, kann das Image gebaut werden:

# kiwi-ng --debug system build --description ubuntu/x86_64/ubuntu-focal --target-dir /root/fdi-image

Der Build dauert je nach Build-Umgebung bis zu 30min. Das entstandene ISO kann nun als Boot-Medium genutzt werden, im einfachsten Fall bereitgestellt als virtuelles CD/DVD-Ger├Ąt. Nach der Kontaktaufnahme des Ubuntu-basierten FDI zum orcharhino Server kann eine Ubuntu 22.04 Installation via kexec gestartet werden. Das ist m├Âglich, da das ├╝ber shim (vgl. [14]) gebootete FDI eine Liste von vertrauensw├╝rdigen Schl├╝sseln vorh├Ąlt. Dazu geh├Âren vereinfacht gesagt immer die aktuellen Herstellerschl├╝ssel (z.B. von Canonical Ltd.), mit denen auch der Installations-Kernel signiert wurde.

Das hier beschriebene Vorgehen wurde stark vereinfacht zusammengefasst. Das Ergebnis zum Nachbauen eines FDIs mittels KIWI NG wurde auf GitHub ver├Âffentlicht [11]. Neben Ubuntu gibt es auch eine CentOS und AlmaLinux basierende Image-Beschreibung. Die Ubuntu Image-Beschreibung verlangt ├╝brigens den HWE-Kernel [12] um die neuste Hardwareunterst├╝tzung zu gew├Ąhrleisten.

├ťbrigens: Der OBS kann aktuell nicht ohne weiteres f├╝r den Bau des FDIs genutzt werden da der Zugriff auf externe Repositories (hier f├╝r die Foreman-Pakete) gesperrt ist. Man k├Ânnte versuchen die ben├Âtigten Foreman-Pakate ebenfalls im OBS zu bauen und zu paketieren um diese dann nutzen zu k├Ânnen.

Foreman Discovery Image ├╝ber PXE bereitstellen

Der Einsatz von FDIs erfolgt u.a. in PXE-Umgebungen (Netzwerk-Boot) mittels DHCP- und TFTP-Server. F├╝r ein Standard-Setup (vgl. [13]) in einer PXE-Umgebung wird anstelle der ISO-Datei ein tar-Archiv benutzt. Dieses tar-Archiv beinhaltet neben dem FDI Kernel auch eine Initrd, welche das komplette FDI root-Verzeichnis beinhaltet, und ensteht als zus├Ątzliches Artefakt beim Bau mit dem Upstream-Repository (siehe oben).

Bei KIWI NG erhalten wir nur die ISO-Datei als Artefakt. Die darin enthaltene Initrd enth├Ąlt nicht das komplette FDI root-Verzeichnis, ist aber in der Lage, die ISO-Datei mittels HTTP herunterzuladen, das darin enthaltene root-Verzeichnis zu mounten und das System zu starten.

Diese Variante wird ├╝brigens von allen FDIs unterst├╝tzt und bietet bei PXE-Umgebungen mit TFTP einen erheblichen Zeitgewinn, da das mehrere Hunderte Megabyte gro├če FDI root-Verzeichnis nicht ├╝ber das langsame TFTP- sondern ├╝ber das HTTP-Protokoll geladen wird.

Die Vorbereitung auf dem jeweiligen orcharhino Proxy sieht wie folgt aus:

mount /tmp/fdi.iso /mnt/
mkdir /var/lib/tftpboot/boot/fdi-image-slim
cp /mnt/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/boot/fdi-image-slim/
umount /mnt
mkdir /var/www/html/pub/fdi-image-slim
mv /tmp/fdi.iso /var/www/html/pub/fdi-image-slim

Das ISO wird gemountet, der Kernel und die Initrd werden in das TFTP-Verzeichnis kopiert. Das ISO selber wird in das HTTP-Verzechnis verschoben, damit es sp├Ąter von Initrd heruntergeladen werden kann.

Zum Schluss muss noch das PXE-Template angepasst werden (pxegrub2_discovery Snippet):

common_slim="rootflags=loop root=live:http://YOURPROXY/pub/fdi-image-slim/fdi.iso rootfstype=auto ro rd.live.image acpi=force rd.luks=0 rd.md=0 rd.dm=0 rd.lvm=0 rd.bootif=0 rd.neednet=0 nokaslr nomodeset proxy.url= proxy.type=proxy BOOTIF=01-$net_default_mac ip=dhcp"

menuentry 'Foreman Discovery Image EFI Slim' --id discovery {
  linuxefi boot/fdi-image-slim/vmlinuz ${common_slim}
  initrdefi boot/fdi-image-slim/initrd.img
}

Dieser Eintrag erlaubt das Booten eines FDI mit kleiner Initrd und dem Nachladen des root-Verzeichnis aus der ISO-Datei (siehe root=live: Parameter). Denkbar ist auch die Verwendung mehrere FDIs parallel die auf unterschiedlichen Distributionen basieren.

Zusammenfassung

Fertige FDIs k├Ânnen aus Onlinequellen heruntergeladen werden. Das Selber bauen von FDIs erm├Âglicht die Verwendung von aktuelleren Paketst├Ąnden inkl. dem Kernel, welches zu einer besseren Hardwareunterst├╝tzung beitr├Ągt. Ist SecureBoot aktiviert, muss man f├╝r jede zu installierende Distribution ein entsprechendes FDI bauen welches auf der jeweiligen Distribution basiert.

Das Bauen von FDIs, speziell f├╝r Nicht-EL-basierende Distributionen, gelingt mit KIWI NG. Mittels der Image-Beschreibungen aus [11] kann jeder relativ einfach ein FDI lokal bauen welches auf Ubuntu, CentOS oder AlmaLinux basiert und damit die jeweilige Beschr├Ąnkung bzgl. SecureBoot erf├╝llt.

[1]: https://github.com/theforeman/foreman-discovery-image

[2]: https://linux.die.net/man/8/kexec

[3]: https://github.com/theforeman/foreman-discovery-image

[4]: https://wiki.debian.org/SecureBoot#Secure_Boot_limitations

[5]: https://build.opensuse.org/

[6]: https://osinside.github.io/kiwi/installation.html#installation-from-obs

[7]: https://pypi.org/project/kiwi/

[8]: https://github.com/OSInside/kiwi-descriptions

[9]: https://github.com/theforeman/foreman-discovery-image/blob/master/20-packages.ks

[10]: https://github.com/theforeman/foreman-discovery-image/blob/master/22-discovery.ks

[11]: https://github.com/ATIX-AG/foreman-discovery-image-kiwi

[12]: https://www.thomas-krenn.com/de/wiki/Ubuntu_LTS_Hardware_Enablement_Stack

[13]: https://theforeman.org/plugins/foreman_discovery/18.0/index.html

[14]:

The following two tabs change content below.

Jan L├Âser

Neueste Artikel von Jan L├Âser (alle ansehen)