Von verschlüsseltem LVM booten auf Headless Server

Ein verschlüsseltes LVM kann nie schlecht sein, weil es die Partitionen vor unberechtigtem Zugriff schützt. Wenn allerdings die Systempartition verschlüsselt ist, muss vor dem Starten des eigentlichen Betriebssystems die Partition entschlüsselt werden - am einfachsten über die Passworteingabe. Falls es sich beim System aber um einen Headless (also bildschirmlosen) Server ohne Tastatur handelt, dann wird die Passworteingabe schwierig - das Betriebssystem ist jedenfalls noch nicht gestartet, was einen herkömmlichen SSH- oder Telnet-Login verunmöglicht. Dieses Problem kann man aber folgendermassen lösen.

Die folgende Lösung beruht auf einem SSH-Login, über welchem man aber nicht viel mehr tun kann, als die gewünschte LVM zu entschlüsseln. Der Ablauf kurz zusammengefasst: Nachdem der Server gestartet wurde, werden der Kernel sowie das Initram-Filesystem (initramfs) von der unverschlüsselten Bootpartition geladen. Weil die Bootpartition normalerweise relativ klein ist, darf der darauf ausgelagerte SSH-Dienst auch nicht gross sein. Auch die weiteren benötigten Programme sollten auf ein Minimum beschränkt werden. Es bieten sich Dropbear als minimaler SSH-Server und Busybox als Lieferant für die wichtigsten Shell-Befehle an. Und nun zur Konfiguration:

  1. # dropbear & busybox installieren
  2. sudo apt-get install dropbear busybox
  3.  
  4. # an dieser Stelle noch einen kleinen Fehler im Config-Script von Dropbear beheben
  5. # Ort von libnss_files.so.2 herausfinden
  6. LIBNSSPATH=`find /lib -name libnss\_files.so.2`
  7.  
  8. # Ordner extrahieren
  9. LIBNSSPATH=${LIBNSSPATH%\/*}
  10.  
  11. # Fehlerhaften Pfad der libnss-Treibers in dorpbear-config ersetzen:
  12. sed 's/\/lib\/libnss\_/\/lib\/x86_64-linux\/libnss\_/' /usr/share/initramfs-toosl/hooks/dropbear > /usr/share/initramfs-toosl/hooks/dropbear

Nun kommt ein für mich als Ubuntu 11.04-User ein wichtiger Teil: Das Programm plymouth verhindert die Entschlüsselung der LVM standardmässig. Eigentlich ist es für die Startanimation verantwortlich, was bei einem bildschirmlosen System ziemlich überflüssig ist, aber weil mountall ebenfalls von plymouth abhängt, kann es nicht einfach deinstalliert werden. Damit die Entschlüsselung über SSH vorgenommen werden kann, muss man plymouth zuerst ausser Gefecht setzen. Dafür habe ich auf der Seite http://askubuntu.com/questions/66785/how... ein Shell-Script gefunden, welches unter /usr/share/initramfs-tools/hooks/unlock zu speichern ist, damit es dann auf dem initramfs aufrufbar ist.

  1. #!/bin/sh
  2.  
  3. PREREQ="dropbear"
  4.  
  5. prereqs() {
  6. 	echo "$PREREQ"
  7. }
  8.  
  9. case "$1" in
  10. 	prereqs)
  11. 		prereqs
  12. 		exit 0
  13. 	;;
  14. esac
  15.  
  16. . "${CONFDIR}/initramfs.conf"
  17. . /usr/share/initramfs-tools/hook-functions
  18.  
  19. if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
  20. 	cat > "${DESTDIR}/bin/unlock" <<-EOF
  21. 		#!/bin/sh
  22. 		if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot
  23. 		then
  24. 			/sbin/pkill cryptroot
  25. 			/sbin/pkill -f "plymouth ask-for-pass"
  26. 			/sbin/pkill cryptsetup
  27. 			exit 0
  28. 		fi
  29. 		exit 1
  30. 	EOF
  31. 	chmod 755 "${DESTDIR}/bin/unlock"
  32.  
  33. 	mkdir -p "${DESTDIR}/lib/unlock"
  34. 	cat > "${DESTDIR}/lib/unlock/plymouth" <<-EOF
  35. 		#!/bin/sh
  36. 		[ "\$1" == "--ping" ] && exit 1
  37. 		/bin/plymouth "\$@"
  38. 	EOF
  39. 	chmod 755 "${DESTDIR}/lib/unlock/plymouth"
  40.  
  41. 	# Enable password login
  42. 	if [ -n "$SSHUSERPASS" ]
  43. 	then
  44. 		sed -n "s/^${SSHUSERPASS}:/root:/p" /etc/shadow > "${DESTDIR}/etc/shadow"
  45. 		chmod 640 "${DESTDIR}/etc/shadow"
  46. 	fi
  47. fi

Danach noch ausführbar machen:

chmod a+x /usr/share/initramfs-tools/hooks/unlock

Nun noch das initramfs-Image neu erstelles, damit alle benötigten Programme auch aus dem initram geladen werden:

update-initramfs -u

Weil aus dem initram nur ein minimales System geladen wird, sind die Benutzer auch noch nicht verfügbar. Also wird man als root einloggen müssen. Damit dies möglich ist, sollte man den Login als root aktivieren, indem man ihm über sudo passwd ein Passwort vergibt.

Nun muss noch ein letzter Schritt gemacht werden, weil Dropbear beim Start nicht auf das root-Passwort wird zugreifen können. Das heisst, die Identifikation wird über die id_rsa-Datei erfolgen.

  1. # id_rsa des Servers auf Zielmaschine kopieren (nach root kein Leerschlag - Bug im Webserver :)
  2. scp /etc/initramfs-tools/root /.ssh/id_rsa user@zielmaschine:/pfad/zum/speichern

Nun kann der Server neu gestartet werden. Von der Maschine mit der kopierten id_rsa-Datei kann man sich dann per SSH einloggen.

  1. # von Zielmaschine einloggen (nur root geht, weil OS noch nicht gestartet ist)
  2. ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" -i /pfad/zur/kopierten/id_rsa root@servername

Sobald man eingeloggt ist, kann man den Befehl unlock ausführen und das Passwort eingeben, worauf das LVM entschlüsselt werden sollte.