Arch Linux: Installation mit LVM, LUKS, AppArmor, systemd-boot und UEFI Secure Boot mit eigenen Keys

Vor Kurzem habe ich mein Notebook erfolgreich von Xubuntu auf Arch Linux umgestellt. Wie bei meiner bisherigen Xubuntu-Installation sollte Arch Linux natürlich mit Festplatten-Vollverschlüsselung (mittels LVM on LUKS) sowie aktiviertem AppArmor installiert werden. Außerdem wollte ich als zusätzliche Sicherheitsebene, Arch Linux mit aktiviertem UEFI Secure Boot in Verbindung mit eigenen Secure Boot Keys einrichten. In diesem Zusammenhang sollte zudem systemd-boot anstatt GRUB als Bootloader zum Einsatz kommen. Wie ich das Ganze umgesetzt habe, könnt ihr in diesem Beitrag lesen.

Folgende Software wurde verwendet:
  • Arch Linux

Vorbereitung - bootfähigen USB-Stick erstellen

Arch-Linux-Installationsimage herunterladen

Im ersten Schritt ist das Installationsimage für Arch Linux herunterzuladen. Dazu sucht euch einen geeigneten Mirror aus der Liste auf https://archlinux.org/download/ aus und ladet die Imagedatei archlinux-{datum}-x86_64.iso herunter. Zur Sicherheit solltet ihr die Imagedatei noch verifizieren (siehe auch Software-Signaturen verifizieren).

Image auf USB-Stick kopieren

Steckt euren USB-Stick in euren Rechner und ermittelt, z.B. mittels dem Befehl lsblk, die Geräte-ID eures USB-Sticks. Anschließend kopiert das heruntergeladene sowie verifizierte Image mit folgendem Befehl auf euren USB-Stick:

dd if=archlinux-{datum}-x86_64.iso of=/dev/{deviceId} bs=4096
Terminal / Konsole

Eigene Secure Boot Keys erzeugen

Falls noch nicht geschehen, solltet ihr vor der Installation euch eure eigenen Secure Boot Keys erzeugen. Auf diesen Schritt gehe ich in diesem Beitrag aber nicht näher ein.
Details siehe Arch-Linux-Wiki: Secure Boot Keys erzeugen

Arch-Linux-Grundsystem installieren

USB-Stick booten und Installation starten

Startet euren Rechner mit eingestecktem USB-Stick neu und bootet diesen im UEFI-Bootmodus. Startet die Installation und ihr gelangt in die Live-USB-Kommandozeile von Arch Linux. Zuallererst bietet es sich an, das Tastatur-Layout auf Deutsch umzustellen:

loadkeys de-latin1
Terminal / Konsole

Stellt nun sicher, dass ihr den USB-Stick wirklich im UEFI-Bootmodus gebootet habt. Dazu prüft, ob es das Verzeichnis /sys/firmware/efi/efivars gibt und Dateien enthalten sind. Weiterhin stellt sicher, dass euer Rechner über eine aktive Internetverbindung verfügt, z.B. mittels ping archlinux.org.

Hinweis Internetverbindung herstellen

Ich selbst verwende zur Installation immer eine Ethernet-Verbindung. Falls das für euch keine Option ist, könnt ihr euch natürlich auch per WLAN mit eurem Router verbinden.
Details siehe Arch-Linux-Wiki - Installation guide - Connect to the internet.

Bevor es dann richtig mit der Installation losgeht, solltet ihr außerdem noch sicherstellen, dass die Systemzeit korrekt eingestellt ist:

timedatectl set-ntp true
Terminal / Konsole

Partitionen erstellen

Ziel der folgenden Partionierung ist es, eine EFI-System-Partition sowie eine Root-Partition zu erstellen. Die EFI-Partition wird unverschlüsselt bleiben und die mit euren eigenen Secure Boot Keys signierten EFI-Boot-Dateien enthalten. Die Root-Partition hingegen wird vollumfänglich mittels LUKS verschlüsselt werden.

Ermittelt nun, z.B. wieder mit lsblk, die Geräte-ID eurer zu partionierenden Festplatte. Anschließend ruft das Partionierungsprogramm parted und folgende dazugehörige Befehle auf:

parted /dev/{deviceId}
(parted) mklabel gpt
(parted) mkpart "efi" fat32 1MiB 2GiB
(parted) set 1 esp on
(parted) mkpart "root" ext4 2GiB 100%
(parted) unit GiB print free
Modell: Virtio Blockorientiertes Gerät (virtblk)
Festplatte  /dev/vda:  20,0GiB
Sektorgröße (logisch/physisch): 512B/512B
Partitionstabelle: gpt
Disk-Flags:
Nummer  Anfang   Ende     Größe    Dateisystem   Name  Flags
        0,00GiB  0,00GiB  0,00GiB  Freier Platz
 1      0,00GiB  2,00GiB  2,00GiB  fat32         efi   boot, esp
 2      2,00GiB  20,0GiB  18,0GiB  ext4          root
        20,0GiB  20,0GiB  0,00GiB  Freier Platz
(parted) quit
Terminal / Konsole

Im konkreten Fall habt ihr nun eine EFI-Partition vom Typ FAT32 mit 2GB und eine Root-Partition vom Typ ext4 mit dem restlichen freien Speicher erzeugt.

LUKS-Verschlüsselung und LVM einrichten

Ziel des jetziges Schritts ist es, die Root-Partition mit LUKS zu verschlüsseln und innerhalb der verschlüsselten Root-Partition ein LVM einzurichten.

Mithilfe von cryptsetup verschlüsseln wir und öffnen anschließend direkt die verschlüsselte Root-Partition (deviceId ist die Geräte-ID der Root-Partition):

cryptsetup luksFormat --verbose --verify-passphrase --type luks2 --cipher aes-xts-plain64 --key-size 512 --hash sha512 --label rootcrypt /dev/{deviceId}
cryptsetup open /dev/disk/by-label/rootcrypt rootlvm
Terminal / Konsole
Hinweis LUKS-Version beachten

Ich verwende an dieser Stelle die Version 2 von LUKS. Falls ihr euch später dazu entschließen solltet, von systemd-boot auf GRUB als Bootloader zu wechseln, beachtet bittet, dass GRUB ggf. LUKS2 (noch) nicht vollumfänglich unterstützt. Im Zweifel könnt ihr an dieser Stelle sonst auch LUKS Version 1 verwenden.

Als nächstes richten wir LVM ein mit entsprechenden Logical Volumes ein. Größe, Bezeichnung und Anzahl der Logical Volumes könnt ihr individuell festlegen. In diesem Beispiel erzeuge ich nur ein "root"-, "swap"- und "home"-Volume (die Größen der Volumes in diesem Beispiel sind so klein, weil ich nur eine virtuelle 20GB-Festplatte innerhalb einer VM zum Testen verwende).

pvcreate /dev/mapper/rootlvm
vgcreate lvmvg /dev/mapper/rootlvm
lvcreate -L 12G lvmvg -n root
lvcreate -L 2G lvmvg -n swap
lvcreate -l 100%FREE lvmvg -n home
Terminal / Konsole

Partitionen bzw. Logical Volumes formatieren

Nachdem wir unsere dynamischen Partitionen (die Logical Volumes) angelegt haben, können wir sie nun wie normale Partitionen formatieren:

mkfs.fat -F32 -n efi /dev/{efiDeviceId}
mkfs.ext4 -L root /dev/lvmvg/root
mkfs.ext4 -L home /dev/lvmvg/home
mkswap -L swap /dev/lvmvg/swap
Terminal / Konsole

chroot einrichten & Grundsystem installieren

Im nächsten Schritt richten wir eine chroot-Umgebung ein. Dazu sind die soeben erzeugten Partionen innerhalb /mnt wie folgt einzuhängen:

mount /dev/lvmvg/root /mnt
mkdir /mnt/efi
mkdir /mnt/home
mount /dev/disk/by-label/efi /mnt/efi
mount /dev/lvmvg/home /mnt/home
swapon /dev/lvmvg/swap
Terminal / Konsole

Bevor nun das Grundsystem von Arch Linux unter /mnt installiert wird, überprüft ggf. noch einmal die Mirror-Liste unter /etc/pacman.d/mirrorlist, ob die Mirrors für euch ok sind und passt sie ggf. an (siehe auch Arch-Mirror-Status-Liste). Die Installation von Arch Linux bzw. die des Grundsystems erfolgt dann anschließend mit folgendem Befehl:

pacstrap /mnt base linux linux-firmware intel-ucode lvm2 sudo ufw apparmor networkmanager binutils efitools sbsigntools nano
Terminal / Konsole

Bei Bedarf könnt ihr auch direkt weitere Pakete angeben, die gleich mitinstalliert werden sollen. Ich selbst installiere an dieser Stelle aber erst einmal nur die, die ich für die eigentliche Installation und die danach folgende Grundkonfiguration benötige. Beachtet auch, dass ihr anstatt intel-ucode das entsprechende AMD--Microcode-Paket installiert, falls ihr eine AMD-CPU in eurem Rechner habt.

Nachdem alle Pakete installiert sind, könnt ihr die fstab-Dateisystem-Konfigurationsdatei generieren.

genfstab -U /mnt >> /mnt/etc/fstab
Terminal / Konsole

Abschließend wechseln wir in die chroot-Umgebung:

arch-chroot /mnt
Terminal / Konsole

Grundkonfiguration vornehmen

Innerhalb der chroot-Umgebung passen wir erst einmal die Zeit, Sprach- und Hosteinstellungen an. Öffnet als erstes die Datei /etc/locale.gen und löscht die Kommentar-Raute vor dem Eintrag de_DE.UTF-8. Nun führt ihr folgende Befehle aus:

ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
hwclock --systoh
locale-gen
echo LANG=de_DE.UTF-8 > /etc/locale.conf
echo KEYMAP=de-latin1-nodeadkeys > /etc/vconsole.conf
Terminal / Konsole

Für die Host-Einstellungen konfiguriert den Namen für euren Rechner:

echo MeinRechner > /etc/hostname
Terminal / Konsole

Daraufhin fügt folgende Zeilen in die /etc/hosts:

127.0.0.1   localhost
127.0.1.1   MeinRechner
Datei: /etc/hosts (chroot-Umgebung)

Als letztes ist nun noch die /etc/mkinitcpio.conf anzupassen, so dass die HOOKS-Zeile wie folgt aussehen sollte:

HOOKS=(base udev autodetect keyboard keymap consolefont modconf block encrypt lvm2 filesystems fsck)
Datei: /etc/hosts (chroot-Umgebung)

Jetzt muss nur noch das initramfs-Image neu erstellt werden, wozu folgender Befehl dient:

mkinitcpio -P
Terminal / Konsole

Bootloader (systemd-boot) & Secure Boot einrichten

Zum erfolgreichen Booten unseres neuen Arch-Linux-Systems fehlt nun noch der Bootloader. Weiterhin müssen die EFI-Boot-Dateien noch mit euren eigenen Secure Boot Keys signiert und auf die EFI-System-Partition kopiert werden. Bdedenkt zudem, dass das Signieren und Kopieren nach jeder Bootloader-, Kernel, initramfs bzw. Microcode-Aktualisierung von Nöten ist. An dieser Stelle kommt das von mir entwickelte secbootctl zum Einsatz, dass den ganzen Vorgang komfortabler und einfacher macht.

Installiert secbootctl entsprechend der Anleitung auf der GitHub-Projektseite. Kopiert dann eure Secure Boot Keys - genauer gesagt die db.key und db.crt - in das Verzeichnis /etc/secbootctl/keys. Legt zudem die Datei /etc/kernel/cmdline mit folgendem Inhalt an:

cryptdevice=LABEL=rootcrypt:rootlvm root=LABEL=root rw quiet lsm=landlock,lockdown,yama,apparmor,bpf
Datei: /etc/kernel/cmdline (chroot-Umgebung)

Dann führt die nachfolgenden Befehle aus, um systemd-boot auf der EFI-System-Partition zu installieren als auch die EFI-Boot-Dateien zu signieren und auf die EFI-Partition zu kopieren:

secbooctl bootloader:install
secbooctl kernel:install
secbooctl bootloader:update-menu
secbooctl pmi:install
Terminal / Konsole

Falls ihr in eurer UEFI-Firmware noch nicht eure Secure Boot Keys hinterlegt habt, kopiert eure Public-Keys bzw. Zertifikate temporär nach /efi/keys.

Root- und Standard-Benutzer anlegen

Quasi der letzte Schritt bevor ihr in euer neues Arch-Linux-System booten könnt, ist das Anlegen eines Root- sowie normalen Standard-Benutzers. Den Root-Benutzer gibt es im Prinzip schon, denn mit dem sind wir ja gerade in der chroot-Umgebung angemeldet. Vergebt nun mittels passwd ein Root-Passwort. Danach erstellt einen neuen Benutzer für euren täglichen Gebrauch:

useradd --create-home myname
passwd myname
gpasswd --add myname adm
groupadd sudo
gpasswd --add myname sudo
Terminal / Konsole

Nun noch die /etc/sudoers so anpassen, dass Benutezr der Gruppe sudo Befehle mit Root-Rechten ausführen dürfen. Dazu löscht die Kommentar-Raute vor der folgenden Zeile:

%sudo ALL=(ALL) ALL
Datei: /etc/sudoers (chroot-Umgebung)

Installation fertigstellen

Um die Installation abzuschließen, meldet euch aus der chroot-Umgebung ab, hängt die chroot-Mounts aus und startet euren Rechner neu (wechselt direkt ins BIOS - USB-Stick abziehen nicht vergessen):

exit
umount -R /mnt
reboot
Terminal / Konsole

Bevor ihr das neue Arch-Linux-System bootet, hinterlegt in eurem BIOS eure Secure Boot Keys, aktiviert Secure Boot und startet den Rechner neu. Wenn alles geklappt hat und Arch Linux erfolgreich gebootet wurde, landet ihr auf der Kommandozeile mit Login-Abfrage. Meldet euch nun mit eurem Standard-Benutzer an.

Hinweis Zugriff auf BIOS mit Passwort schützen

Damit ein "Angreifer" nicht einfach Secure Boot über das BIOS-Menü deaktivieren kann, solltet ihr den Zugriff auf das BIOS per Passwort schützen.

(Grund-)Konfiguration nach Installation

Root-Benutzer deaktivieren

Ich selbst verwende nie den Root-Benutzer und deaktiviere ihn deshalb bei mir mittels:

sudo passwd --lock root
Terminal / Konsole

Firewall, AppArmor & Netzwerk einrichten & aktivieren

ufw-Firewall, AppArmor und Network-Manager lassen sich wie folgt aktivieren:

sudo systemctl enable ufw
sudo ufw enable
sudo systemctl enable NetworkManager.service
sudo systemctl start NetworkManager.service
sudo systemctl enable apparmor.service
sudo systemctl start apparmor.service
Terminal / Konsole

Startet euren Rechner neu und vergewissert euch mittels sudo aa-enabled , dass AppArmor läuft. Seit ihr per Ethernet mit eurem Router verbunden, sollte ihr nun auch Zugriff aufs Internet haben.

Zusätzliche Software bzw. Pakete installieren & einrichten

An dieser Stelle ist es euch überlassen, welche zusätzlichen Pakete ihr noch benötigt und installiert. Empfehlenswert ist natürlich erst einmal eine Desktop-Umgebung, wie z.B. Xfce, Gnome oder KDE, zu installieren.

Zusätzliche Sicherheits-Tipps

Im Folgenden noch einige "Hardening"-Tipps, die ich bei mir noch umgesetzt habe (siehe auch Arch-Linux-Wiki: Security).

fstab anpassen

Für einige Partitionen, wie z.B. "home", setze ich bspw. noch alle oder einige von diesen Dateisystem-Optionen:

  • nodev
  • noexec
  • nosuid

VM-Ausführung absichern

Meine QEMU/ KVM-VMs, die ich mit Virtual Machine Manager (VMM) verwalte, führe ich immer ohne Root-Rechte und mit Absicherung durch AppArmor aus:

Xorg ohne Root-Rechte ausführen

Für den Fall, dass man nicht Wayland, sondern Xorg (X11) als Display-Server verwendet, sollte man darauf achten, das Xorg ohne Root ausgeführt wird.

Unterstützung für "Unprivileged User Namespaces" deaktivieren

Unter anderen Distributionen, wie z.B. Debian, ist die Kernel-Unterstützung für "unprivileged user namespaces" aus Sicherheitsgründen deaktiviert. Ich habe es bei mir auch deaktiviert, indem ich eine Datei namens 99-disable-unprivileged-userns.conf im Verzeichnis /etc/sysctl.d mit folgendem Inhalt angelegt habe:

kernel.unprivileged_userns_clone=0
Datei: /etc/sysctl.d/99-disable-unprivileged-userns.conf

Fazit

Die Installation von Arch Linux ist im Vergleich zu anderen Distributionen etwas aufwendiger und auch nicht unbedingt für Linux-Neulinge geeignet. Mir persönlich liegt der Do-it-youself-Ansatz aber, weil ich mein System genau nach meinen Vorstellungen konfigurieren kann und im Bezug auf die Software immer auf dem neuesten Stand bin. Grundsätzlich kann man die ganzen sicherheitsrelevanten Aspekte, wie Festplatten-Verschlüsselung, AppArmor und UEFI Secure Boot mit eigenen Keys, aber auch mit anderen Distributionen, wie z.B. Debian oder Ubuntu, umsetzen (secbootctl funktioniert bspw. auch ohne Probleme unter Debian und Ubuntu).

Feedback

Für Feedback zum Beitrag, seien es Fragen, Korrigierungen und/oder Anregungen, könnt ihr mir gerne eine Nachricht per E-Mail oder Mastodon schreiben (siehe Kontakt).