Sicherheitsmodell

Diese Seite ist die Kurzfassung der verbindlichen Spezifikation. Sie nennt auch die Grenzen — ein Sicherheitsmodell, das nur Zusicherungen aufzählt, ist Werbung.

Schlüsselhierarchie

Wer öffnet was
Vault Key (VK)      32 Byte, zufällig. Nur im RAM und im OS-Keystore.
  ├─ wrap_gerät     = seal(VK, öffentlicher X25519-Schlüssel)   liegt am Server
  └─ wrap_recovery  = XChaCha20-Poly1305(VK, Schlüssel aus dem Recovery-Code)

Record Key (RK)     = HKDF(VK, epoch)   — pro Epoch neu, nie wiederverwendet

Pro Gerät zwei Schlüsselpaare, beide im Secure Storage des Betriebssystems:

PaarZweck
X25519Entschlüsselung des gewrappten Vault Key
Ed25519Authentifizierung gegenüber dem Server

Datensätze

Jeder Record wird einzeln mit XChaCha20-Poly1305 verschlüsselt. Die zusätzlich authentifizierten Daten binden ihn an ID, Typ und Epoch:

Bindung an die Metadaten
aad = id ‖ 0x00 ‖ type ‖ 0x00 ‖ u64be(epoch)

Beim Öffnen wird sie aus den gespeicherten Metadaten neu gebildet und muss stimmen. Damit lässt sich ein Ciphertext nicht unter einer anderen ID, einem anderen Typ oder einer anderen Epoch unterschieben.

Nonces sind immer zufällig, nie ein Zähler. Bei 192 Bit ist die Kollisionswahrscheinlichkeit vernachlässigbar — und ein Zähler ohne dauerhaft persistierten Stand wäre nach einem Absturz genau der Fehler, der diese Konstruktion kaputt macht.

Anmeldung ohne Passwort

Der Server stellt eine einmalige Challenge aus, das Gerät signiert sie mit seinem Ed25519-Schlüssel:

Signaturkontext
msg = "tessera-auth-v1" ‖ 0x00 ‖ device_id ‖ 0x00 ‖ nonce

Der Kontextpräfix ist Pflicht. Ohne ihn wäre eine Signatur über dieselben Bytes aus einem anderen System — etwa einem SSH-Agenten mit demselben Schlüssel — hier gültig.

Autorisierung

Was der Server im Klartext sieht

FeldWarum
typeOhne ihn kein typbezogener Delta-Sync
idPrimärschlüssel
epochKonsistenzprüfung der Rotation
hlcKonfliktauflösung
seqDelta-Sync
GerätenameAnzeige in der Geräteliste
ZeitstempelAufräumlauf, letzter Kontakt

Daraus lässt sich ablesen, wie viele Hosts, Snippets und Schlüssel es gibt und wann sie zuletzt geändert wurden. Nicht, welche. Wer auch das verbergen will, müsste den Typ mitverschlüsseln und immer den vollen Vault ziehen — eine bewusst nicht getroffene Entscheidung.

Ehrliche Grenzen

  • Kein verlässliches Zeroize. Die verwendete Laufzeitumgebung bietet keine Garantie, dass Schlüsselmaterial im RAM überschrieben wird. Gegen einen Speicherabzug auf einem bereits kompromittierten Gerät ist nichts geschützt.
  • Ein entzogenes Gerät behält die Vergangenheit. Es kennt den alten Vault Key und kann alte Ciphertexte weiterhin öffnen. Nur neue Daten bleiben ihm verschlossen.
  • Metadaten sind nicht verborgen. Siehe die Tabelle oben.
  • Der Wiederherstellungscode ist ein Generalschlüssel. Wer ihn hat, hat den Vault. Er gehört nicht in dieselbe Schublade wie das Notebook.

Sicherheit auf der SSH-Ebene

Sicherheit auf der Remote-Desktop-Ebene

Ein Windows-Rechner im eigenen Netz zeigt fast immer ein selbstsigniertes Zertifikat vor. Eine Kettenprüfung schlüge dort jedes Mal fehl — und ein Client, der daraufhin einfach alles annimmt, hat eine verschlüsselte Verbindung zu einem Unbekannten und merkt es nie.

tessera macht es deshalb genau wie bei SSH-Host-Schlüsseln, und zwar mit demselben Code und derselben Tabelle: Die Kette wird nicht geprüft, dafür wird der SHA-256-Fingerabdruck des vorgezeigten Zertifikats gemerkt. Beim ersten Mal steht er im Dialog zum Vergleichen; ändert er sich später, bricht die Verbindung ab. Es gibt kein „trotzdem verbinden“. Der Warnhinweis stellt beide Fingerabdrücke nebeneinander und lässt den gemerkten durch den neuen ersetzen — das ersetzt aber nur den Eintrag, nicht die Verbindung: Der nächste Versuch ist ein eigener Klick.

Versionierung der Konstruktionen

Jeder Kontextstring trägt eine Version — tessera-seal-v1, tessera-record-v1, tessera-auth-v1, tessera-sas-v1 und so weiter. Eine Änderung an einer Konstruktion bekommt eine neue Version, und der Client muss beide lesen können, bis alle Geräte migriert sind. Ein stiller Wechsel bei gleichbleibender Kennung wäre ein Datenverlust mit Ansage.