Hallo, ich versuche, eine sekundäre Datenfestplatte zu verschlüsseln. Ich möchte, dass diese Platte beim Booten meines Rechners entschlüsselt wird. Ich habe derzeit ein RAID-Setup mit einem darüber liegenden LVM-Volume, das bereits mit LUKS verschlüsselt ist.
Ich habe einen Befehl wie diesen ausgeführt: sudo clevis luks bind -d /dev/RaidVG/LVMVol tpm2 '{"pcr_ids":"15", "pcr_bank":"sha256"}'
So wie ich es verstehe, füge ich meinem LUKS-Header einen Schlüsselslot hinzu, der an mein TPM2.0-Modul in PCR-Bank 15 gebunden ist. Das scheint zu funktionieren, aber was ich nicht verstehe, ist, was passiert, wenn ich „tpm2_pcrread“ ausführe. Es heißt, dass mein PCR-„Wert“ immer noch 0 ist:
$ sudo tpm2_pcrread
sha1:
sha256:
0 : 0xREDACTED
1 : 0xREDACTED
2 : 0xREDACTED
3 : 0xREDACTED
4 : 0xREDACTED
5 : 0xREDACTED
6 : 0xREDACTED
7 : 0xREDACTED
8 : 0x0000000000000000000000000000000000000000000000000000000000000000
9 : 0x0000000000000000000000000000000000000000000000000000000000000000
10: 0x0000000000000000000000000000000000000000000000000000000000000000
11: 0x0000000000000000000000000000000000000000000000000000000000000000
12: 0x0000000000000000000000000000000000000000000000000000000000000000
13: 0x0000000000000000000000000000000000000000000000000000000000000000
14: 0x0000000000000000000000000000000000000000000000000000000000000000
15: 0x0000000000000000000000000000000000000000000000000000000000000000
16: 0x0000000000000000000000000000000000000000000000000000000000000000
17: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
18: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
19: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
20: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
21: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
22: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
23: 0x0000000000000000000000000000000000000000000000000000000000000000
sha384:
sha512:
Was genau bedeuten diese PCR-Werte? Ich kann online keine Antwort darauf finden. Sollten sich diese Werte nicht ändern, nachdem ich irgendetwas mit meiner PCR-Bank mache?
Eine weitere Besonderheit ist, dass wenn ich eine einfache Hallo-Welt-Datei gemäß diesem Tutorial verschlüssele (https://www.fit-pc.com/wiki/index.php?title=Linux:_Full_Disk_Encryption), erhalte ich genau dieselbe verschlüsselte Ausgabe „eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI“. Jetzt wird nicht die gesamte Ausgabe angezeigt, die sie erhalten, sondern nur die erste Zeile. Liegt das daran, dass ich einige Standardschlüssel eingerichtet habe? Oder ist das eine Art gemeinsamer Header? Mein TPM-Modul ist virtualisiert, das könnte also auch ein Problem sein.
Ich hoffe, dass mir jemand etwas genauer erklären kann, wie das eigentlich funktioniert und wie ich mein Verschlüsselungsschema sicher einrichte.
Antwort1
So wie ich es verstehe, füge ich meinem LUKS-Header einen Schlüsselslot hinzu, der an mein TPM2.0-Modul in PCR-Bank 15 gebunden ist. Das scheint zu funktionieren, aber was ich nicht verstehe, ist, was passiert, wenn ich „tpm2_pcrread“ ausführe. Es heißt, dass mein PCR-„Wert“ immer noch 0 ist:
Das Binden von Daten an einen PCR soll den PCR nicht verändern – es verwendet das TPM, um Daten auf eine Weise zu verschlüsseln, die dasaktuellPCR-Wert. Im Allgemeinen bedeutet dies, dass Sie einen PCR wählen sollten, dessen Wert eine sinnvolle Bedeutung hat (z. B. verwendet Windows BitLocker PCR 7, das den aktuellen Secure Boot-Status beibehält). Die Verwendung eines PCR, der nur aus Nullen besteht, bindet die verschlüsselten Daten (d. h. den LUKS-Schlüsselslot) immer noch an das TPM selbst, hindert aber niemanden daran, eine Live-CD zu booten und das TPM einfach zu bitten, die Daten für ihn zu entsiegeln.
Was genau bedeuten diese PCR-Werte? Im Internet kann ich dazu keine Antwort finden.
Jede PCR entspricht einerHash-Ketteerzeugt durch Ereignisse im TPM-Ereignisprotokoll. Jedes Mal, wenn ein Ereignis protokolliert wird, wird ein entsprechender PCR aktualisiert (oder „erweitert“, da der Aktualisierungsprozess pcr = hash(pcr + new_event)
sehr ähnlich ist wie die Funktionsweise von Git-Commits).
Die Basisereignisse sind in TCG-Spezifikationen dokumentiert; tpm2_eventlog
sie können zeigen, was während des aktuellen Startvorgangs protokolliert wird. PCR 4 enthält beispielsweise die genauen Hashes jeder .efi-ausführbaren Datei, die während des Startvorgangs gestartet wurde. (Praktisch alle Standard-PCRs sind irgendwie mit dem Startvorgang verknüpft.) Die meisten Ereignisse werden von der Firmware protokolliert, einige jedoch vom Bootloader; das Betriebssystem könnte dies tun, tut es aber normalerweise nicht.
Mit anderen Worten: Die Überprüfung, ob ein PCR einen erwarteten Wert enthält, ist lediglich eine Abkürzung für die Überprüfung, ob das Ereignisprotokoll die erwarteten Ereignisse in der erwarteten Reihenfolge enthält.
Beispielsweise versiegelt BitLocker einen Schlüsselsteckplatz (oder einen „Beschützer“) mithilfe von PCR7 oder PCR4, um sicherzustellen, dass eine automatische Entsperrung nur beim Booten der eigentlichen Windows-Installation möglich ist (also eines Systems, das die Sicherheit von Benutzerkonten respektiert, und nicht einer Live-CD).
Sollten sich diese Werte nicht ändern, nachdem ich irgendetwas mit meiner PCR-Bank mache?
Nein, die Werte verändern sich allein durch das Auslesen nicht.
Der Vorgang „Versiegeln“ fordert das TPM auf, die bereitgestellten Daten zu verschlüsseln und die Richtlinie „Nur entschlüsseln, wenn PCR 15 diesem Wert entspricht“ anzufügen. Der PCR selbst wird dadurch nicht geändert. Die versiegelten Daten werden an das Betriebssystem zurückgegeben (um in einer Datei oder in einem LUKS-Token usw. gespeichert zu werden).
Eine weitere Besonderheit ist, dass wenn ich eine einfache Hallo-Welt-Datei gemäß diesem Tutorial verschlüssele (https://www.fit-pc.com/wiki/index.php?title=Linux:_Full_Disk_Encryption), erhalte ich genau dieselbe verschlüsselte Ausgabe „eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI“.
Das sind Base64-kodierte Daten. Wenn Sie sie dekodieren, werden Sie sehen, dass sie einen festen Header enthalten:
$ echo eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI | base64 -d
{"alg":"dir","clevis":{"pin":"tpm2","tpm2":{"hash":"sha2