Zuletzt aktualisiert am 25. März 2021
Ich habe mir einen neuen Server bei Hetzner geholt und
wollte diesen natürlich gerne vollverschlüsselt einrichten. Der Server verfügt
dabei über zwei Platten die in einem RAID 1 komplett gespiegelt werden. Ein LVM
wird eingesetzt bzw. kann eingesetzt werden.
Meine konkreten Ziele sind nun gewesen:
- Erzeugen von 3 Partitionen (root, swap, boot)
- root soll komplett verschlüsselt sein
- swap soll ebenfalls verschlüsselt sein (der Schlüssel kann beim shutdown
„vergessen“ werden) - boot darf unverschlüsselt bleiben
- Der Server muss fern startbar bleiben
- dafür müssen die Partitionen beim starten per ssh entschlüsselt werden
Ausgangspunkt
Initial habe ich über die Webschnittstelle von Hetzer ein ArchLinux automatisch
installieren lassen, alternativ kann man dies über das Rescue-Image anstoßen,
dabei ist dann noch mehr Konfiguration möglich. Ich gehe im weiteren Verlauf
daher von einem System mit ArchLinux aus.
Nach der Installation waren die Platten wie folgt angelegt:
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.4T 0 disk
├─sda1 8:1 0 16G 0 part
│ └─md0 9:0 0 16G 0 raid1 [SWAP]
├─sda2 8:2 0 512M 0 part
│ └─md1 9:1 0 511.4M 0 raid1 /boot
└─sda3 8:3 0 1.4T 0 part
└─md2 9:2 0 1.4T 0 raid1 /
sdb 8:16 0 1.4T 0 disk
├─sdb1 8:17 0 16G 0 part
│ └─md0 9:0 0 16G 0 raid1 [SWAP]
├─sdb2 8:18 0 512M 0 part
│ └─md1 9:1 0 511.4M 0 raid1 /boot
└─sdb3 8:19 0 1.4T 0 part
└─md2 9:2 0 1.4T 0 raid1 /
Ich beziehe mich in diesem Beitrag auf mehrere Quellen, die mir auf
meinem Weg geholfen haben und entleihe mir daher auch einige Vorgehensweisen
genau diesen Quellen.
Installation von Software
Um den Server zu Verschlüsseln und auch wieder Entschlüsseln zu können benötigen
wir ein wenig Zusatzsoftware z.T. kommt diese auch aus den
Arch User Repository.
pacman -Syyu
pacman -S cryptsetup
pacman -S busybox dropbear
Da wir ein paar Pakete aus den AUR benötigen installierte ich mir den AUR Helper
yay. Da AUR Helper nicht als root ausgeführt
werden sollten und folgerichtig dann auch den Dienst verweigern sollte man ggf.
sudo nachinstallieren um ohne dauerhaften Userwechsel Kommandos als weniger
priviligierter Nutzer absetzen zu können. Die sudo-Konfiguration überlasse ich
dem Leser.
pacman -S go sudo git gcc make fakeroot
useradd – create-home npuser
sudo -u npuser git clone https://aur.archlinux.org/yay.git /tmp/
cd /tmp/yay
sudo -u npuser makepkg -s
pacman -U yay-*.pkg.tar.xz
rm -rf /tmp/yay-*
Abschließend kann man sich die benötigten Pakete aus dem AUR installieren.
sudo -u npuser yay -S mkinitcpio-dropbear mkinitcpio-netconf mkinitcpio-utils
cryptsetup
backup
Das Einrichten der Verschlüsselung beginnen wir im RecoveryImage mit dem Sichern
des Systems.
mkdir /oldroot
mount /dev/md2 /mnt
rsync -ah – info=progress2 /mnt/ /oldroot/
umount /mnt
encrypt root
Zunächst verschlüsseln wir die root-Partition.
cryptsetup – cipher aes-xts-plain64 -s 512 – iter-time 5000 luksFormat /dev/md2
Das Ergebnis kann mittels cryptsetup luksDump /dev/md2
verifiziert werden.
LUKS header information for /dev/md2
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 512
MK digest: 0b 03 9c 87 27 36 eb 5e 22 a2 a4 7b e7 f1 84 ce 95 83 0e f0
MK salt: 56 b9 eb ff 93 ff 35 e0 47 51 b5 5d 10 d2 46 36
4e a1 8d 00 98 6c 3f 86 08 07 74 13 60 85 74 dc
MK iterations: 776250
UUID: 9a77182f-044b-48d2-819f-a45d4bc7f175
Key Slot 0: ENABLED
Iterations: 3106791
Salt: c0 15 84 00 66 5f cb 88 1f 54 23 f7 a5 ce bc bc
2c 5e 10 00 24 55 8d 4e c1 eb 3b 4d 3b f5 fe fb
Key material offset: 8
AF stripes: 4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
Die Partition wollen wir nun wieder entschlüsselt bereitstellen:
cryptsetup luksOpen /dev/md2 root
Um wieder Daten speichern zu können muss natürlich ein Dateisystem eingerichtet
werden:
mkfs.ext4 /dev/mapper/root
tune2fs -i 6m -e remount-ro -c 50 /dev/mapper/root
debackup
Nun können alle Daten wieder zurück auf die (neue) root-Partition überspielt
werden.
mount /dev/mapper/root /mnt
rsync -ah – info=progress2 /oldroot/ /mnt/
umount /mnt
swap
Da ich auf dem Server kein suspend-to-disk benötige wähle ich für die
swap-Partition ein zufälliges Passwort. In diesem Setup genügt daher ein Eintrag
in der Datei /etc/crypttab
(siehe Ende des Dokumentes).
Nacharbeiten (Konfigurationen)
Alle hier aufgelisteten Schritte könnten auch bereits vorab erleidgt werden,
werden sie hinterher (d.h. nach einem reboot) erledigt müssen sie ggf. aus dem
RescueImage heraus im chroot ausgeführt werden.
mount /dev/mapper/root /mnt
mount /dev/md1 /mnt/boot
mount – bind /dev /mnt/dev
mount – bind /sys /mnt/sys
mount – bind /proc /mnt/proc
chroot /mnt
ssh-Zugang
Der ssh-public-key welcher für den Login zum descrypt der Partitionen verwendet
weren soll muss in der Datei /etc/dropbear/root_key
hinterlegt werden. Die
Datei hat den selben Aufbau wie die bekannte authorized_keys
-Datei. Beachte,
dass zumindest in meinem Test dropbear maximal 8192bit-rsa-Schlüssel akzeptiert,
außerdem unterstützt dropbear keine ed25519-Schlüssel. Die Host-Keys werden für
das initramfs aus dem normalen openssh-Server übernommen, sodass
sich das „unlock-System“ bei ssh wie der eigentliche Server verhält.
initramfs
In der Datei /etc/mkinitcpio.conf
müssen bei den HOOKS weitere Einträge
hinzugefügt werden, so müssen netconf dropbear encryptssh
nach mdadm_udev
(o.Ä.) und vor lvm2
(falls verwendet) bzw. filesystems
eingefügt werden.
Meine vollständige Zeile liest sich wie folgt:
HOOKS=(base udev autodetect modconf block mdadm_udev netconf dropbear encryptssh lvm2 filesystems keyboard fsck)
Anschließend muss das initramfs neu generiert werden:
mkinitcpio -p linux
grub
In der Datei /etc/default/grub
müssen Kernel-Parameter unter
GRUB_CMDLINE_LINUX
eingefügt werden:
cryptdevice=/dev/md2:root ip=:::::eth0:dhcp
Dabei bezieht sich /dev/md2
natürlich auf den Bezeichner des crypt-roots,
root
ist der mapper-Name unter dem die Partition bereit gestellt werde soll.
Meine vollständige Zeile liest sich wie folgt:
GRUB_CMDLINE_LINUX="cryptdevice=/dev/md2:root ip=:::::eth0:dhcp"
Anschließend muss die GRUB-Config neu generiert werden:
grub-mkconfig -o /boot/grub/grub.cfg
fstab
In der Datei /etc/fstab
müssen die Einträge für die crypt-Partitionen
angepasst werden. Natürlich sind auch hier die gewählten Bezeichner einzusetzen.
/dev/mapper/swap none swap sw 0 0
/dev/mapper/root / ext4 defaults 0 2
crypttab
Nachdem die root-Partition entsperrt wurde können die übrigen Partitionen
automatisch entsperrt werden. Hierfür muss die Datei /etc/crypttab
bearbeitet
werden.
Bei mir betrifft das automatische Entsperren nur die swap-Partition. Ich trage
daher den folgenden Eintrag ein:
swap /dev/md/0 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256
Natürlich sollte hier bei einer Partition wie home kein zufällig Passwort,
sondern die abgelegte Passwortdatei angegeben werden.
aufräumen
Falls man vorher einen chroot „betreten“ hat sollte man nach Verlassen des
chroot wieder hinter sich „aufräumen“.
umount /mnt/boot
umount /mnt/proc
umount /mnt/sys
umount /mnt/dev
umount /mnt
sync
reboot
Ergebnis
Das Endergebnis findet sich in der folgenden Konfiguration:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.4T 0 disk
├─sda1 8:1 0 16G 0 part
│ └─md0 9:0 0 16G 0 raid1
│ └─swap 253:1 0 16G 0 crypt [SWAP]
├─sda2 8:2 0 512M 0 part
│ └─md1 9:1 0 511.4M 0 raid1 /boot
└─sda3 8:3 0 1.4T 0 part
└─md2 9:2 0 1.4T 0 raid1
└─root 253:0 0 1.4T 0 crypt /
sdb 8:16 0 1.4T 0 disk
├─sdb1 8:17 0 16G 0 part
│ └─md0 9:0 0 16G 0 raid1
│ └─swap 253:1 0 16G 0 crypt [SWAP]
├─sdb2 8:18 0 512M 0 part
│ └─md1 9:1 0 511.4M 0 raid1 /boot
└─sdb3 8:19 0 1.4T 0 part
└─md2 9:2 0 1.4T 0 raid1
└─root 253:0 0 1.4T 0 crypt /
Wenn man sich nun in den frisch gebooteten Server per ssh anmeldet wird man zum
Entsperren der root-Partition aufgefordert, danach wird die Verbindung wieder
geschlossen und das System startet.
Quellen
Quellen bzw. Tutorials, die ich zur Rate gezogen habe sind mindestens Folgende:
- https://gerstner.se/blog/post/encrypted_hetzner_server/
- https://wiki.archlinux.org/index.php/Dm-crypt/Specialties#Remote_unlocking_of_the_root_.28or_other.29_partition
- https://wiki.archlinux.org/index.php/Dm-crypt/Swap_encryption#Without_suspend-to-disk_support
- https://wiki.archlinux.org/index.php/Dm-crypt/System_configuration#cryptdevice
- https://wiki.archlinux.org/index.php/GRUB#Root_partition
- https://www.adfinis-sygroup.ch/blog/de/decrypt-luks-devices-remotely-via-dropbear-ssh/
Die Kommentare sind deaktiviert.