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.
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
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
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
.
Bevor es dann richtig mit der Installation losgeht, solltet ihr außerdem noch sicherstellen, dass die Systemzeit korrekt eingestellt ist:
timedatectl set-ntp true
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
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
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
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
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
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
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
Abschließend wechseln wir in die chroot-Umgebung:
arch-chroot /mnt
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
Für die Host-Einstellungen konfiguriert den Namen für euren Rechner:
echo MeinRechner > /etc/hostname
Daraufhin fügt folgende Zeilen in die /etc/hosts
:
127.0.0.1 localhost
127.0.1.1 MeinRechner
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)
Jetzt muss nur noch das initramfs-Image neu erstellt werden, wozu folgender Befehl dient:
mkinitcpio -P
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
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
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
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
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
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.
(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
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
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:
- Virtual Machine Manager & QEMU/KVM: VMs ohne Root-Rechte ausführen
- Arch Linux: libvirt mit AppArmor-Unterstützung installieren
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
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).