Debian Wheezy mit verschlüsselter Root-Partition und Freischaltung via SSH

Einleitung

Der Wunsch: (Debian-)Linuxsystem mit vollverschlüsselten Dateisystemen, das sich problemlos auch aus der Ferne neu starten läßt.

Die Lösung: Bei einer Debian-Wheezy-Neuinstallation wird das System mittels LUKS-Verschlüsselung einer Partition installiert, auf der via LVM die Dateisysteme eingehängt sind und dazu dann eine Freischaltmöglichkeit aus der Ferne via SSH in der Initrd mittels dropbear ermöglicht. Hierbei muß nur die /boot-Partition unverschlüsselt bleiben.

Im Einzelnen:


Freischaltmöglichkeit einrichten

Ausgangssituation
Beim Installieren des Debian Wheezy-Systems wird eine kleine /boot-Partition angelegt und daneben eine den Rest der Festplatte umfassende Partition, welche verschlüsselt wird. Ich nehme für die /boot-Partition 128MB, um ggf. auch mal mehr als einen Kernel und zugehörige Initrd unterzubringen.

Auf der verschlüsselten Partition wird eine LVM-Volume Group angelegt und darin die Logical Volumes für Swap und die gewünschten Dateisysteme. Soweit läßt sich dies direkt bei der Debian-Installation einrichten, beim Booten wird dann das Kennwort für die verschlüsselte Partition auf der Konsole abgefragt.


Fernzugriff einrichten
Wenn das System so problemlos läuft, läßt sich der Fernzugriff wie folgt einrichten:
  apt-get install dropbear initramfs-tools busybox
Der kleine SSH-Server dropbear ist in Debian Wheezy bereits so eingerichtet, daß er sich in die Initrd einklinkt. Falls auf der Maschine bereits zuvor ein OpenSSH-Server installiert wurde, umfaßt dieses auch das Wiederabschalten von dropbear vor dem Start des OpenSSH-Servers, so daß dropbear nur während der Bootphase der Initrd aktiv ist.

Authorisierung
Damit man sich dann auch einloggen kann, muß für jeden berechtigten Benutzer dessen zu verwendender öffentlicher SSH-Schlüssel in die Datei /etc/initramfs-tools/root/.ssh/authorized_keys eingetragen werden. Der Schlüssel liegt meist im .ssh/-Verzeichnis des jeweiligen Benutzers und heißt id_rsa.pub oder id_dsa.pub. Falls ein neuer Schlüssel verwendet werden soll, kann das Schlüsselpaar mit dem ssh-keygen-Kommando erstelt werden.

Netzwerkmodul laden
Da die Initrd normalerweise keine Netzwerkmodule lädt, muß dieses erst noch in die Datei /etc/initramfs-tools/modules eingetragen werden. Um welches Modul es sich dabei handelt, kann man mittels
grep DRIVER /sys/class/net/eth1/device/uevent
ermittelt werden. Hier ist das z.B. DRIVER=e100, also wird e100 in die modules-Datei eingetragen.

IP-Konfiguration
Nun muß der Initrd noch die IP-Konfiguration mit auf den Weg gegeben werden. Das kann einmal über Kernel-Parameter geschehen und in der Grub- oder Lilo-Konfiguration eingestellt werden. Ich verwende lieber die Möglichkeit, die entsprechende Variable in einem Skript direkt in der Initrd selbst zu setzen. Dazu wird eine Datei /etc/initramfs-tools/conf.d/network_config erzeugt mit den entsprechenden Angaben. Diese werden in der Form
IP=<client-ip>:<server-ip>:<gateway-ip>:<netmask>:<hostname>:<devicename>:<autoconf>
angegeben, wobei einige Parameter auch ausgespart werden können. Bei mir sieht das in der Datei nun z.B. so aus:
export IP=192.168.1.100::192.168.1.1:255.255.255.0:testmaschine:eth0
Wenn die betroffene Maschine nicht gerade der DHCP-Server selbst ist und der DHCP-Server so eingerichtet ist, daß er der MAC-Adresse der Maschine immer ein und dieselbe IP-Konfiguration zuweist, sollte auch ein
export IP=dhcp
ausreichen. Es sollte also sichergestellt sein, daß man den Rechner auch tatsächlich unter der erwarteten IP-Adresse findet, der DHCP-Server also nicht beliebig aus einem Pool an Adressen wählt.

Problem mit abweichenden IP-Adressen
Wenn die IP-Adressen der Initrd-Konfiguration von der des Hauptsystems abweichen, kann es zu Problemen kommen. Offenbar wird in der aktuellen Debianversion die Netzwerkschnittstelle vom Hauptsystem dann nicht richtig eingerichtet, wenn sie bereits zuvor aktiviert wurde. Abhilfe schafft ein Eintrag in der Datei /etc/rc.local:
/sbin/ifdown eth0; /sbin/ifup eth0

Freischaltprozedur
Für die Freischaltprozedur selbst wird ein Skript /etc/initramfs-tools/hooks/mount_cryptroot erstellt. Dieses erzeugt zwei weitere Skriptdateien in der Initrd, wenn die Initrd erzeugt wird: /root/mount_cryptroot.sh und /root/.profile. Das Skript basiert auf dem Entwurf von Angus Gratton, vielen Dank!
#!/bin/sh
# Dieses Skript erzeugt zwei Skripte in der Initrd:
# /root/mount_cryptroot.sh und /root/.profile

# ALLOW_SHELL=1 läßt zu, daß der Freischaltprozeß mit Strg-C
# unterbrochen und eine Root-Shell geöffnet wird.

ALLOW_SHELL=0

if [ -z ${DESTDIR} ]; then
    exit
fi

SCRIPT="${DESTDIR}/root/mount_cryptroot.sh"
cat > "${SCRIPT}" << 'EOF'
#!/bin/sh
CMD=
while [ -z "$CMD" -o -z "`pidof askpass plymouth`" ]; do
  CMD=`ps -o args | grep luksOpen | grep -v grep`
  sleep 0.1
done
while [ -n "`pidof askpass plymouth`" ]; do
  $CMD && kill -9 `pidof askpass plymouth` && echo "Success"
done
EOF

chmod +x "${SCRIPT}"

cat > "${DESTDIR}/root/.profile" << EOF
ctrl_c_exit() {
  exit 1
}
ctrl_c_shell() {
  # Terminal-Einstellungen wiederherstellen
  reset
}
echo "Root-Dateisystem freischalten..."
if [ "$ALLOW_SHELL" == "1" ]; then
  echo "Abbrechen mit Strg-C"
  trap ctrl_c_shell INT
else
  trap ctrl_c_exit INT
fi
/root/mount_cryptroot.sh && exit 1 || echo "./mount_cryptroot.sh für einen weiteren Freischaltversuch erneut ausführen."
trap INT
EOF
Das Skript muß mit chmod +x als ausführbar markiert werden.

Initrd aktualisieren
Nun muß noch die Initrd aktualisiert werden, damit die Neuerungen wirksam werden:
update-initramfs -u

Eigene SSH-Konfiguration erweitern
Da dropbear einen anderen Host-Schlüssel als der OpenSSH-Server des Hauptsystems verwendet, würde sich der SSH-Client berechtigterweise über diese Abweichung beschweren. Um dies zu vermeiden, wird ein separater Eintrag für die Freischaltung in die Datei ~/.ssh/config der berechtigten Benutzer geschrieben. Z.B.
Host testmaschine-unlock
    HostName <IP-Adresse oder DNS-Name>
    User root
    IdentityFile ~/.ssh/id_rsa
    HostKeyAlias testmaschine-unlock
Fertig.

Verweise

Weitere Webseiten zu dem Thema: