ADMIN

2022

10

2022-09-29T12:00:00

Datensicherheit

SCHWERPUNKT

099

Datensicherheit

Verschlüsselung

Cloud

Clevis und Tang

Unter Verschluss

von Andreas Stolzenberger

Veröffentlicht in Ausgabe 10/2022 - SCHWERPUNKT

Wer Server sicher in der Cloud betreiben möchte, muss nicht auf den Cloudanbieter vertrauen. Vielmehr lassen sich die Platten der virtuellen Maschinen in Eigenregie verschlüsseln. Die "Network Bound Disk Encryption" mit Clevis & Tang hilft Ihnen dabei.

Unternehmen müssen verhindern, dass sensitive Daten in die falschen Hände geraten, gerade auch bei der Migration wichtiger Dienste in Cloudumgebungen. Doch stellt dies Administratoren vor eine Reihe von Problemen. Anders als im lokalen Rechenzentrum besteht hier kein genauer Einblick, was Cloudbetreiber mit virtuellen Disk-Images anstellen, nachdem der Kunde die zugehörige VM gelöscht hat. Also führt kein Weg an einer softwarebasierten Fulldisk- oder Partitionsverschlüsselung vorbei.
Für den Zugriff auf eine vollverschlüsselte Disk muss der Verwalter beim Systemstart an der Konsole dann das Passwort eingeben. Um diesen manuellen Eingriff zu vermeiden, gibt es mehrere automatisierte Ansätze: Ein zentraler Schlüsselserver (Key Escrow) kann die Plattenpasswörter mehrerer Server verwalten und den bootenden Servern übergeben. Dieses Verfahren erzeugt jedoch einen erheblichen Verwaltungsaufwand mit einem komplizierten Schlüssel-, Zugriffs- und Zertifikatsmanagement. Es gibt aber auch eine vergleichsweise simple Lösung: Die sogenannte "Network- bound Disk Encryption" (NBDE) mit den Open-Source-Tools "Clevis & Tang". Ins Deutsche übersetzt stehen "clevis and tang" für ein "Kurbelgelenk", wobei die beiden Teile "Gabelkopf" und "Griffzapfen" mit einem Bolzen, dem "Pin", zusammengehalten werden.
Bei der NBDE sorgt ein Serverdienst in einem als sicher eingestuften Netzwerk dafür, dass die angebundenen Clients automatisiert ihren Decryption Key erhalten – genauer gesagt, diesen errechnen können. Der "Tang"-Dienst [1] speichert dabei, anders als ein "Key Escrow", selbst keine Clientschlüssel und bekommt auch nie ein Diskpasswort zu Gesicht. Der Großteil der Prozedur erfolgt direkt auf dem Server mit der verschlüsselten Platte via Clevis.
Unternehmen müssen verhindern, dass sensitive Daten in die falschen Hände geraten, gerade auch bei der Migration wichtiger Dienste in Cloudumgebungen. Doch stellt dies Administratoren vor eine Reihe von Problemen. Anders als im lokalen Rechenzentrum besteht hier kein genauer Einblick, was Cloudbetreiber mit virtuellen Disk-Images anstellen, nachdem der Kunde die zugehörige VM gelöscht hat. Also führt kein Weg an einer softwarebasierten Fulldisk- oder Partitionsverschlüsselung vorbei.
Für den Zugriff auf eine vollverschlüsselte Disk muss der Verwalter beim Systemstart an der Konsole dann das Passwort eingeben. Um diesen manuellen Eingriff zu vermeiden, gibt es mehrere automatisierte Ansätze: Ein zentraler Schlüsselserver (Key Escrow) kann die Plattenpasswörter mehrerer Server verwalten und den bootenden Servern übergeben. Dieses Verfahren erzeugt jedoch einen erheblichen Verwaltungsaufwand mit einem komplizierten Schlüssel-, Zugriffs- und Zertifikatsmanagement. Es gibt aber auch eine vergleichsweise simple Lösung: Die sogenannte "Network- bound Disk Encryption" (NBDE) mit den Open-Source-Tools "Clevis & Tang". Ins Deutsche übersetzt stehen "clevis and tang" für ein "Kurbelgelenk", wobei die beiden Teile "Gabelkopf" und "Griffzapfen" mit einem Bolzen, dem "Pin", zusammengehalten werden.
Bei der NBDE sorgt ein Serverdienst in einem als sicher eingestuften Netzwerk dafür, dass die angebundenen Clients automatisiert ihren Decryption Key erhalten – genauer gesagt, diesen errechnen können. Der "Tang"-Dienst [1] speichert dabei, anders als ein "Key Escrow", selbst keine Clientschlüssel und bekommt auch nie ein Diskpasswort zu Gesicht. Der Großteil der Prozedur erfolgt direkt auf dem Server mit der verschlüsselten Platte via Clevis.
Das Tool generiert zunächst ein zufälliges Passwort – den Pin, mit dem es eine mit Luks verschlüsselte Platte entsperren kann. Dieses Passwort wiederum verschlüsselt Clevis mit einem Key, den es vom Tang-Server erhält und löscht dann das Original. Beim Systemstart fragt Clevis [2] den Schlüssel vom Tang-Server via einem simplen "http get" ab, rekonstruiert daraus den Pin und entriegelt damit das Laufwerk. Möchte der Administrator das Cloudsetup sicher entsorgen, vernichtet er den Tang-Schlüssel, worauf die angebundenen Clevis-Clients ihr Passwort nicht wiederherstellen und das Luks- Laufwerk somit auch nicht mehr entsperren können.
Linux Unified Key Setup
Das "Linux Unified Key Setup" (Luks) ist die Standardtechnologie auf Linux-Systemen, um Platten oder Partitionen zu verschlüsseln. Luks setzt im Disk-Manager-Stack zwischen Volume-Management und Dateisystem an. Es arbeitet damit mit allen gängigen Dateisystemen wie xfs, ext4 oder auch btrfs. Luks kann mit ein wenig Aufwand bestehende Datenträger nachträglich verschlüsseln. Viel häufiger jedoch legen Administratoren direkt bei der OS-Installation ihre Laufwerke samt Verschlüsselung an. Luks verwaltet pro verschlüsseltem Datenträger bis zu acht Keys, die das Laufwerk entsperren können. Das Tool unterstützt dabei Plug-ins wie Clevis oder auch Key-Escrow-Lösungen.
Der Ablauf, um die Diskverschlüsselung vollautomatisch auf einem Cloudsystem einzurichten, ist dabei relativ einfach. Sie erstellen zunächst ein passendes OS-Template (Fedora/RHEL/EL) mit einer verschlüsselten Disk, das Sie in die jeweilige Cloud hochladen. Die Installation erfolgt interaktiv oder auch automatisiert via Kickstart-File. Das enthält im Abschnitt der Plattenpartitionierung die Angaben für die Verschlüsselung:
part /boot --fstype=ext4 --size=1024
part / --fstype=xfs --size=xxx
     --encrypted
     --passphrase=TemporaryPassword
Passend dazu erhält das Setup eine Datei namens "/etc/crypttab", die auf eine Datei mit dem Passwort verweist:
root /dev/vda2/boot/temp_password.txt
Diese muss natürlich außerhalb des verschlüsselten Datenträgers lagern, wie beispielsweise unter "/boot/". Das funktioniert für Debian/Ubuntu-basierte Systeme nach dem selben Schema.
Natürlich ist die Diskverschlüsselung wertlos, solange das Passwort im Klartext auf einem unverschlüsselten Datenträger liegt. Dieses Setup ist jedoch nur vorübergehend, damit der Server überhaupt ohne Benutzeraktion, aber mit verschlüsseltem Root-Laufwerk starten kann. Sobald Sie einen Cloudserver aus der Vorlage klonen und zum ersten Mal in der Cloud starten, richten Sie via Clevis den zuvor bereitgestellten Tang-Server als zweiten Luks-Key ein. Doch zuerst braucht es einen Tang- Server.
Tang installieren
Der Tang-Server lässt sich binnen weniger Minuten aufsetzen. Eine Mini-VM mit dem Minimal-OS-Setup genügt völlig. Bei einem Cloudsetup beispielsweise auf AWS oder GCP bekommt der Tang-Server keine externe IP-Adresse, die interne am virtuellen Cloudswitch genügt und verhindert, dass Außenstehende Zugriff erhalten. Auf einem Fedora/RHEL/EtSystem installieren Sie Tang schlicht mit dnf install tang -y.
Normalerweise belegt Tang den Port 80. Falls Sie den Tang-Server auch für andere Webdienste verwenden, können Sie den Port über den Dienst-Socket ändern:
systemctl enable tangd.socket
systemctl edit tangd.socket
Im Editor geben Sie nun diese Zeilen ein:
[Socket]
ListenStream=
ListenStream=7500
Natürlich müssen Sie dementsprechend auch den Port 7500 in der Firewall freischalten und bei selinux anmelden:
semanage port -a -t tangd_port_t -p tcp 7500
firewall-cmd --permanent --zone=public --add-port=7500/tcp
firewall-cmd --reload
dann laden Sie den Dienst neu und prüfen den Port:
systemctl daemon-reload
systemctl restart tangd.socket
systemctl show tangd.socket -p Listen
Nun gibt Tang seinen Key auf Anfrage aus mittels tang-show-keys 7500.
Bild 1: Der Speichermanager der Web-UI Cockpit zeigt an, dass es zum verschlüsselten Laufwerk aktuell nur einen Key in der Form eines Passworts gibt.
Clevis konfigurieren
Nachdem der Tang-Server läuft und einen Schlüssel bereitstellt, können die Clients die Luks-Entschlüsselung vom temporären Installations-Key auf den Tang-Server umstellen. Im oben aufgeführten Beispiel mit dem verschlüsselten Root-Laufwerk auf "/dev/vda2" können Sie zunächst das aktuelle Luks-Setup abrufen:
cryptsetup luksDump /dev/vda2
Der Dump listet dabei nur einen Keyslot "0: luks" auf. Im nächsten Schritt fügen Sie den Tang-Server als zweiten Schlüssel himzu:
clevis luks bind -d /dev/vda2 tang '{"url":"Tang-Server-IPAdresse:7500"}'
Clevis wird dann den Signing-Key des Tang-Servers anzeigen und den Anwender fragen, ob er diesem vertraut. Im Anschluss muss der Adminstrator das aktuelle, temporäre Luks-Passwort eingeben. Clevis installiert nun die Tang-Verbindung im zweiten Keyslot. Führen Sie anschließend erneut den Luks-Dump aus, sind zwei Keyslots belegt und Luks listet zudem das Token auf:
Tokens:
     0: clevis
     Keyslot: 1
Bevor sie den Server neu starten, müssen Sie noch die Bootprozedur anpassen. Wenn Linux das System startet, lädt es vom unverschlüsselten "/boot"-Laufwerk den Systemkern und die initiale Ramdisk "initrd". Diese enthält alle nötigen Treiber, sodass der Kernel auf das Root-Filesystem zugreifen und von dort den Systemstart fortsetzen kann. Luks muss daher bereits in der Initrd-Phase den Tang-Server über das Netzwerk kontaktieren und das Root- Dateisystem entriegeln. Dazu muss der Anwender die passenden Anweisungen und Tools in die "initrd"-Datei einfügen:
dnf install clevis-dracut
grubby --update-kernel=ALL --args="rd.neednet=1"
dracut -fv --regenerate-all
Das Paket "Clevis-Dracut" enthält die nötigen Werkzeuge und Binaries für den Bootprozess. Der Kernelparamter "rd. neednet=1" weist den Kern an, das Netzwerk bereits in der inintrd-Phase zu starten, und Dracut erstellt und installiert ein neues "initrd"-File. Bei einem künftigen Kernel-Update wird sich Dracut an die angepasste Konfiguration erinnern und automatisch eine passende "initrd" bauen. Sie müssen den Prozess nicht manuell nach einem Kernelupdate wiederholen.
Sollten Sie mehrere verschlüsselte Disks an dem Server betreiben, die nicht alle unmittelbar beim Systemstart gemounted werden, aktivieren Sie zudem den Clevis-Dienst:
systemctl enable clevis-luks-askpass.path
Dieser überwacht den Zugriff auf verschlüsselte Datenträger und entsperrt sie bei Bedarf via Tang. Ohne diesen Dienst greift Clevis nur in der Phase des Systemstarts ein. Beim folgenden Neustart wird Luks zwar kurz die Aufforderung zur Schlüsseleingabe auf der Konsole anzeigen, dann aber den Tang-Key via LAN erhalten, das Laufwerk entsperren und den Systemstart fortsetzen. Abschließend ändern Sie das temporäre Luks-Passwort mit
cryptsetup luksChangeKey /dev/vda2 -s 0
und prüfen die "crypttab"-Datei, sodass am Ende der Zeile an der Stelle des Pfads zur Passwort-Datei nur noch "none" steht. Jetzt wird der Server die Platte automatisch entsperren, solange er den Tang- Server erreichen kann. Sie können alternativ die Root-Platte manuell mit dem neuen Passwort entriegeln, auch ohne Tang. Natürlich lässst sich das Plattenpasswort auch entfernen:
cryptsetup luksRemoveKey /dev/vda2 -s 0
Dann funktioniert der Server aber nur und ausschließlich in Verbindung mit dem Tang-System.
Bild 2: Das Platten-Passwort für die Installation ist nur temporär. Der Administrator ersetzt es später durch die Verbindung zum Tang-Server.
Schlüssel rotieren
Wenn der Tang-Server langfristig läuft, sollten Sie regelmäßig die Schlüssel tauschen. Auf dem Tang-Server finden Sie die Schlüsseldateien im Verzeichnis "/var/ db/tang". Benenen Sie die Dateien so um, dass sie einem Punkt am Anfang des Namens haben und erstellen Sie neue Schlüssel mit
/usr/libexec/tangd-keygen/var/db/tang
Dadurch bleiben die alten Schlüssel vorerst erhalten, aber nur die neuen werden für künftige Luks-Verschlüsselungen zur Verfügung gestellt. Auf den bestehenden Clients können Sie dann die Schlüssel umstellen. Im Testsetup nutzen wir "/dev/ vda2" als verschlüsselte Root-Disk mit dem Tang-Token im Luks-Slot 1. Das Kommando lautet also:
clevis luks report -d /dev/vda2 -s 1
Das erkennt die geänderten Schlüssel und kann automatisch die Konfiguration umstellen. Ansonsten nutzen Sie
clevis luks regen -q -d /dev/vda2 -s 1
Sobald alle angebundenen Systeme auf die neuen Schlüssel umgestellt wurden, können Sie die alten Schlüssel entfernen. Die komplette Prozedur des Tang-Setups und des Schlüsselmanagements läßt sich via Ansible automatisieren. Dazu gibt es eine Reihe von Ansible System Roles [3, 4], die auf Github dokumentiert sind.
Fazit
Dank Clevis & Tang können Sie mit vergleichsweise geringem Aufwand Ihre Clouds komplett mit verschlüsselten Disks betreiben. Am Laufzeitende eines Cloudsetups genügt es dann, die Tang-Schlüssel und/oder den Tang-Server zu entsorgen. Ein Zugriff auf die Platten der Cloudserver ist dann nicht mehr oder nur noch mit dem Admin-Passwort möglich.
(dr)
Link-Codes