Linux - Verschlüsselung Linux - LUKS LVM - Dropbear-initramfs Verschlüsseltes System per Dropbear-Initramfs über SSH entsperren Diese Anleitung gilt für Debian/Ubuntu-Systeme mit initramfs-tools und einer verschlüsselten Root-Partition. Die erste Variante verwendet ein normales, ungetaggtes Netzwerkinterface. Die zweite Variante verwendet ein getaggtes IEEE-802.1Q-VLAN. Vor dem Neustart: Konsolen- oder KVM/IPMI-Zugriff bereithalten. Eine falsche Interface-, IP-, Gateway- oder VLAN-Konfiguration kann den SSH-Zugriff während des Bootens verhindern. Die normale Passworteingabe an der Konsole bleibt der Rückfallweg. Anleitung 1: Dropbear-Initramfs ohne VLAN einrichten Voraussetzungen Die Root-Partition ist verschlüsselt und wird bereits beim Booten nach einer Passphrase fragen. Der Client kann das Servernetz während der Initramfs-Phase erreichen. Eine statische IP-Adresse, Netzmaske und ein Gateway sind bekannt. Die Befehle auf dem Server werden als root oder über sudo ausgeführt. 1. Netzwerkinformationen ermitteln Interface, IP-Adresse und Default-Gateway anzeigen: ip -br address ip route show default Beispiel: Interface: enp4s0f0 IP-Adresse: 10.100.0.2 Netzmaske: 255.255.0.0 Gateway: 10.100.0.1 2. Pakete installieren apt update apt install -y dropbear-initramfs cryptsetup-initramfs 3. Statische Initramfs-Netzwerkkonfiguration eintragen Datei öffnen: nano /etc/initramfs-tools/initramfs.conf Folgende Werte ergänzen beziehungsweise vorhandene Werte ersetzen: DEVICE=enp4s0f0 IP=10.100.0.2::10.100.0.1:255.255.0.0::enp4s0f0:none Aufbau der IP-Zeile: IP=:::::: Bei einer statischen Adresse bleiben Server-IP und Hostname im Beispiel leer. none deaktiviert die automatische Konfiguration per DHCP. 4. Dropbear absichern und Port festlegen Datei öffnen: nano /etc/dropbear/initramfs/dropbear.conf Empfohlene Basiskonfiguration: DROPBEAR_OPTIONS="-I 300 -j -k -s -p 2222" Option Bedeutung -I 300 Inaktive Verbindung nach 300 Sekunden trennen -j Lokales Port-Forwarding deaktivieren -k Remote-Port-Forwarding deaktivieren -s Passwortanmeldung deaktivieren; nur Schlüssel erlauben -p 2222 Separaten SSH-Port für das Initramfs verwenden 5. SSH-Schlüssel auf dem Client erzeugen ssh-keygen -t ed25519 \ -f ~/.ssh/id_initramfs_unlock_System_1 \ -C "Initramfs unlock for System_1" Den öffentlichen Schlüssel anzeigen: cat ~/.ssh/id_initramfs_unlock_System_1.pubDer private Schlüssel verbleibt ausschließlich auf dem Client. Nur die Datei mit der Endung .pub wird auf den Server übertragen. 6. Öffentlichen Schlüssel auf dem Server hinterlegen install -d -m 0700 /etc/dropbear/initramfs nano /etc/dropbear/initramfs/authorized_keys chmod 0600 /etc/dropbear/initramfs/authorized_keys In authorized_keys steht der vollständige öffentliche Schlüssel in einer Zeile: no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-ed25519 AAAAC3... Initramfs unlock for System_1Ein zugelassener Schlüssel ermöglicht eine Root-Shell im Initramfs. Den privaten Schlüssel deshalb wie ein Administrationspasswort schützen und bei Verlust sofort aus authorized_keys entfernen. 7. Initramfs neu erzeugen und Inhalt prüfen update-initramfs -u -k all lsinitramfs /boot/initrd.img-$(uname -r) | \ grep -E 'dropbear|authorized_keys|cryptroot-unlock' Die Ausgabe sollte unter anderem Dropbear, authorized_keys und cryptroot-unlock enthalten. 8. Komfortablen SSH-Zugriff auf dem Client einrichten ~/.ssh/config ergänzen: Host System_1-unlock HostName 10.100.0.2 User root Port 2222 IdentityFile ~/.ssh/id_initramfs_unlock_System_1 IdentitiesOnly yes PasswordAuthentication no UserKnownHostsFile ~/.ssh/known_hosts.initramfs Die separate known_hosts-Datei verhindert Konflikte zwischen dem Host-Key des Initramfs und dem Host-Key des normal gestarteten SSH-Servers. 9. Neustarten und entsperren reboot Sobald der Server an der Festplattenabfrage wartet, vom Client verbinden: ssh System_1-unlock In der Initramfs-Shell: cryptroot-unlock Nach erfolgreicher Passworteingabe wird die SSH-Verbindung normalerweise beendet und der reguläre Bootvorgang fortgesetzt. Fehlersuche Keine Verbindung: Interface-Name, IP, Netzmaske, Gateway, Switchport und Firewall prüfen. Netzwerkkarte fehlt: Den Treiber aus basename "$(readlink -f /sys/class/net/enp4s0f0/device/driver/module)" in /etc/initramfs-tools/modules eintragen und das Initramfs erneut bauen. Konfiguration wird ignoriert: Mit cat /proc/cmdline nach einem vorhandenen ip=-Bootparameter suchen. Dieser kann die Werte aus initramfs.conf überschreiben. SSH-Key wird abgelehnt: Eine vollständige Schlüsselzeile sowie Rechte 0700 für das Verzeichnis und 0600 für authorized_keys prüfen. Host-Key-Warnung: Den separaten Port und UserKnownHostsFile ~/.ssh/known_hosts.initramfs verwenden. Anleitung 2: Dropbear-Initramfs über Tagged VLAN einrichten Voraussetzungen Der Switchport zum Server transportiert das gewünschte VLAN getaggt. Das VLAN ist auf allen beteiligten Trunks erlaubt. Die Root-Partition ist verschlüsselt und wird im Initramfs entsperrt. Das physische Parent-Interface, die VLAN-ID, IP-Adresse, Netzmaske und das Gateway sind bekannt. Beispielwerte: Parent-Interface: enp1s0 VLAN-ID: 40 VLAN-Interface: enp1s0.40 IP-Adresse: 10.15.32.253 Netzmaske: 255.255.248.0 Gateway: 10.15.39.254Die Initramfs-Netzwerkkonfiguration gilt nur während der frühen Bootphase. Das gestartete Betriebssystem muss das VLAN zusätzlich über Netplan, systemd-networkd oder /etc/network/interfaces konfigurieren. 1. Pakete installieren apt update apt install -y dropbear-initramfs cryptsetup-initramfs iproute2 2. VLAN und statische Adresse konfigurieren /etc/initramfs-tools/initramfs.conf öffnen: nano /etc/initramfs-tools/initramfs.conf Folgende Werte eintragen: VLAN="enp1s0:40" DEVICE=enp1s0.40 IP=10.15.32.253::10.15.39.254:255.255.248.0::enp1s0.40:none Die Variable VLAN verwendet das Format Parent-Interface:VLAN-ID. Das folgende Skript ist nicht auf VLAN 40 festgelegt. Für VLAN 120 würde die Konfiguration beispielsweise so aussehen: VLAN="enp1s0:120" DEVICE=enp1s0.120 Mehrere VLAN-Interfaces können ebenfalls vorbereitet werden: VLAN="enp1s0:40 enp1s0:120" 3. Benötigte Kernelmodule aufnehmen Treiber des physischen Interfaces ermitteln: basename "$(readlink -f /sys/class/net/enp1s0/device/driver/module)" In /etc/initramfs-tools/modules mindestens das VLAN-Modul ergänzen. Falls der Netzwerkkartentreiber nicht automatisch im Initramfs vorhanden ist, zusätzlich den zuvor ausgegebenen Modulnamen eintragen: 8021q # Beispiel für einen NIC-Treiber: # ixgbe 4. Programm ip ins Initramfs kopieren Datei /etc/initramfs-tools/hooks/vlan-ip erstellen: nano /etc/initramfs-tools/hooks/vlan-ip Inhalt: #!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case "$1" in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions IP_BIN="$(command -v ip || true)" if [ ! -x "$IP_BIN" ]; then echo "Fehler: ip aus dem Paket iproute2 wurde nicht gefunden" >&2 exit 1 fi manual_add_modules 8021q copy_exec "$IP_BIN" exit 0 chmod 0755 /etc/initramfs-tools/hooks/vlan-ip 5. Generisches VLAN-Bootskript erstellen Das VLAN muss existieren, bevor Dropbear das Netzwerk konfiguriert. Deshalb wird das Skript als init-premount/00-vlan installiert und nicht unter local-top. install -d -m 0755 /etc/initramfs-tools/scripts/init-premount nano /etc/initramfs-tools/scripts/init-premount/00-vlan Inhalt: #!/bin/sh PREREQ="" prereqs() { echo "$PREREQ" } case "$1" in prereqs) prereqs exit 0 ;; esac . /scripts/functions . /conf/initramfs.conf for config_file in /conf/conf.d/*.conf; do [ -f "$config_file" ] && . "$config_file" done [ -n "${VLAN:-}" ] || exit 0 modprobe 8021q || { log_failure_msg "VLAN-Modul 8021q konnte nicht geladen werden" exit 1 } for vlan_config in $VLAN; do parent=${vlan_config%%:*} vlan_id=${vlan_config#*:} if [ "$parent" = "$vlan_config" ]; then log_failure_msg "Ungueltige VLAN-Konfiguration: $vlan_config" exit 1 fi case "$vlan_id" in ''|*[!0-9]*) log_failure_msg "Ungueltige VLAN-ID: $vlan_id" exit 1 ;; esac if [ "$vlan_id" -lt 1 ] || [ "$vlan_id" -gt 4094 ]; then log_failure_msg "VLAN-ID ausserhalb 1 bis 4094: $vlan_id" exit 1 fi vlan_device="${parent}.${vlan_id}" # Kurz auf das physische Interface warten. attempts=0 while ! ip link show "$parent" >/dev/null 2>&1; do attempts=$((attempts + 1)) if [ "$attempts" -ge 10 ]; then log_failure_msg "Interface $parent wurde nicht gefunden" exit 1 fi sleep 1 done ip link set "$parent" up || exit 1 if ! ip link show "$vlan_device" >/dev/null 2>&1; then ip link add link "$parent" \ name "$vlan_device" \ type vlan id "$vlan_id" || exit 1 fi ip link set "$vlan_device" up || exit 1 log_success_msg "VLAN-Interface $vlan_device wurde aktiviert" done exit 0 chmod 0755 /etc/initramfs-tools/scripts/init-premount/00-vlan 6. Dropbear konfigurieren /etc/dropbear/initramfs/dropbear.conf: DROPBEAR_OPTIONS="-I 300 -j -k -s -p 2222" 7. SSH-Schlüssel erzeugen und eintragen Auf dem Client: ssh-keygen -t ed25519 \ -f ~/.ssh/id_initramfs_unlock_System_1 \ -C "Initramfs unlock for System_1" cat ~/.ssh/id_initramfs_unlock_System_1.pub Auf dem Server: install -d -m 0700 /etc/dropbear/initramfs nano /etc/dropbear/initramfs/authorized_keys chmod 0600 /etc/dropbear/initramfs/authorized_keys Beispielzeile: no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-ed25519 AAAAC3... Initramfs unlock for System_1 8. Initramfs bauen und prüfen update-initramfs -u -k all lsinitramfs /boot/initrd.img-$(uname -r) | \ grep -E '8021q|scripts/init-premount/00-vlan|/ip$|dropbear|authorized_keys|cryptroot-unlock' Optional kann die tatsächlich ins Initramfs übernommene Konfiguration kontrolliert werden: lsinitramfs /boot/initrd.img-$(uname -r) conf/initramfs.conf 9. Switch konfigurieren und prüfen VLAN 40 muss auf dem Serverport tagged beziehungsweise als erlaubtes Trunk-VLAN konfiguriert sein. VLAN 40 muss auf allen Uplinks zwischen Server und Client beziehungsweise Gateway erlaubt sein. Das Gateway 10.15.39.254 muss im VLAN 40 liegen und erreichbar sein. Die IP 10.15.32.253 darf nicht gleichzeitig von einem anderen Gerät verwendet werden. 10. SSH-Zugriff auf dem Client einrichten ~/.ssh/config: Host System_1-unlock HostName 10.15.32.253 User root Port 2222 IdentityFile ~/.ssh/id_initramfs_unlock_System_1 IdentitiesOnly yes PasswordAuthentication no UserKnownHostsFile ~/.ssh/known_hosts.initramfs 11. Neustarten und entsperren reboot Vom Client verbinden: ssh System_1-unlock Danach in der Initramfs-Shell: cryptroot-unlock Fehlersuche für Tagged VLAN Keine Pakete: Switchport auf Tagged/Trunk, erlaubte VLANs und VLAN-ID prüfen. Parent-Interface fehlt: Den Netzwerkkartentreiber in /etc/initramfs-tools/modules aufnehmen. ip fehlt: Den Hook prüfen und kontrollieren, ob iproute2 installiert ist. VLAN-Interface fehlt: Mit lsinitramfs prüfen, ob 00-vlan, ip und 8021q enthalten sind. Falsches Interface wird verwendet: In /proc/cmdline nach einem alten ip=...:enp1s0:none suchen. Ein Kernel-Bootparameter kann initramfs.conf überschreiben. Nach dem Entsperren kein Netzwerk: Das VLAN zusätzlich im regulären Betriebssystem konfigurieren; die Initramfs-Konfiguration wird nach dem Mounten des Root-Dateisystems nicht zur dauerhaften Netzwerkkonfiguration. Quellen und weiterführende Dokumentation Debian: Dropbear im Initramfs Debian: initramfs.conf(5) Debian: dropbear(8) Debian: Cryptsetup-Initramfs-Integration