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
rootoder übersudoausgeführt.
1. Netzwerkinformationen ermitteln
Interface, IP-Adresse und Default-Gateway anzeigen:
ip -br address
ip route show defaultBeispiel:
Interface: enp4s0f0
IP-Adresse: 10.100.0.2
Netzmaske: 255.255.0.0
Gateway: 10.100.0.12. Pakete installieren
apt update
apt install -y dropbear-initramfs cryptsetup-initramfs3. Statische Initramfs-Netzwerkkonfiguration eintragen
Datei öffnen:
nano /etc/initramfs-tools/initramfs.confFolgende Werte ergänzen beziehungsweise vorhandene Werte ersetzen:
DEVICE=enp4s0f0
IP=10.100.0.2::10.100.0.1:255.255.0.0::enp4s0f0:noneAufbau der IP-Zeile:
IP=<Client-IP>:<Server-IP>:<Gateway>:<Netzmaske>:<Hostname>:<Interface>:<Autoconf>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.confEmpfohlene Basiskonfiguration:
DROPBEAR_OPTIONS="-I 300 -j -k -s -p 2222"Option | Bedeutung |
|---|---|
| Inaktive Verbindung nach 300 Sekunden trennen |
| Lokales Port-Forwarding deaktivieren |
| Remote-Port-Forwarding deaktivieren |
| Passwortanmeldung deaktivieren; nur Schlüssel erlauben |
| 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_keysIn 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.initramfsDie 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
rebootSobald der Server an der Festplattenabfrage wartet, vom Client verbinden:
ssh System_1-unlockIn der Initramfs-Shell:
cryptroot-unlockNach 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/moduleseintragen und das Initramfs erneut bauen. - Konfiguration wird ignoriert: Mit
cat /proc/cmdlinenach einem vorhandenenip=-Bootparameter suchen. Dieser kann die Werte ausinitramfs.confüberschreiben. - SSH-Key wird abgelehnt: Eine vollständige Schlüsselzeile sowie Rechte
0700für das Verzeichnis und0600fürauthorized_keysprüfen. - Host-Key-Warnung: Den separaten Port und
UserKnownHostsFile ~/.ssh/known_hosts.initramfsverwenden.
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 iproute22. VLAN und statische Adresse konfigurieren
/etc/initramfs-tools/initramfs.conf öffnen:
nano /etc/initramfs-tools/initramfs.confFolgende Werte eintragen:
VLAN="enp1s0:40"
DEVICE=enp1s0.40
IP=10.15.32.253::10.15.39.254:255.255.248.0::enp1s0.40:noneDie 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.120Mehrere 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:
# ixgbe4. Programm ip ins Initramfs kopieren
Datei /etc/initramfs-tools/hooks/vlan-ip erstellen:
nano /etc/initramfs-tools/hooks/vlan-ipInhalt:
#!/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 0chmod 0755 /etc/initramfs-tools/hooks/vlan-ip5. 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-vlanInhalt:
#!/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 0chmod 0755 /etc/initramfs-tools/scripts/init-premount/00-vlan6. 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.pubAuf dem Server:
install -d -m 0700 /etc/dropbear/initramfs
nano /etc/dropbear/initramfs/authorized_keys
chmod 0600 /etc/dropbear/initramfs/authorized_keysBeispielzeile:
no-port-forwarding,no-agent-forwarding,no-X11-forwarding ssh-ed25519 AAAAC3... Initramfs unlock for System_18. 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.conf9. 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.254muss im VLAN 40 liegen und erreichbar sein. - Die IP
10.15.32.253darf 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.initramfs11. Neustarten und entsperren
rebootVom Client verbinden:
ssh System_1-unlockDanach in der Initramfs-Shell:
cryptroot-unlockFehlersuche 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/modulesaufnehmen. ipfehlt: Den Hook prüfen und kontrollieren, obiproute2installiert ist.- VLAN-Interface fehlt: Mit
lsinitramfsprüfen, ob00-vlan,ipund8021qenthalten sind. - Falsches Interface wird verwendet: In
/proc/cmdlinenach einem altenip=...:enp1s0:nonesuchen. Ein Kernel-Bootparameter kanninitramfs.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.
No comments to display
No comments to display