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 Betriebssystemclevis-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.