LUKS beim Booten headless freischalten

Kategorien: administration

Moderne Prozessoren sind leistungsfähig genug, um eine Festplatte oder SSD komplett zu verschlüsseln. Eine verschlüsselte Festplatte macht es einem viel einfacher, sie ordnungsgemäß zu entsorgen. Klassisch habe ich die Festplatte mechanisch zerstört, bevor sie ins Recycling ging. Das ist aufwendig. Auch wenn man nicht paranoid ist, sollten die Datenträger also immer verschlüsselt werden.

Grundlagen

Ubuntu bietet bei der Installation schon die Option die komplette Installation zu verschlüsseln. Das ganze funktioniert stabil und sicher. Für Arch Linux habe ich mir ein Installationsskript geschrieben. Verschlüsselte Datenträger sind also unter Linux sehr einfach eingerichtet.

Gegen die Verschlüsselung der Festplatte spricht nur die Eingabe des Passworts für die Entschlüsselung während des Bootvorgangs. An einem Rechner mit Bildschirm und Tastatur kann das etwas nerven. Bei einem Rechner in einem Rechenzentrum1, eventuell ohne Monitor und Tastatur, ist es allerdings mehr als nervig.

Anforderungen

  1. Das Entschlüsseln des Systemdatenträgers muss von einem Benutzer freigegeben werden.
  2. Das Entschlüsseln muss auch über das Netzwerk freigeben werden können.
  3. Eine Eingabe des Schlüssels an der Konsole muss weiterhin möglich sein.
  4. Die Lösung muss sicher sein. Das heißt, dass durch die Lösung die Verschlüsselung der Festplatte nicht umgangen werden kann.
  5. Die Lösung muss auf der Verschlüsselung durch das Betriebssystem aufsetzen (LUKS).
  6. Ein automatisch autorisierte Entschlüsselung soll möglich sein. (Zum Beispiel, solange ein Freigabeserver erreichbar ist)

Abgrenzungskriterien

  1. Das Ver- und Entschlüsseln beliebiger (insbesondere Wechsel-)Datenträger ist nicht vorgesehen. Das wird mit den üblichen Funktionen des Betriebssystems (CLI oder GUI) bearbeitet.

Recherche

Der Standardansatz ist:

  • Packe einen SSH-Server ins initramfs.
  • Beim Booten wird dieser SSH-Server gestartet.
  • Der Administrator verbindet sich mit dem SSH-Server im initramfs und gibt die Passphrase zur Entschlüsselung ein.
  • Das System wird vom entschlüsselten Datenträger gestartet.

Quellen die ich dazu gefunden habe sind:

Bemerkenswert und merkwürdig finde ich, dass ich keine Vorgehensweise in der Server-Dokumentation von Canonical (abgerufen am 2024-03-28) gefunden habe.

Etwas versteckter ist Mandos zu finden. Es ist in Ubuntu seit 2009 und in Debian seit 2011 zu finden. Merkwürdig ist allerdings, dass kaum Sekundärquellen oder Howtos zu finden sind. Ich habe nur Booting an unattended / headless full disk encrypted server – Ubuntu server 16.04 setup (abgerufen am 2024-03-28) gefunden.

Mandos scheint meine Anforderungen gut abzudecken. Etwas irritiert mich der Verweis auf Systemd in der Mandos Einführung (abgerufen am 2024-03-28). Stark irritieren mich die Verweise auf “The Man”. Prinzipiell gilt das aber auch für normale Diebe.

Noch länger habe ich gebraucht um Network-based Disk Encryption (NBDE) (abgerufen am 2024-03-29) zu finden. Es kommt von Redhat. Hierfür gibt es aber einiges an Information, wenn man danach sucht:

Testaufbauten

Vor der weiteren Untersuchung der Lösungen, ist es sinnvoll sich erst einmal einen Eindruck von den Lösungen zu verschaffen und Erfahrungen damit zu sammeln. Schön wäre es den Testaufbau mit Vagrant einzurichten, aber ich habe auf die Schnelle keine Lösung für das Einrichten eines verschlüsselten Diskimages gefunden. Per Hand mit VirtualBox geht es aber auch recht flott…

Testaufbau mit virtuellen Maschinen

Der Testablauf besteht aus den Schritten:

  1. Freigabe-Server einrichten
  2. Client mit Ubuntu-Server 22.04 und Freigabe-Client einrichten, Reboot
  3. Client mit Ubuntu-Server 20.04 und Freigabe-Client einrichten, Reboot
    1. System auf 22.04 upgraden (ohne explizit updateramfs aufzurufen), Reboot
    2. Eventuell updateramfs aufrufen
  4. Client mit Debian 12 und Freigabe-Client einrichten, Reboot

Mandos

Der Test mit Mandos besteht aus den folgenden Schritten:

  1. Auf dem Freigabe-Server Mandos mit sudo apt install mandos installieren. Das gibt zwar eine Meldung, dass keine Client-Konfiguration existiert. Das werden wir aber noch nachholen.
  2. Auf dem Freigabe-Client den Mandos-Client mit sudo apt install mandos-client installieren.
  3. Auf dem Freigabe-Client sudo mandos-keygen --password --type RSA --force > client.txt aufrufen.
  4. Die Datei client.txt mit scp client.txt <user>@<mandos-server>:~ auf den Mandos-Server kopieren.
  5. Auf dem Mandos-Server als root client.txt mit cat client.txt >>/etc/mandos/clients.conf an die Konfigurationsdatei anhängen.
  6. Den Mandos-Service mit sudo systemctl restart mandos neu starten.
  7. Den Mandos-Client rebooten.

Hat man 2. bis 7. für jeden Client-Rechner ausgeführt, sollten alle Clients ohne die Eingabe der Freigabe-Passphrase booten. Alternativ kann man auch die Passphrase direkt in der Konsole eingeben, wenn zum Beispiel der Mandos-Server nicht läuft.

Der Test hat mit Ubuntu-Server 22.04 (Jammy Jellyfish) und Debian 12 (Bookwork) einwandfrei funktioniert. Mit Ubuntu-Server 20.04 (Focal Fossa) hat es nicht funktioniert. Es fehlt setsid im initramfs. Der Fehler ist bekannt. Ich habe keine weiteren Reparaturversuche unternommen. Focal Fossa ist mir zu alt. Dummerweise habe ich den Mandos-Client auch nach einem do-release-upgrade nicht zum Laufen bekommen.

NBDE

Der Test mit NBDE besteht aus den folgenden Schritten:

  1. Auf dem Freigabe-Server Tang mit sudo apt install tang jose installieren und den Dienst mit sudo systemctl enable tangd.socket und sudo systemctl start tangd.socket starten.
  2. Auf dem Freigabe-Client den Mandos-Client mit sudo apt install clevis clevis-luks clevis-initramfs installieren.
  3. Den Tang-Server als Freigabequelle mit sudo clevis luks bind tang -d /dev/<partition> '{"url":"http://<ip address>"}' hinzufügen. Dabei sollte man die Signatur des Servers überprüfen und danach bestätigen.
  4. Den Mandos-Client rebooten.

Hat man 2. bis 4. für jeden Client-Rechner ausgeführt, sollten alle Clients ohne die Eingabe der Freigabe-Passphrase booten. Alternativ kann man auch die Passphrase direkt in der Konsole eingeben, wenn zum Beispiel der Tang-Server nicht läuft.

Der Test hat mit Ubuntu-Server 22.04 (Jammy Jellyfish) und Debian 12 (Bookwork) einwandfrei funktioniert. Mit Ubuntu-Server 20.04 (Focal Fossa) hat es ebenfalls funktioniert. Auch nach einem do-release-upgrade auf Jammy Jellyfish läuft das System weiter.

Fazit

Mandos funktioniert mit den aktuellen Versionen von Debian und Ubuntu gut. Das Scheitern mit Focal Fossa löst allerdings Zweifel aus.

NBDE ist einfach aufzusetzen und wirkt sehr stabil. Es funktioniert wie erwartet. Ein großer Vorteil ist, dass Redhat hinter dem System steht. Der Nachteil ist, dass keine Möglichkeit vorgesehen ist, einen Freigabe-Client (temporär) auszuschließen. Bringt ein Angreifer eine Maschine unter seine Kontrolle, modifiziert das initramfs und startet die Maschine in Netzwerk neu, so wird der Datenträger entschlüsselt. Hier punktet Mandos mit seiner Überwachung der Freigabe-Clients und der Möglichkeit einzelne Freigabe-Clients (temporär) zu sperren.


  1. Ist etwas Angeberei. Eigentlich ist nur ein Schrank mit dem Server gemeint. ↩︎

Das könnte Sie auch interessieren