Drücke „Enter”, um zum Inhalt zu springen.

Full-crypt server setup mit ssh-decrypt

Dennis Schürholz

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:

Die Kommentare sind deaktiviert.