Get Rewarded! We will reward you with up to €50 credit on your account for every tutorial that you write and we publish!

Wie installiert man ein verschlüsseltes Ubuntu 22.04 mit automatisierter Entsperrung via tang und clevis

profile picture
Author
Philipp Roth
Published
2024-04-10
Time to read
6 minutes reading time

Einleitung

Das installimage Skript in dem Hetzner Rescue System bietet eine einfache Möglichkeit, verschiedene Linux-Distributionen zu installieren.

Dieses Tutorial zeigt, wie man mit Hilfe des installimage ein verschlüsseltes Ubuntu 22.04-System installiert und eine vollautomatische Entschlüsselung des Root Filesystems über clevis im initramfs hinzufügt, das in einer separaten /boot-Partition gespeichert ist.

Vorraussetzungen

  • Hetzner Konto
  • Zwei Server:
    • tang-server » Server mit installiertem Ubuntu 22.04 Betriebssystem
    • clevis-server/rescue » Server im Rescue System
  • Keine privaten Netzwerke über die Hetzner Cloud an den Servern angeschlossen

Schritt 1 - Konfigurieren des tang-Server

Zunächst werden wir Tang und José (die C-Implementierung des von Tang verwendeten JavaScript Object Signing and Encryption Standards) auf dem Server installieren, auf dem bereits Ubuntu 22.04 installiert ist.

user@tang-server:~$ apt update
user@tang-server:~$ apt install tang jose
user@tang-server:~$ systemctl enable tangd.socket
user@tang-server:~$ systemctl start tangd.socket

Führe tang-show-keys aus, um zu prüfen, ob alles korrekt installiert ist und um den Fingerabdruck des Signierschlüssels zu ermitteln.

user@tang-server:~$ tang-show-keys 
3ZWS6-cDrCG61UPJS2BMmPU4I54

Schritt 2 - Erzeugen oder Kopieren des öffentlichen SSH-Schlüssels auf dem clevis-server (Optional)

Um sich über einen SSH-Schlüssel anschließend am clevis-Server anzumelden, müssen wir vor der Installation den SSH-Schlüssel hinterlegen. Wenn du einen solchen Schlüssel nicht hast, musst du einen generieren.

Um z. B. einen SSH-Schlüssel ed25519 zu erzeugen, führe den folgenden Befehl auf dem Client aus:

user@client:~$ ssh-keygen -t ed25519

Kopiere anschließend den öffentlichen Schlüssel auf das Rescue System des clevis-server, z. B. mit scp:

user@client:~$ scp ~/.ssh/id_ed25519.pub root@<clevis-server>:/tmp/authorized_keys

Wenn das Rescue-System mit einem vorhandenen SSH-Schlüssel gestartet wurde, kopiere den öffentlichen Schlüssel für die Installation in das korrekte Verzeichnis:

root@rescue ~ # cp ~/.ssh/authorized_keys /tmp/authorized_keys

Schritt 3 - Erstellen oder Kopieren der installimage-Konfigurationsdatei

Wenn installimage ohne Optionen aufgerufen wird, startet es im interaktiven Modus und öffnet einen Editor, nachdem ein Distributionsimage ausgewählt wurde. Nach dem Verlassen des Editors wird die Installation fortgesetzt und die entsprechende Konfiguration wird als /installimage.conf im installierten System gespeichert. In diesem Tutorial werden wir eine solche Konfigurationsdatei direkt zur Installation übergeben.

Erstelle eine Datei /tmp/setup.conf mit folgendem Inhalt oder kopiere diese auf den clevis-Server im Rescue-System.

Hinweis: Ersetze <secret> durch ein sicheres Passwort und passe Laufwerksnamen und Partitionierung nach Bedarf an.

CRYPTPASSWORD <secret>
DRIVE1 /dev/sda
BOOTLOADER grub
HOSTNAME host.example.com
PART /boot/efi esp 256M
PART /boot ext4 1G
PART /     ext4 all crypt
IMAGE /root/images/Ubuntu-2204-jammy-amd64-base.tar.gz

Wenn in Schritt 2 ein SSH-Schlüssel konfiguriert wurde, füge bitte auch die folgende Zeile in /tmp/setup.conf ein.

SSHKEYS_URL /tmp/authorized_keys

Schritt 4 - Post-Installations-Skript erstellen oder kopieren

Um die verschlüsselte Partition automatisch über den tang-Server zu entsperren, müssen wir clevis installieren und zum initramfs hinzufügen, das auf der unverschlüsselten /boot-Partition installiert ist. Dies löst auch die Einbindung von dhclient aus, um das Netzwerk zu konfigurieren, allerdings ohne jegliche Extras. Um die Unterstützung für die Hetzner Cloud zu aktivieren, müssen wir einen Hook hinzufügen, der die Unterstützung für RFC3442-Routen beinhaltet.

Um diese zusätzlichen Schritte ausführen zu können, benötigen wir ein Post-Install-Skript für das installimage.

Erstelle die Datei /tmp/post-install.sh im Rescue-System mit folgendem Inhalt.

Hinweis: Ersetze <secret> mit dem Passwort, das in der /tmp/setup.conf-Datei für den Wert bei CRYPTPASSWORD gewählt wurde und ersetze <ip-tangserver> mit der IP-Adresse deines tang-Servers.

#!/bin/bash


add_rfc3442_hook() {
  cat << EOF > /etc/initramfs-tools/hooks/add-rfc3442-dhclient-hook
#!/bin/sh

PREREQ=""

prereqs()
{
        echo "\$PREREQ"
}

case \$1 in
prereqs)
        prereqs
        exit 0
        ;;
esac

if [ ! -x /sbin/dhclient ]; then
        exit 0
fi

. /usr/share/initramfs-tools/scripts/functions
. /usr/share/initramfs-tools/hook-functions

mkdir -p \$DESTDIR/etc/dhcp/dhclient-exit-hooks.d/
cp -a /etc/dhcp/dhclient-exit-hooks.d/rfc3442-classless-routes \$DESTDIR/etc/dhcp/dhclient-exit-hooks.d/
EOF

  chmod +x /etc/initramfs-tools/hooks/add-rfc3442-dhclient-hook
}


# Install hook
add_rfc3442_hook

# Update system
apt-get update >/dev/null

# Install clevis on the system and add clevis to the initramfs
apt-get -y install clevis clevis-luks clevis-initramfs cryptsetup-initramfs

# Get the key from the tang server and then bind the device to the tang server
curl -sfg http://<ip-tangserver>/adv -o /tmp/adv.jws
echo '<secret>' | clevis luks bind -d /dev/sda3 tang '{"url": "http://<ip-tangserver>" , "adv": "/tmp/adv.jws" }'

# Update the existing initramfs
update-initramfs -u

Wichtiger Hinweis: Das Skript muss ausführbar gemacht werden:

root@rescue ~ # chmod +x /tmp/post-install.sh

Schritt 5 - Installation starten

Prüfe vor dem Start der Installation nochmals den Inhalt der folgenden Dateien:

  • /tmp/setup.conf - Installationskonfiguration
  • /tmp/post-install.sh - ist ausführbar und enthält das Post-Installations-Skript
  • wenn in Schritt 2 konfiguriert:
    • /tmp/authorized_keys - Ihr öffentlicher SSH-Schlüssel

Jetzt kann die Installation mit dem folgenden Befehl gestartet werden:

root@rescue ~ # installimage -a -c /tmp/setup.conf -x /tmp/post-install.sh

Warte, bis die Installation abgeschlossen ist, und prüfe die debug.txt-Datei auf eventuelle Fehler.

Schritt 6 - Das installiertes System booten

Nachdem die Installation abgeschlossen ist und alle Fehler behoben wurden, kann reboot ausgeführt werden, um den Server neu zu starten und das neu installierte Betriebssystem zu booten. Der Boot-Vorgang kann beobachtet werden, wenn eine KVM angeschlossen ist oder über die Remote-Konsole auf der jeweiligen Cloud-Instanz.

Ergebnis

Wenn alle Schritte in diesem Tutorial befolgt wurden, sollte der clevis-Server automatisch das Root-Dateisystem in initramfs entschlüsseln und anschließend normal in das Betriebssystem booten.

License: MIT
Want to contribute?

Get Rewarded: Get up to €50 in credit! Be a part of the community and contribute. Do it for the money. Do it for the bragging rights. And do it to teach others!

Report Issue
Try Hetzner Cloud

Get €20/$20 free credit!

Valid until: 31 December 2024 Valid for: 3 months and only for new customers
Get started
Want to contribute?

Get Rewarded: Get up to €50 credit on your account for every tutorial you write and we publish!

Find out more