Arch Linux verschlüsselt mit Systemd-Boot + Dropbear im RAID

Vorbereitung

Diese Anleitung dient als Vorlage und muss den persönlichen Wünschen ggf. angepasst werden.
Bei falscher Anwendung droht Datenverlust!

Platten vorbereiten

Hier werden 2 NVMEs verwendet und eine GPT Tabelle mit 3 Partitionen eingerichtet.
Während die erste als notwendiger Platzhalter verwendet wird, ist die zweite als /boot und EFI Partition gedacht.
Auf der dritten Partition wird im späteren Verlauf ein LVM eingerichtet und das Linux-System installiert.

Sollte ein anderer RAID-Typ (z.B 0, 10, 5, 6, …) gewünscht sein, müssen weitere Festplatten vorbereitet werden…

erste NVME
parted -s /dev/nvme0n1 mklabel gpt
parted -s /dev/nvme0n1 mkpart primary 1m 4m
parted -s /dev/nvme0n1 mkpart primary 4m 1g
parted -s /dev/nvme0n1 mkpart primary 1g 100%free
parted -s /dev/nvme0n1 set 2 esp on
zweite NVME
parted -s /dev/nvme1n1 mklabel gpt
parted -s /dev/nvme1n1 mkpart primary 1m 4m
parted -s /dev/nvme1n1 mkpart primary 4m 1g
parted -s /dev/nvme1n1 mkpart primary 1g 100%free
parted -s /dev/nvme1n1 set 2 esp on

RAID

EFI

Damit die Boot und EFI Partition auch redundant verfügbar ist und das System damit beim Ausfall einer Platte weiterhin bootbar bleibt, wird ein RAID1 eingerichtet.
In Version 1.0 werden die Metadaten des RAIDS an das Ende geschrieben, sodass das eigentliche Dateisystem vorne für das UEFI lesbar bleibt!

mdadm --create --level=1 --raid-devices=2 --metadata=1.0 /dev/md/efi /dev/nvme0n1p2 /dev/nvme1n1p2
LVM (System)
mdadm --create --level=1 --raid-devices=2 --metadata=1.2 /dev/md/lvm /dev/nvme0n1p3 /dev/nvme1n1p3

Verschlüsselung

Beim luksFormat Befehl ist ein sicheres Kennwort zur Entsperrung der Partition zu wählen.
Dieses muss bei jedem Boot eingegeben werden:

cryptsetup -c aes-xts-plain -y -s 512 luksFormat /dev/md/lvm

Danach wird das Volume das erste mal geöffnet und steht unter `/dev/mapper/lvm_crypt zur Verfügung.

cryptsetup luksOpen /dev/md/lvm lvm_crypt

LVM Einrichtung

Für das Betriebssystem (/) werden 300 GiByte vorgesehen

pvcreate /dev/mapper/lvm_crypt
vgcreate vg0 /dev/mapper/lvm_crypt
lvcreate vg0 -n root -L 300g

Formatierung

Die EFI/Boot Partition muss von UEFI gelesen werden können. Hier empfiehlt sich das Fat32 Dateisystem.
Das Betriebssystem wird auf Ext4 installiert:

mkfs.fat -F 32 -n UEFI /dev/md/efi
mkfs.ext4 /dev/mapper/vg0-root

Einhängen der Volumes und Installation

mount /dev/mapper/vg0-root /mnt
mkdir /mnt/boot
mount /dev/md/efi /mnt/boot

pacstrap /mnt base lvm2 mdadm linux-lts linux-firmware dhcpcd vim bash-completion openssh
genfstab -Up /mnt > /mnt/etc/fstab

diverse Einstellungen

echo "server" > /mnt/etc/hostname
sed -e 's/^#de_DE/de_DE/g' -e 's/^#en_US/en_US/g' -i /mnt/etc/locale.gen

arch-chroot /mnt locale-gen
echo KEYMAP=de-latin1 > /mnt/etc/vconsole.conf

Initramfs Einstellungen

Diese Einstellungen sind nötig, damit der Bootprozess in der richtigen Reihenfolge abläuft.
Grob gesagt sieht dieser wie folgt aus:

  • Festplatten erkennen (block)
  • Scan und Starten von RAIDs
  • Netzwerkkonfiguration
  • Dropbear (SSH) starten
  • Skript zum öffnen der Festplatte (Passwortabfrage)

Ist das LVM-RAID geöffnet, geht es weiter:

  • LVM Scan (Gruppen & Volumes)
  • Dateisysteme einhängen
cat - > /mnt/etc/mkinitcpio.conf.d/z-custom.conf <<EOF
HOOKS=(base udev autodetect keyboard keymap modconf block mdadm_udev netconf dropbear encryptssh lvm2 resume filesystems keyboard fsck)
EOF

Einrichtung von Dropbear und Systemd-Boot

arch-chroot /mnt pacman -S --noconfirm mkinitcpio-dropbear mkinitcpio-utils mkinitcpio-netconf
SSH Key hinterlegen

Dropbear unterstützt beim Booten nur eine keybasierte Authentifizierung.
Deshalb werden die bekannten SSH Keys hinterlegt (optional).
Sind keine Keys hinterlergt, kann der Bootprozess nicht per SSH unterstützt werden und die Passworteingabe erfolgt mittels Tastatur am Gerät selbst.

ssh-add -L > /mnt/root/.ssh/authorized_keys
ssh-add -L > /mnt/etc/dropbear/root_key
arch-chroot /mnt bootctl install
arch-chroot /mnt mkinitcpio -p linux-lts

IP=10.20.0.33
GW=10.20.0.1
NM=255.255.255.0
IF=eth0

UUID=$(blkid  /dev/md/lvm --match-tag UUID -o value)
PARMS="ip=$IP:$IP:$GW:$NM:server:$IF:none"

cat - > /mnt/boot/loader/entries/arch.conf <<EOF
title    Arch Linux
linux    /vmlinuz-linux-lts
initrd   /initramfs-linux-lts.img
options  cryptdevice=UUID=${UUID}:cryptlvm:allow-discards root=/dev/mapper/vg0-root rw init=/usr/lib/systemd/systemd $PARMS
EOF

cat - > /mnt/boot/loader/entries/arch-fallback.conf <<EOF
title    Arch Linux Fallback
linux    /vmlinuz-linux-lts
initrd   /initramfs-linux-lts-fallback.img
options  cryptdevice=UUID=${UUID}:cryptlvm:allow-discards root=/dev/mapper/vg0-root rw init=/usr/lib/systemd/systemd $PARMS
EOF

cat - > /mnt/boot/loader/loader.conf <<EOF
timeout 3
default arch.conf
EOF
Prüfung ob Systemd-Boot korrekt konfiguriert ist
arch-chroot /mnt bootctl is-installed
yes

# no red entries
arch-chroot /mnt bootctl list

Root Passwort setzen

arch-chroot /mnt passwd root

Abschluss

umount /mnt/boot
umount /mnt
vgchange -an vg0
cryptsetup close lvm_crypt
sync
reboot