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 busyboxDer 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/ueventermittelt 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:eth0Wenn 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=dhcpausreichen. 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 EOFDas 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
Dadropbear
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