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 installimage
ein verschlüsseltes Ubuntu 24.04-System installiert und eine Entschlüsselung per SSH (dropbear) in initramfs hinzufügt, das in einer separaten /boot
-Partition gespeichert ist.
Dieses Tutorial verwendet zwei Beispieldateien:
Datei | Beschreibung |
---|---|
/tmp/setup.conf |
Eine Konfigurationsdatei, die Ubuntu 24.04 installiert und eine verschlüsselte root-Partition einrichtet. |
/tmp/post-install.sh |
Ein Bash-Skript, das auf dem System ausgeführt wird, sobald der Installationsprozess beendet ist. Das Skript richtet dropbear ein, damit du dich während dem Boot damit verbinden und die verschlüsselte root-Partition entschlüsseln kannst. |
Voraussetzungen
- Hetzner-Konto
- Server welcher in das Rescue-System gebootet ist
- Öffentlicher RSA, ECDSA oder ED25519 SSH-Schlüssel
- Keine privaten Netzwerke über die Hetzner Cloud an den Servern angeschlossen
Hinweis: Diese Anleitung ist explizit nur für Ubuntu 24.04 geschrieben. Es könnte sein, dass diese nicht auf anderen Distributionen funktioniert.
Schritt 1 - Erstellen oder Kopieren des öffentlichen SSH-Schlüssels
Es wird ein SSH-Schlüssel benötigt, um das verschlüsselte System während dem Boot aus der Ferne entsperren zu können. Dieser Schlüssel wird auch für die spätere Anmeldung am gebooteten System verwendet. Der in Ubuntu 24.04 enthaltene SSH-Daemon dropbear unterstützt RSA, ED25519 und ECDSA-Schlüssel.
Wenn du keinen solchen Schlüssel hast, musst du einen auf deinem lokalen Gerät generieren. Wir empfehlen die Nutzung von ED25519 oder ECDSA Schlüsseln
Um z. B. einen ED25519-Schlüssel zu erzeugen, führe folgenden Befehl auf dem lokalen Gerät aus:
ssh-keygen -t ed25519
Speichere den öffentlichen Key des SSH-Key-Paares in der /tmp/authorized_keys
-Datei auf dem Server. Der Server sollte bereits im Rescue System sein. Erstelle die Datei entweder direkt auf dem Server oder kopieren den öffentlichen Key vom lokalen Gerät mit scp
:
scp ~/.ssh/id_ed25519.pub root@<your-host>:/tmp/authorized_keys
Schritt 2 - Erstellen oder Kopieren der installimage-Konfigurationsdatei
Wenn das installimage
Skript auf einem Server im Rescue-System ohne Optionen aufgerufen wird, startet es im interaktiven Modus. Man muss ein Distributionsimage auswählen und anschließend wird ein Editor geöffnet. Nach dem Verlassen des Editors, wird die Installation fortgesetzt und die entsprechende Konfiguration wird als /installimage.conf
im installierten System gespeichert.
Wenn das installimage
Skript auf einem Server im Rescue-System mit Optionen aufgerufen wird, startet es im automatischen Modus — das heißt die Installation wird ohne interaktive Prompts ausgeführt. Folgend wird erklärt, wie man eine eigene Konfigurationsdatei erstellt und diese an den Befehl installimage
übergibt, um sie während des automatischen Installationsprozesses zu verwenden.
Erstelle eine neue Konfigurationsdatei /tmp/setup.conf
und füge folgenden Inhalt ein:
Hinweis: Ersetze
secret
durch ein sicheres Passwort und passe die Laufwerksnamen und die 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-2404-noble-amd64-base.tar.gz
SSHKEYS_URL /tmp/authorized_keys
Hinweis: Debian 12 (
Debian-1208-bookworm-amd64-base.tar.gz
) sollte auch funktionieren — allerdings ohne Garantie.
Diese Konfiguration installiert Ubuntu auf einem einzelnen verschlüsselten Laufwerk (/dev/sda
) mit einer separaten unverschlüsselten /boot
Partition, das für die Entschlüsselung benötigt wird.
Beispiel für zwei Laufwerke (RAID1)
Partition Einhängepunkt RAID Device RAID Level sda1 sdb1 /boot/efi md0 1 sda2 sdb2 /boot md1 1 sda3 sdb3 / md2 1 CRYPTPASSWORD secret DRIVE1 /dev/sda DRIVE2 /dev/sdb SWRAID 1 SWRAIDLEVEL 1 BOOTLOADER grub HOSTNAME host.example.com PART /boot/efi esp 256M PART /boot ext4 1G PART / ext4 all crypt IMAGE /root/images/Ubuntu-2404-noble-amd64-base.tar.gz SSHKEYS_URL /tmp/authorized_keys
Beispiel für vier Laufwerke (RAID10)
Partition Einhängepunkt RAID Device RAID Level sda1 sdb1 sdc1 sdd1 /boot/efi md0 1 sda2 sdb2 sdc2 sdd2 /boot md1 1 sda3 sdb3 sdc3 sdd3 / md2 10 CRYPTPASSWORD secret DRIVE1 /dev/sda DRIVE2 /dev/sdb DRIVE3 /dev/sdc DRIVE4 /dev/sdd SWRAID 1 SWRAIDLEVEL 10 BOOTLOADER grub HOSTNAME host.example.com PART /boot/efi esp 256M PART /boot ext4 1G PART / ext4 all crypt IMAGE /root/images/Ubuntu-2404-noble-amd64-base.tar.gz SSHKEYS_URL /tmp/authorized_keys
Schritt 3 - Post-Installations-Skript erstellen oder kopieren
Um die verschlüsselte Partition über SSH zu entsperren, müssen wir den Dropbear-SSH-Server installieren und zum initramfs hinzufügen, das auf der unverschlüsselten /boot
-Partition gespeichert ist. Dadurch wird auch die Einbindung von dhclient
zur Konfiguration des Netzwerks ausgelöst, 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
Skript.
Erstelle im Rescue-System eine Datei /tmp/post-install.sh
mit folgendem Inhalt:
#!/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
}
remove_unwanted_netplan_config() {
cat << EOF > /etc/initramfs-tools/scripts/init-bottom/remove_unwanted_netplan_config
#!/bin/sh
if [ -d "/run/netplan" ]; then
interface=\$(ls /run/netplan/ | cut -d'.' -f1)
if [ \${interface:+x} ]; then
rm -f /run/netplan/"\${interface}".yaml
fi
fi
EOF
chmod +x /etc/initramfs-tools/scripts/init-bottom/remove_unwanted_netplan_config
}
# Hook installieren
add_rfc3442_hook
# Hinzufügen eines initramfs-tools Skript um /run/netplan/{interface}.yaml,
# zu entfernen, weil diese ungewollte Routen hinzufügt
remove_unwanted_netplan_config
# System updaten
apt-get update >/dev/null
apt-get -y install cryptsetup-initramfs dropbear-initramfs
# Kopieren des SSH-Schlüssels für Dropbear und Port ändern
cp /root/.ssh/authorized_keys /etc/dropbear/initramfs/
sed -ie 's/#DROPBEAR_OPTIONS=/DROPBEAR_OPTIONS="-I 600 -j -k -p 2222 -s"/' /etc/dropbear/initramfs/dropbear.conf
dpkg-reconfigure dropbear-initramfs
update-initramfs -u
Wichtig: Das Post-Installations-Skript muss ausführbar gemacht werden:
chmod +x /tmp/post-install.sh
Schritt 4 - Installation starten
Prüfe vor dem Start der Installation nochmals den Inhalt der folgenden Dateien:
Datei | Prüfen |
---|---|
/tmp/authorized_keys |
Dein öffentlicher SSH-Schlüssel (RSA, ECDSA oder ED25519) |
/tmp/setup.conf |
Die Installationskonfiguration |
/tmp/post-install.sh |
Ist ausführbar und enthält das Post-Installations-Skript |
Jetzt kann die Installation mit dem folgenden Befehl gestartet werden:
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 5 - 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 System zu booten. Man kann den Boot-Vorgang beobachten, wenn eine KVM angeschlossen ist oder über die VNC-Konsole in Cloud Console.
Nach einiger Zeit sollte der Server auf einen Ping reagieren. Über den Default-SSH-Port 22 sollte ein Login nicht möglich sein, da die root-Partition noch verschlüsselt ist. Verbinde dich stattdessen über Port 2222 mit dropbear und führe cryptroot-unlock
aus, um die verschlüsselte(n) Partition(en) zu entsperren. Wenn du dich mit Dropbear verbindest, nutze den privaten Key, der zum öffentlichen Key gehört, den du in /tmp/authorized_keys
angegeben hast.
-
Mit ED25519 oder ECDSA Schlüssel
ssh -p 2222 root@<your-host>
-
Mit RSA Schlüssel
Im Falle von RSA, müssen wir explizit angeben, dass dieser Schlüssel akzeptiert wird.ssh -o "PubkeyAcceptedKeyTypes +ssh-rsa" -p 2222 root@<your-host> -i ~/.ssh/id_rsa
Beispiel:
$ ssh -o "PubkeyAcceptedKeyTypes +ssh-rsa" -p 2222 root@<your-host> -i ~/.ssh/id_rsa
BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.
# cryptroot-unlock
Please unlock disk luks-80e097ad-c0ab-47ce-9302-02dd316dc45c:
Gib das Passwort an, das du zuvor in /tmp/setup.conf
für CRYPTPASSWORD
festgelegt hast. Wenn das Passwort korrekt ist, wird der Bootvorgang fortgesetzt und die temporären SSH-Sitzung zu dropbear wird automatisch beendet.
Nach ein paar Sekunden kannst du dich über den SSH-Port 22 mit dem Server verbinden.
ssh -p 22 root@<your-host>